__init__.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import copy
  4. import hashlib
  5. import logging
  6. import operator
  7. import time
  8. import xmltodict
  9. logging.captureWarnings(True)
  10. import requests
  11. class Request():
  12. def __init__(self, appKey, appSecret):
  13. self.appKey = appKey
  14. self.appSecret = appSecret
  15. self.url = 'http://gw.api.taobao.com/router/rest'
  16. self.params = {}
  17. def md5(self, arg):
  18. md5 = hashlib.md5()
  19. loc_bytes_utf8 = arg.encode(encoding = "utf-8")
  20. md5.update(loc_bytes_utf8)
  21. return md5.hexdigest()
  22. """#key 加密算法
  23. 1:对传入的产生 按照key 进行排序
  24. 2:将排序后的数据 将各数据字段 用字符串 ‘&’连接起来
  25. 如:data={appkey:123,pageId:1} 处理后 appkey=123&pageId=1
  26. 3:在处理后的数据字符串后追加 appSecret 如 appSecret=helloworld 则 最终 加密字符串为appkey=123&pageId=1&key=hellworld
  27. 4:采用MD5加密算法对 处理后的字符串进行加密
  28. """
  29. def md5_sign(self, args = None):
  30. copy_args = copy.deepcopy(args)
  31. # 对传入的参数 按照key 排序
  32. sorted_args = sorted(copy_args.items(), key = operator.itemgetter(0))
  33. sign_data = ''
  34. for i in sorted_args:
  35. sign_data = '{}{}{}'.format(sign_data, list(i)[0], list(i)[1])
  36. sign_data = '{}{}{}'.format(self.appSecret, sign_data, self.appSecret)
  37. sign = self.md5(sign_data).upper()
  38. copy_args['sign'] = sign
  39. return copy_args
  40. def check_args(self, arg, check_params):
  41. params = copy.deepcopy(check_params)
  42. if arg:
  43. if len(check_params) > 0:
  44. for key in check_params:
  45. if key in arg.keys():
  46. params.remove(key)
  47. # print(self.__class__.check_parmas,list(arg.keys()))
  48. # print(i)
  49. if len(params) == 0:
  50. return True
  51. else:
  52. print("请传入必要参数%s且不能为空" % str(params))
  53. return False
  54. else:
  55. return True
  56. else:
  57. if len(check_params) > 0:
  58. print("请传入必要参数%s且不能为空" % str(check_params))
  59. return False
  60. else:
  61. return True
  62. # 设置传入参数
  63. def addParams(self, key, value):
  64. if value:
  65. self.params[key] = value
  66. def request(self, method, api_name, args, UserAgent = None, ContentType = None):
  67. if UserAgent == None:
  68. headers = {
  69. "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",
  70. 'Content-Type': ContentType,
  71. 'Client-Sdk-Type': 'python'}
  72. else:
  73. headers = {"User-Agent": UserAgent, 'Content-Type': ContentType, 'Client-Sdk-Type': 'python'}
  74. # 将appkey 加入 待排序
  75. args['method'] = api_name
  76. args['app_key'] = self.appKey
  77. args['timestamp'] = int(time.time())
  78. args['v'] = '2.0'
  79. args['sign_method'] = 'md5'
  80. data = self.md5_sign(args = args)
  81. method_tmp = method.lower()
  82. if method_tmp == 'get':
  83. response = requests.request(method = method_tmp, url = self.url, params = data, headers = headers,
  84. verify = False)
  85. xmltodict.parse(response.content)
  86. return response
  87. elif method_tmp == 'post':
  88. response = requests.request(method = method_tmp, url = self.url, data = data, headers = headers,
  89. verify = False).json()
  90. return response