8000 Created API and Oauth classes · factorlibre/wc-api-python@13c15ac · GitHub
[go: up one dir, main page]

Skip to content

Commit 13c15ac

Browse files
Created API and Oauth classes
1 parent dd156ca commit 13c15ac

File tree

5 files changed

+195
-81
lines changed

5 files changed

+195
-81
lines changed

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
oauthlib==0.7.2
21
requests==2.7.0

test.py

Lines changed: 0 additions & 14 deletions
This file was deleted.

woocommerce/__init__.py

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,17 @@
11
# -*- coding: utf-8 -*-
22

33
"""
4-
woocommerce-api
4+
woocommerce
55
~~~~~~~~~~~~~~~
66
A Python wrapper for WooCommerce API.
77
88
:copyright: (c) 2015 by WooThemes.
99
:license: MIT, see LICENSE for details.
1010
"""
1111

12-
__title__ = "woocommerce-api"
12+
__title__ = "woocommerce"
1313
__version__ = "1.0.0"
1414
__author__ = "Claudio Sanches @ WooThemes"
1515
__license__ = "MIT"
1616

17-
import re
18-
import requests
19-
from oauthlib.oauth1 import Client as oAuth1
20-
21-
22-
class WooCommerce(object):
23-
""" API Class """
24-
def __init__(self, url, consumer_key, consumer_secret, **kwargs):
25-
self.url = url
26-
self.consumer_key = consumer_key
27-
self.consumer_secret = consumer_secret
28-
self.version = kwargs.get("version", "v3")
29-
self.is_ssl = self.__is_ssl()
30-
self.verify_ssl = kwargs.get("verify_ssl", True)
31-
32-
def __is_ssl(self):
33-
""" Check if url use HTTPS """
34-
return re.match(r"^https", self.url) is not None
35-
36-
def __get_url(self, endpoint):
37-
""" Get URL for requests """
38-
url = self.url
39-
40-
if re.match(r".*(/)$", self.url) is None:
41-
url += "/"
42-
43-
return url + 'wc-api/' + self.version + '/' + endpoint
44-
45-
def __request(self, method, endpoint, data):
46-
""" Do requests """
47-
url = self.__get_url(endpoint)
48-
49-
if self.is_ssl is True:
50-
auth = (self.consumer_key, self.consumer_secret)
51-
else:
52-
auth = oAuth1(
53-
client_key=self.consumer_key,
54-
client_secret=self.consumer_secret
55-
).sign(url, method)
56-
print auth
57-
58-
return requests.request(
59-
method=method,
60-
url=url,
61-
verify=self.verify_ssl,
62-
auth=auth,
63-
data=data
64-
).json()
65-
66-
def get(self, endpoint):
67-
""" Get requests """
68-
return self.__request("GET", endpoint, None)
69-
70-
def post(self, endpoint, data):
71-
""" POST requests """
72-
return self.__request("POST", endpoint, data)
73-
74-
def put(self, endpoint, data):
75-
""" PUT requests """
76-
return self.__request("PUT", endpoint, data)
77-
78-
def delete(self, endpoint):
79-
""" DELETE requests """
80-
return self.__request("DELETE", endpoint, None)
17+
from woocommerce.api import API as WooCommerce

woocommerce/api.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
WooCommerce API Class
5+
"""
6+
7+
__title__ = "woocommerce-api"
8+
__version__ = "1.0.0"
9+
__author__ = "Claudio Sanches @ WooThemes"
10+
__license__ = "MIT"
11+
12+
import requests
13+
from woocommerce.oauth import OAuth
14+
15+
16+
class API(object):
17+
""" API Class """
18+
19+
def __init__(self, url, consumer_key, consumer_secret, **kwargs):
20+
self.url = url
21+
self.consumer_key = consumer_key
22+
self.consumer_secret = consumer_secret
23+
self.version = kwargs.get("version", "v3")
24+
self.is_ssl = self.__is_ssl()
25+
self.verify_ssl = kwargs.get("verify_ssl", True)
26+
27+
def __is_ssl(self):
28+
""" Check if url use HTTPS """
29+
return self.url.startswith("https")
30+
31+
def __get_url(self, endpoint):
32+
""" Get URL for requests """
33+
url = self.url
34+
35+
if self.url.endswith('/') is False:
36+
url = "%s/" % url
37+
38+
return "%swc-api/%s/%s" % (url, self.version, endpoint)
39+
40+
def __get_oauth_url(self, url, method):
41+
""" Generate oAuth1.0a URL """
42+
oauth = OAuth(
43+
url=url,
44+
consumer_key=self.consumer_key,
45+
consumer_secret=self.consumer_secret,
46+
version=self.version,
47+
method=method
48+
)
49+
50+
return oauth.get_oauth_url()
51+
52+
def __request(self, method, endpoint, data):
53+
""" Do requests """
54+
url = self.__get_url(endpoint)
55+
auth = None
56+
headers = {
57+
"user-agent": "WooCommerce API Client-Node.js/%s" % __version__,
58+
"content-type": "application/json",
59+
"accept": "application/json"
60+
}
61+
62+
if self.is_ssl is True:
63+
auth = (self.consumer_key, self.consumer_secret)
64+
else:
65+
url = self.__get_oauth_url(url, method)
66+
67+
return requests.request(
68+
method=method,
69+
url=url,
70+
verify=self.verify_ssl,
71+
auth=auth,
72+
data=data,
73+
headers=headers
74+
).json()
75+
76+
def get(self, endpoint):
77+
""" Get requests """
78+
return self.__request("GET", endpoint, None)
79+
80+
def post(self, endpoint, data):
81+
""" POST requests """
82+
return self.__request("POST", endpoint, data)
83+
84+
def put(self, endpoint, data):
85+
""" PUT requests """
86+
return self.__request("PUT", endpoint, data)
87+
88+
def delete(self, endpoint):
89+
""" DELETE requests """
90+
return self.__request("DELETE", endpoint, None)

woocommerce/oauth.py

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
WooCommerce OAuth1.0a Class
5+
"""
6+
7+
__title__ = "woocommerce-oauth"
8+
__version__ = "1.0.0"
9+
__author__ = "Claudio Sanches @ WooThemes"
10+
__license__ = "MIT"
11+
12+
import urlparse
13+
import time
14+
import random
15+
import hmac
16+
import urllib
17+
import hashlib
18+
import collections
19+
20+
class OAuth(object):
21+
""" API Class """
22+
23+
def __init__(self, url, consumer_key, consumer_secret, **kwargs):
24+
self.url = url
25+
self.consumer_key = consumer_key
26+
self.consumer_secret = consumer_secret
27+
self.version = kwargs.get("version", "v3")
28+
self.method = kwargs.get("method", "GET")
29+
30+
def get_oauth_url(self):
31+
""" Returns the URL with OAuth params """
32+
params = {}
33+
34+
if "?" in self.url:
35+
url = self.url[:self.url.find("?")]
36+
for key, value in urlparse.parse_qsl(urlparse.urlparse(self.url).query):
37+
params[key] = value
38+
else:
39+
url = self.url
40+
41+
params["oauth_consumer_key"] = self.consumer_key
42+
params["oauth_timestamp"] = int(time.time())
43+
params["oauth_nonce"] = hmac.new(
44+
str(time.time() + random.randint(0, 99999)), "SHA1").hexdigest()
45+
params["oauth_signature_method"] = "HMAC-SHA1"
46+
params["oauth_signature"] = self.generate_oauth_signature(params, url)
47+
48+
query_string = urllib.urlencode(params)
49+
50+
return "%s?%s" % (url, query_string)
51+
52+
def generate_oauth_signature(self, params, url):
53+
""" Generate OAuth Signature """
54+
if "oauth_signature" in params.keys():
55+
del params["oauth_signature"]
56+
57+
base_request_uri = urllib.quote(url, "")
58+
params = self.normalize_parameters(params)
59+
params = collections.OrderedDict(sorted(params.items()))
60+
query_params = ["{param_key}%3D{param_value}".format(param_key=key, param_value=value)
61+
for key, value in params.items()]
62+
63+
query_string = "%26".join(query_params)
64+
string_to_sign = "%s&%s&%s" % (self.method, base_request_uri, query_string)
65+
66+
consumer_secret = str(self.consumer_secret)
67+
if self.version == "v3":
68+
consumer_secret += "&"
69+
70+
hash_signature = hmac.new(
71+
consumer_secret,
72+
str(string_to_sign),
73+
getattr(hashlib, "sha1")).digest()
74+
75+
return hash_signature.encode("base64").replace("\n", "")
76+
77+
@staticmethod
78+
def normalize_parameters(params):
79+
""" Normalize parameters """
80+
params = params or {}
81+
normalized_parameters = {}
82+
83+
def get_value_like_as_php(val):
84+
""" Prepare value for urllib.quote """
85+
if isinstance(val, basestring):
86+
return val
87+
elif isinstance(val, bool):
88+
return "1" if val else ""
89+
elif isinstance(val, int):
90+
return str(val)
91+
elif isinstance(val, float):
92+
return str(int(val)) if val % 1 == 0 else str(val)
93+
else:
94+
return ""
95+
96+
for key, value in params.items():
97+
value = get_value_like_as_php(value)
98+
key = urllib.quote(urllib.unquote(str(key))).replace("%", "%25")
99+
value = urllib.quote(urllib.unquote(str(value))).replace("%", "%25")
100+
normalized_parameters[key] = value
101+
102+
return normalized_parameters

0 commit comments

Comments
 (0)
0