Hik_iSecure.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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,pageNo,url):
  92. headers = {
  93. "access_token": self.token,
  94. "Content-Type": "application/json"
  95. }
  96. data = {
  97. "pageNo": pageNo,
  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. #返回大于该数字的最小整数值
  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 page,totalsize
  118. def get_personlist(self):
  119. url = "/artemis/api/resource/v2/person/personList"
  120. person_list = {}
  121. pageNo = 1
  122. page,totalsize = self.person_list(person_list,pageNo,url)
  123. # while pageSize < page:
  124. # pageSize = pageSize + 1
  125. # self.person_list(person_list,url)
  126. while pageNo < page:
  127. pageNo = pageNo + 1
  128. self.person_list(person_list,pageNo,url)
  129. return person_list
  130. def get_picture(self,personPhoto):
  131. url = "/artemis/api/resource/v1/person/picture"
  132. headers = {
  133. "access_token": self.token,
  134. "Content-Type": "application/json"
  135. }
  136. resp = self.post(self.host + url, personPhoto, headers)
  137. resp = base64.b64encode(resp).decode()
  138. return resp
  139. def get_card_post(self,resp,cards,diff_value):
  140. data_list = resp["data"]["list"]
  141. for i in data_list:
  142. if i["personId"] in diff_value:
  143. personId = i["personId"]
  144. card = i["cardNo"]
  145. card = {
  146. "cardNo": card,
  147. "cardType": "normalCard",
  148. "employeeNo": personId
  149. }
  150. cards.append(card)
  151. def get_card(self,diff_value):
  152. url = "/artemis/api/resource/v1/card/cardList"
  153. headers = {
  154. "access_token": self.token,
  155. "Content-Type": "application/json"
  156. }
  157. pageNo = 1
  158. data = {
  159. "pageNo": pageNo,
  160. "pageSize": "999"
  161. }
  162. resp = self.post(self.host + url, data, headers)
  163. resp = json.loads(resp)
  164. totalsize = resp["data"]["total"]
  165. # pageSize = resp["data"]["pageSize"]
  166. page = math.ceil(int(totalsize) / 999)
  167. cards = []
  168. self.get_card_post(resp,cards,diff_value)
  169. while pageNo < page:
  170. pageNo = pageNo + 1
  171. data = {
  172. "pageNo": pageNo,
  173. "pageSize": "999"
  174. }
  175. resp = self.post(self.host + url,data,headers)
  176. resp = json.loads(resp)
  177. self.get_card_post(resp, cards,diff_value)
  178. return cards
  179. # url = "/artemis/api/resource/v2/person/personList"
  180. # person_lists = HikiSecure.get_personlist(url)
  181. # print(person_lists)
  182. # url = "/artemis/api/resource/v1/person/picture"
  183. # 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'}]]]
  184. # aa = HikiSecure.get_picture(url,person_lists)
  185. # print(aa)
  186. # url = "/artemis/api/resource/v2/person/personList"
  187. # person_lists = HikiSecure.get_personlist(url)
  188. # picture_url = "/artemis/api/resource/v1/person/picture"
  189. # HikiSecure.get_picture(picture_url,person_lists)
  190. # url = "/artemis/api/resource/v1/card/cardList"
  191. # HikiSecure.get_card(url,person_lists)