Hik_iSecure.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. # coding=utf-8
  2. import base64
  3. import hmac
  4. import json
  5. import sys
  6. import threading
  7. import time
  8. import uuid
  9. from hashlib import sha256
  10. import ssl
  11. import math
  12. # 调用https必须导入
  13. ssl._create_default_https_context = ssl._create_unverified_context
  14. if (sys.version_info.major == 3):
  15. import urllib.request as urllib2
  16. else:
  17. import urllib2
  18. class Hik_iSecure():
  19. def __init__(self, host, appKey, appSecret):
  20. self.host = host # 代理API网关nginx服务器ip端口
  21. self.appKey = appKey # 秘钥appkey
  22. self.appSecret = appSecret # 秘钥appSecret
  23. self.get_token()
  24. # self.token = ""
  25. flushTokenThread = threading.Thread(target=self.update_token)
  26. flushTokenThread.start()
  27. while 1: # 等待第一次刷新token完成
  28. if self.token:
  29. break
  30. time.sleep(1)
  31. def update_token(self):
  32. while 1:
  33. try:
  34. print("Hik_iSecure update token every 11 hours")
  35. self.get_token()
  36. time.sleep(3600 * 11)
  37. except Exception as e:
  38. print("update token error: wait for 60 seconds")
  39. time.sleep(60)
  40. ###获取token 12小时需要更新一次
  41. def get_token(self):
  42. path = "/artemis/api/v1/oauth/token"
  43. base_headers = {
  44. "Accept": "*/*",
  45. "Content-Type": "application/json",
  46. }
  47. headers = self.build_signature("POST", path, base_headers)
  48. # print(headers)
  49. post1 = self.post(self.host + path, "", headers)
  50. self.token = json.loads(post1)["data"]["access_token"]
  51. # print(self.token)
  52. def post(self, url, postData, headers): #
  53. if isinstance(postData, dict):
  54. postData = json.dumps(postData)
  55. postData = postData.encode("utf-8")
  56. req = urllib2.Request(url, data=postData,
  57. headers=headers)
  58. # res = urllib2.urlopen(req, timeout=60).read().decode("utf-8")
  59. res = urllib2.urlopen(req, timeout=60).read()
  60. return res
  61. # 获取13位时间戳
  62. def get_millisecond(self):
  63. millis = int(round(time.time() * 1000))
  64. return millis
  65. def get_sha256(self, data, key):
  66. key = key.encode("utf-8")
  67. data = data.encode("utf-8")
  68. return base64.b64encode(hmac.new(key, data, digestmod=sha256).digest()).decode("utf-8")
  69. def build_signature(self, httpType, url, headers):
  70. text = httpType + "\n"
  71. for header in sorted(headers):
  72. value = str(headers[header])
  73. if "x-ca-" in header:
  74. value = header + ":" + value
  75. text += value
  76. text += "\n"
  77. text += url
  78. sha_ = self.get_sha256(text, self.appSecret)
  79. headers["x-ca-signature"] = sha_
  80. headers["x-ca-key"] = self.appKey
  81. headers["x-ca-nonce"] = str(uuid.uuid4())
  82. return headers
  83. ## 基础请求url
  84. def base_request(self, url, data):
  85. headers = {
  86. "access_token": self.token,
  87. "Content-Type": "application/json"
  88. }
  89. post = self.post(self.host + url, data, headers)
  90. return post
  91. def person_list(self,person_list,url):
  92. headers = {
  93. "access_token": self.token,
  94. "Content-Type": "application/json"
  95. }
  96. data = {
  97. "pageNo": "1",
  98. "pageSize": "999"
  99. }
  100. resp = self.post(self.host + url, data, headers)
  101. resp = json.loads(resp)
  102. totalsize = resp["data"]["total"]
  103. pageSize = resp["data"]["pageSize"]
  104. page = math.ceil(int(totalsize) / 999)
  105. data_list = resp["data"]["list"]
  106. for i in data_list:
  107. if "personPhoto" in i :
  108. personId = i["personId"]
  109. if str(personId).isdigit() is False:
  110. personId = ''.join(filter(lambda x: x.isdigit(), personId))
  111. personName = i["personName"]
  112. personPhoto = i["personPhoto"][0]
  113. #图片加密
  114. picture_base64 = self.get_picture(personPhoto)
  115. person_list[personId] = [personName,picture_base64]
  116. return pageSize,page
  117. def get_personlist(self):
  118. url = "/artemis/api/resource/v2/person/personList"
  119. person_list = {}
  120. pageSize,page = self.person_list(person_list,url)
  121. while pageSize < page:
  122. pageSize = pageSize + 1
  123. self.person_list(person_list,url)
  124. return person_list
  125. def get_picture(self,personPhoto):
  126. url = "/artemis/api/resource/v1/person/picture"
  127. headers = {
  128. "access_token": self.token,
  129. "Content-Type": "application/json"
  130. }
  131. resp = self.post(self.host + url, personPhoto, headers)
  132. resp = base64.b64encode(resp).decode()
  133. return resp
  134. def get_card_post(self,resp,cards,diff_value):
  135. data_list = resp["data"]["list"]
  136. for i in data_list:
  137. if i["personId"] in diff_value:
  138. personId = i["personId"]
  139. card = i["cardNo"]
  140. card = {
  141. "cardNo": card,
  142. "cardType": "normalCard",
  143. "employeeNo": personId
  144. }
  145. cards.append(card)
  146. def get_card(self,diff_value):
  147. url = "/artemis/api/resource/v1/card/cardList"
  148. headers = {
  149. "access_token": self.token,
  150. "Content-Type": "application/json"
  151. }
  152. data = {
  153. "pageNo": "1",
  154. "pageSize": "999"
  155. }
  156. resp = self.post(self.host + url, data, headers)
  157. resp = json.loads(resp)
  158. totalsize = resp["data"]["total"]
  159. pageSize = resp["data"]["pageSize"]
  160. page = math.ceil(int(totalsize) / 999)
  161. cards = []
  162. self.get_card_post(resp,cards,diff_value)
  163. while pageSize < page:
  164. pageSize = pageSize + 1
  165. resp = self.post(self.host + url,data,headers)
  166. resp = json.loads(resp)
  167. self.get_card_post(resp, cards,diff_value)
  168. return cards
  169. # url = "/artemis/api/resource/v2/person/personList"
  170. # person_lists = HikiSecure.get_personlist(url)
  171. # print(person_lists)
  172. # url = "/artemis/api/resource/v1/person/picture"
  173. # person_lists = [['1661305020782497', '张勇', [{'serverIndexCode': 'cb5092fd-61fe-4fd9-880f-319483d3949d', 'personPhotoIndexCode': '15a08a88-d9e7-4577-990f-b6bb62822b15', 'picUri': '/pic?0dd100=ac-0ip2e1o06ee74e--fei3617badd92i5b2*=*d3d8i*s1d=i1p4t=pe*m6i13=1964190*79z47bs=091c7*l-0dod024=1i005'}]]]
  174. # aa = HikiSecure.get_picture(url,person_lists)
  175. # print(aa)
  176. # url = "/artemis/api/resource/v2/person/personList"
  177. # person_lists = HikiSecure.get_personlist(url)
  178. # picture_url = "/artemis/api/resource/v1/person/picture"
  179. # HikiSecure.get_picture(picture_url,person_lists)
  180. # url = "/artemis/api/resource/v1/card/cardList"
  181. # HikiSecure.get_card(url,person_lists)