Last active
August 29, 2015 14:06
-
-
Save ellipse42-archived/3c682d77bd708c7b74a4 to your computer and use it in GitHub Desktop.
Some Api Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #! /usr/bin/env python | |
| # coding=utf-8 | |
| import sys | |
| import json | |
| import traceback | |
| import hashlib | |
| import requests | |
| from collections import OrderedDict | |
| class Api(object): | |
| API_PREFIX = 'api/v1' | |
| def __init__(self, *args, **kwargs): | |
| self.setup(*args, **kwargs) | |
| def setup(self, app_key, app_token, host='127.0.0.1', port=8888): | |
| self.app_key = app_key | |
| self.app_token = app_token | |
| self.host = host | |
| self.port = port | |
| def _process(self, api, params, method): | |
| try: | |
| # params | |
| params.update({'app_key': self.app_key}) | |
| self._encrypt_params(params) | |
| # request GET/POST | |
| url = 'http://%s:%d/%s/%s' % ( | |
| self.host, self.port, self.API_PREFIX, api) | |
| if method == 'GET': | |
| info = requests.get(url, params=params) | |
| elif method == 'POST': | |
| info = requests.post(url, data=json.dumps( | |
| params), headers={'content-type': 'application/json'}) | |
| else: | |
| raise APIError(4000, 'Request method: %s' % method) | |
| info = info.json() | |
| if info['code'] != 200: | |
| raise APIError(6000, info['message']) | |
| return True, info['data'] | |
| except APIError, e: | |
| return False, str(e) | |
| except Exception, e: | |
| traceback.print_exc(file=sys.stdout) | |
| return False, APIError(5000, str(e)) | |
| def get_user(self, uid): | |
| return self._process('user', {'uid': uid}, 'GET') | |
| def add_user(self, name): | |
| return self._process('user', {'name': name}, 'POST') | |
| def del_user(self, uid): | |
| return self._process('user', {'uid': uid}, 'GET') | |
| def update_user(self, uid, name): | |
| return self._process(api, {'uid': uid, 'name': name}, method) | |
| def _encrypt_params(self, params): | |
| ordered_params = OrderedDict( | |
| sorted(params.items(), key=lambda x: x[0])) | |
| data = '' | |
| for value in ordered_params.itervalues(): | |
| data += value | |
| signature = hashlib.sha1(self.app_token + data).hexdigest() | |
| params.update({'signature': signature}) | |
| class APIError(Exception): | |
| def __init__(self, code=2000, message=''): | |
| self.code = code | |
| self.message = message | |
| self.code_type = _code_types.get(self.code, 'Unknow Error') | |
| def __str__(self): | |
| err = {'code': self.code, 'message': | |
| self.message, 'codeType': self.code_type} | |
| return json.dumps(err) | |
| _code_types = { | |
| 1000: 'Successful Request', | |
| 2000: 'Api', | |
| 3000: 'Params Verify Error', | |
| 4000: 'Request Method Not Exists', | |
| 5000: 'Can\'t Recognize Error', | |
| 6000: 'Result Error' | |
| } | |
| if __name__ == '__main__': | |
| # raise APIError(3000, 'request /api/payment error') | |
| api = Api('e1_test', r'ml3u4hg^2t@%+c3!ft3g*b_&&=32tgrf2o&id85vh&f)qef=)2') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment