-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmartin.py
77 lines (64 loc) · 2.2 KB
/
martin.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
#!/usr/bin/python
# -*- coding: utf-8 -*-
__author__ = '[email protected]'
from datetime import datetime
from hashlib import md5
from json import loads
from requests import Request, Session
class APIError(StandardError):
def __init__(self, ret_error):
self.responce = ret_error
StandardError.__init__(self, ret_error['msg'])
def __str__(self):
return '***%s %s*** %s' % (
self.responce['code'],
self.responce['msg'],
self.responce['request'])
class Client(object):
def __init__(self, app_key, app_secret, api_host=None):
self.app_key = app_key
self.app_secret = app_secret
if api_host:
self.api_host = api_host
else:
self.api_host = 'http://api.buding.cn'
def get(self, api):
session = Session()
req = Request('get', self.api_host + api).prepare()
headers = self.gen_headers('GET', api, 0)
req.headers.update(headers)
responce = session.send(req)
try:
ret = loads(responce.content)
except ValueError, e:
return responce.content
if 'msg' in ret and 'code' in ret:
raise APIError(ret)
return ret
def post(self, api, **kwargs):
session = Session()
req = Request('post', self.api_host + api, data=kwargs).prepare()
headers = self.gen_headers('POST', api, req.headers['Content-Length'])
req.headers.update(headers)
responce = session.send(req)
try:
ret = loads(responce.content)
except ValueError, e:
return responce.content
if 'msg' in ret and 'code' in ret:
raise APIError(ret)
return ret
def gen_headers(self, method, api, content_length):
headers = {}
now = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
signature_list = [
method,
api,
now,
str(content_length),
md5(self.app_secret).hexdigest()
]
signature = md5('&'.join(signature_list)).hexdigest()
headers['Date'] = now
headers['Authorization'] = '%s:%s' % (self.app_key, signature)
return headers