# -*- coding: utf-8 -*- # !/usr/bin/env python import copy import hashlib import logging import operator import time import xmltodict logging.captureWarnings(True) import requests class Request(): def __init__(self, appKey, appSecret): self.appKey = appKey self.appSecret = appSecret self.url = 'http://gw.api.taobao.com/router/rest' self.params = {} def md5(self, arg): md5 = hashlib.md5() loc_bytes_utf8 = arg.encode(encoding = "utf-8") md5.update(loc_bytes_utf8) return md5.hexdigest() """#key 加密算法 1:对传入的产生 按照key 进行排序 2:将排序后的数据 将各数据字段 用字符串 ‘&’连接起来 如:data={appkey:123,pageId:1} 处理后 appkey=123&pageId=1 3:在处理后的数据字符串后追加 appSecret 如 appSecret=helloworld 则 最终 加密字符串为appkey=123&pageId=1&key=hellworld 4:采用MD5加密算法对 处理后的字符串进行加密 """ def md5_sign(self, args = None): copy_args = copy.deepcopy(args) # 对传入的参数 按照key 排序 sorted_args = sorted(copy_args.items(), key = operator.itemgetter(0)) sign_data = '' for i in sorted_args: sign_data = '{}{}{}'.format(sign_data, list(i)[0], list(i)[1]) sign_data = '{}{}{}'.format(self.appSecret, sign_data, self.appSecret) sign = self.md5(sign_data).upper() copy_args['sign'] = sign return copy_args def check_args(self, arg, check_params): params = copy.deepcopy(check_params) if arg: if len(check_params) > 0: for key in check_params: if key in arg.keys(): params.remove(key) # print(self.__class__.check_parmas,list(arg.keys())) # print(i) if len(params) == 0: return True else: print("请传入必要参数%s且不能为空" % str(params)) return False else: return True else: if len(check_params) > 0: print("请传入必要参数%s且不能为空" % str(check_params)) return False else: return True # 设置传入参数 def addParams(self, key, value): if value: self.params[key] = value def request(self, method, api_name, args, UserAgent = None, ContentType = None): if UserAgent == None: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36", 'Content-Type': ContentType, 'Client-Sdk-Type': 'python'} else: headers = {"User-Agent": UserAgent, 'Content-Type': ContentType, 'Client-Sdk-Type': 'python'} # 将appkey 加入 待排序 args['method'] = api_name args['app_key'] = self.appKey args['timestamp'] = int(time.time()) args['v'] = '2.0' args['sign_method'] = 'md5' data = self.md5_sign(args = args) method_tmp = method.lower() if method_tmp == 'get': response = requests.request(method = method_tmp, url = self.url, params = data, headers = headers, verify = False) xmltodict.parse(response.content) return response elif method_tmp == 'post': response = requests.request(method = method_tmp, url = self.url, data = data, headers = headers, verify = False).json() return response