-
Notifications
You must be signed in to change notification settings - Fork 110
/
Copy pathapi.py
122 lines (100 loc) · 3.76 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# -*- coding: utf-8 -*-
"""
WooCommerce API Class
"""
__title__ = "woocommerce-api"
__version__ = "3.0.0"
__author__ = "Claudio Sanches @ Automattic"
__license__ = "MIT"
from requests import request, Response
from json import dumps as jsonencode
from time import time
from woocommerce.oauth import OAuth
from requests.auth import HTTPBasicAuth
from urllib.parse import urlencode
class API(object):
""" API Class """
def __init__(self, url, consumer_key, consumer_secret, **kwargs):
self.url = url
self.consumer_key = consumer_key
self.consumer_secret = consumer_secret
self.wp_api = kwargs.get("wp_api", True)
self.version = kwargs.get("version", "wc/v3")
self.is_ssl = self.__is_ssl()
self.timeout = kwargs.get("timeout", 5)
self.verify_ssl = kwargs.get("verify_ssl", True)
self.query_string_auth = kwargs.get("query_string_auth", False)
self.user_agent = kwargs.get("user_agent", f"WooCommerce-Python-REST-API/{__version__}")
def __is_ssl(self):
""" Check if url use HTTPS """
return self.url.startswith("https")
def __get_url(self, endpoint):
""" Get URL for requests """
url = self.url
api = "wc-api"
if url.endswith("/") is False:
url = f"{url}/"
if self.wp_api:
api = "wp-json"
return f"{url}{api}/{self.version}/{endpoint}"
def __get_oauth_url(self, url, method, **kwargs):
""" Generate oAuth1.0a URL """
oauth = OAuth(
url=url,
consumer_key=self.consumer_key,
consumer_secret=self.consumer_secret,
version=self.version,
method=method,
oauth_timestamp=kwargs.get("oauth_timestamp", int(time()))
)
return oauth.get_oauth_url()
def __request(self, method, endpoint, data, params=None, **kwargs) -> Response:
""" Do requests """
if params is None:
params = {}
url = self.__get_url(endpoint)
auth = None
headers = {
"user-agent": f"{self.user_agent}",
"accept": "application/json"
}
if self.is_ssl is True and self.query_string_auth is False:
auth = HTTPBasicAuth(self.consumer_key, self.consumer_secret)
elif self.is_ssl is True and self.query_string_auth is True:
params.update({
"consumer_key": self.consumer_key,
"consumer_secret": self.consumer_secret
})
else:
encoded_params = urlencode(params)
url = f"{url}?{encoded_params}"
url = self.__get_oauth_url(url, method, **kwargs)
if data is not None:
data = jsonencode(data, ensure_ascii=False).encode('utf-8')
headers["content-type"] = "application/json;charset=utf-8"
return request(
method=method,
url=url,
verify=self.verify_ssl,
auth=auth,
params=params,
data=data,
timeout=self.timeout,
headers=headers,
**kwargs
)
def get(self, endpoint, **kwargs):
""" Get requests """
return self.__request("GET", endpoint, None, **kwargs)
def post(self, endpoint, data, **kwargs):
""" POST requests """
return self.__request("POST", endpoint, data, **kwargs)
def put(self, endpoint, data, **kwargs):
""" PUT requests """
return self.__request("PUT", endpoint, data, **kwargs)
def delete(self, endpoint, **kwargs):
""" DELETE requests """
return self.__request("DELETE", endpoint, None, **kwargs)
def options(self, endpoint, **kwargs):
""" OPTIONS requests """
return self.__request("OPTIONS", endpoint, None, **kwargs)