Hik_iSecure.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. print(self.token)
  30. break
  31. time.sleep(1)
  32. def update_token(self):
  33. while 1:
  34. try:
  35. print("Hik_iSecure update token every 11 hours")
  36. self.get_token()
  37. time.sleep(3600 * 11)
  38. except Exception as e:
  39. print("update token error: wait for 60 seconds")
  40. time.sleep(60)
  41. ###获取token 12小时需要更新一次
  42. def get_token(self):
  43. path = "/artemis/api/v1/oauth/token"
  44. base_headers = {
  45. "Accept": "*/*",
  46. "Content-Type": "application/json",
  47. }
  48. headers = self.build_signature("POST", path, base_headers)
  49. # print(headers)
  50. post1 = self.post(self.host + path, "", headers)
  51. self.token = json.loads(post1)["data"]["access_token"]
  52. # print(self.token)
  53. def post(self, url, postData, headers): #
  54. if isinstance(postData, dict):
  55. postData = json.dumps(postData)
  56. postData = postData.encode("utf-8")
  57. req = urllib2.Request(url, data=postData,
  58. headers=headers)
  59. # res = urllib2.urlopen(req, timeout=60).read().decode("utf-8")
  60. res = urllib2.urlopen(req, timeout=60).read()
  61. return res
  62. # 获取13位时间戳
  63. def get_millisecond(self):
  64. millis = int(round(time.time() * 1000))
  65. return millis
  66. def get_sha256(self, data, key):
  67. key = key.encode("utf-8")
  68. data = data.encode("utf-8")
  69. return base64.b64encode(hmac.new(key, data, digestmod=sha256).digest()).decode("utf-8")
  70. def build_signature(self, httpType, url, headers):
  71. text = httpType + "\n"
  72. for header in sorted(headers):
  73. value = str(headers[header])
  74. if "x-ca-" in header:
  75. value = header + ":" + value
  76. text += value
  77. text += "\n"
  78. text += url
  79. sha_ = self.get_sha256(text, self.appSecret)
  80. headers["x-ca-signature"] = sha_
  81. headers["x-ca-key"] = self.appKey
  82. headers["x-ca-nonce"] = str(uuid.uuid4())
  83. return headers
  84. ## 基础请求url
  85. def base_request(self, url, data):
  86. headers = {
  87. "access_token": self.token,
  88. "Content-Type": "application/json"
  89. }
  90. post = self.post(self.host + url, data, headers)
  91. return post
  92. def person_list(self,person_list,url):
  93. headers = {
  94. "access_token": self.token,
  95. "Content-Type": "application/json"
  96. }
  97. data = {
  98. "pageNo": "1",
  99. "pageSize": "999"
  100. }
  101. resp = self.post(self.host + url, data, headers)
  102. resp = json.loads(resp)
  103. totalsize = resp["data"]["total"]
  104. pageSize = resp["data"]["pageSize"]
  105. page = math.ceil(int(totalsize) / 999)
  106. data_list = resp["data"]["list"]
  107. for i in data_list:
  108. if "personPhoto" in i :
  109. personId = i["personId"]
  110. if str(personId).isdigit() is False:
  111. personId = ''.join(filter(lambda x: x.isdigit(), personId))
  112. personName = i["personName"]
  113. personPhoto = i["personPhoto"][0]
  114. #图片加密
  115. picture_base64 = self.get_picture(personPhoto)
  116. person_list[personId] = [personName,picture_base64]
  117. return pageSize,page
  118. def get_personlist(self):
  119. url = "/artemis/api/resource/v2/person/personList"
  120. person_list = {}
  121. pageSize,page = self.person_list(person_list,url)
  122. while pageSize < page:
  123. pageSize = pageSize + 1
  124. self.person_list(person_list,url)
  125. return person_list
  126. def get_picture(self,personPhoto):
  127. url = "/artemis/api/resource/v1/person/picture"
  128. headers = {
  129. "access_token": self.token,
  130. "Content-Type": "application/json"
  131. }
  132. resp = self.post(self.host + url, personPhoto, headers)
  133. resp = base64.b64encode(resp).decode()
  134. return resp
  135. def get_card_post(self,resp,cards,diff_value):
  136. data_list = resp["data"]["list"]
  137. for i in data_list:
  138. if i["personId"] in diff_value:
  139. personId = i["personId"]
  140. card = i["cardNo"]
  141. card = {
  142. "cardNo": card,
  143. "cardType": "normalCard",
  144. "employeeNo": personId
  145. }
  146. cards.append(card)
  147. def get_card(self,diff_value):
  148. url = "/artemis/api/resource/v1/card/cardList"
  149. headers = {
  150. "access_token": self.token,
  151. "Content-Type": "application/json"
  152. }
  153. data = {
  154. "pageNo": "1",
  155. "pageSize": "999"
  156. }
  157. resp = self.post(self.host + url, data, headers)
  158. resp = json.loads(resp)
  159. totalsize = resp["data"]["total"]
  160. pageSize = resp["data"]["pageSize"]
  161. page = math.ceil(int(totalsize) / 999)
  162. cards = []
  163. self.get_card_post(resp,cards,diff_value)
  164. while pageSize < page:
  165. pageSize = pageSize + 1
  166. resp = self.post(self.host + url,data,headers)
  167. resp = json.loads(resp)
  168. self.get_card_post(resp, cards,diff_value)
  169. return cards
  170. # url = "/artemis/api/resource/v2/person/personList"
  171. # person_lists = HikiSecure.get_personlist(url)
  172. # print(person_lists)
  173. # url = "/artemis/api/resource/v1/person/picture"
  174. # 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'}]]]
  175. # aa = HikiSecure.get_picture(url,person_lists)
  176. # print(aa)
  177. # url = "/artemis/api/resource/v2/person/personList"
  178. # person_lists = HikiSecure.get_personlist(url)
  179. # picture_url = "/artemis/api/resource/v1/person/picture"
  180. # HikiSecure.get_picture(picture_url,person_lists)
  181. # url = "/artemis/api/resource/v1/card/cardList"
  182. # HikiSecure.get_card(url,person_lists)