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

Skip to content

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

8000
Appearance settings

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