李莎 2 yıl önce
işleme
feae2db85e
6 değiştirilmiş dosya ile 488 ekleme ve 0 silme
  1. 111 0
      Utils/Hik_Cloud.py
  2. 204 0
      Utils/Hik_iSecure.py
  3. 8 0
      config.json
  4. 110 0
      hksecure.py
  5. 48 0
      main.py
  6. 7 0
      sss.py

+ 111 - 0
Utils/Hik_Cloud.py

@@ -0,0 +1,111 @@
+import time
+import math
+import requests
+import datetime
+import json
+
+def datetime_now():
+    datetimenow = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
+    return datetimenow
+
+
+class Hik_Cloud():
+    def __init__(self,host,client_id,client_secret):
+        self.host = host
+        self.client_id = client_id
+        self.client_secret = client_secret
+        self.get_token()
+
+    def get_token(self):
+        path = "/oauth/token"
+        base_headers = {
+            "Content-Type": "application/x-www-form-urlencoded"
+        }
+        base_data = {
+            "client_id": self.client_id,
+            "client_secret": self.client_secret,
+            "grant_type": "client_credentials"
+        }
+        req = requests.post(self.host + path, data=base_data,
+                              headers=base_headers)
+        res = req.json()
+        self.token = res["access_token"]
+
+
+    def post(self, url, postData, headers):  #
+        if isinstance(postData, dict):
+            postData = json.dumps(postData)
+        postData = postData.encode("utf-8")
+        req = requests.post(url, data=postData,
+                              headers=headers)
+        res = req.json()
+        return res
+
+    def hik_adduser(self,employeeNo,personName,faceImageBase64):
+        path = "/api/v1/open/basic/persons/create?access_token=%s"%self.token
+        if str(employeeNo).isdigit() is False:
+            employeeNo = ''.join(filter(lambda x: x.isdigit(), employeeNo))
+        data = {
+            "employeeNo": employeeNo,
+            "personName": personName,
+            "faceImageBase64": faceImageBase64,
+            "verifyImage": "false",
+        }
+        headers = {"content-type": "application/json"}
+        response = self.post(self.host + path, data, headers)
+        if response["code"] == 200:
+            print("%s,%s(%s)用户添加成功" % (datetime_now(), personName, employeeNo))
+        else:
+            print("%s,%s(%s)%s" % (datetime_now(), personName, employeeNo, response["message"]))
+        time.sleep(2)
+
+
+    #创建卡片
+    def hik_addcard(self,cards):
+        path = "/api/v1/open/basic/cards/batchCreate?access_token=%s"%self.token
+        headers = {"content-type": "application/json"}
+        data = {
+            "cards": cards
+        }
+        response = self.post(self.host + path, data,headers)
+        if response["code"] == 200:
+            print("%s,海康云眸创建卡片成功"%(datetime_now()))
+        else:
+            print(datetime_now(),response["message"])
+
+    def resp(self, pageNo, person_dict):
+        path = "/api/v1/open/basic/persons/list?access_token=%s&pageNo=%s&pageSize=999"%(self.token,pageNo)
+        response = requests.get(self.host + path)
+        response = response.json()
+        totalsize = response["data"]["total"]
+        persons = response["data"]["rows"]
+        for person in persons:
+            personId = person["employeeNo"]
+            personName = person["personName"]
+            person_dict[personId] = personName
+        return totalsize, person_dict
+
+    def hik_getuserlist(self):
+        person_dict = {}
+        pageNo = 1
+        totalsize, person_dict = self.resp(pageNo,person_dict)
+
+        page = math.ceil(int(totalsize) / 999)
+        while pageNo < page:
+            pageNo = pageNo + 1
+            self.resp(pageNo, person_dict)
+        return person_dict
+
+    def hik_permissiongroupspersons(self, groupId, employeeNos):
+        path = "/api/v1/open/accessControl/permissionGroups/actions/addPersons?access_token=%s"%self.token
+        headers = {"content-type": "application/json"}
+        data = {
+            "groupId": groupId,
+            "employeeNos": employeeNos,
+            "autoIssue": "true"
+        }
+        response = self.post(self.host + path,headers,data)
+        if response["code"] == 200:
+            print("%s,海康云眸权限组绑定人员成功" % (datetime_now()))
+        else:
+            print(datetime_now(), employeeNos, response["message"])

+ 204 - 0
Utils/Hik_iSecure.py

@@ -0,0 +1,204 @@
+# coding=utf-8
+import base64
+import hmac
+import json
+import sys
+import threading
+import time
+import uuid
+from hashlib import sha256
+import ssl
+import math
+# 调用https必须导入
+ssl._create_default_https_context = ssl._create_unverified_context
+
+if (sys.version_info.major == 3):
+    import urllib.request as urllib2
+else:
+    import urllib2
+
+class Hik_iSecure():
+    def __init__(self, host, appKey, appSecret):
+        self.host = host  # 代理API网关nginx服务器ip端口
+        self.appKey = appKey  # 秘钥appkey
+        self.appSecret = appSecret  # 秘钥appSecret
+        self.get_token()
+        # self.token = ""
+        # flushTokenThread = threading.Thread(target=self.update_token)
+        # flushTokenThread.start()
+        while 1:  # 等待第一次刷新token完成
+            if self.token:
+                break
+            time.sleep(1)
+
+    # def update_token(self):
+    #     while 1:
+    #         try:
+    #             print("update token every 11 hours")
+    #             self.get_token()
+    #             time.sleep(3600 * 11)
+    #         except Exception as e:
+    #             print("update token error: wait for 60 seconds")
+    #             time.sleep(60)
+
+    ###获取token  12小时需要更新一次
+    def get_token(self):
+        path = "/artemis/api/v1/oauth/token"
+        base_headers = {
+            "Accept": "*/*",
+            "Content-Type": "application/json",
+        }
+        headers = self.build_signature("POST", path, base_headers)
+        # print(headers)
+        post1 = self.post(self.host + path, "", headers)
+        self.token = json.loads(post1)["data"]["access_token"]
+        # print(self.token)
+
+    def post(self, url, postData, headers):  #
+        if isinstance(postData, dict):
+            postData = json.dumps(postData)
+        postData = postData.encode("utf-8")
+        req = urllib2.Request(url, data=postData,
+                              headers=headers)
+        # res = urllib2.urlopen(req, timeout=60).read().decode("utf-8")
+        res = urllib2.urlopen(req, timeout=60).read()
+        return res
+
+    # 获取13位时间戳
+    def get_millisecond(self):
+        millis = int(round(time.time() * 1000))
+        return millis
+
+    def get_sha256(self, data, key):
+        key = key.encode("utf-8")
+        data = data.encode("utf-8")
+        return base64.b64encode(hmac.new(key, data, digestmod=sha256).digest()).decode("utf-8")
+
+    def build_signature(self, httpType, url, headers):
+        text = httpType + "\n"
+        for header in sorted(headers):
+            value = str(headers[header])
+            if "x-ca-" in header:
+                value = header + ":" + value
+            text += value
+            text += "\n"
+        text += url
+        sha_ = self.get_sha256(text, self.appSecret)
+        headers["x-ca-signature"] = sha_
+        headers["x-ca-key"] = self.appKey
+        headers["x-ca-nonce"] = str(uuid.uuid4())
+        return headers
+
+    ## 基础请求url
+    def base_request(self, url, data):
+        headers = {
+            "access_token": self.token,
+            "Content-Type": "application/json"
+        }
+        post = self.post(self.host + url, data, headers)
+        return post
+
+    def person_list(self,person_list,url):
+        headers = {
+            "access_token": self.token,
+            "Content-Type": "application/json"
+        }
+        data = {
+            "pageNo": "1",
+            "pageSize": "999"
+        }
+        resp = self.post(self.host + url,  data, headers)
+        resp = json.loads(resp)
+        totalsize = resp["data"]["total"]
+        pageSize = resp["data"]["pageSize"]
+        page = math.ceil(int(totalsize) / 999)
+        data_list = resp["data"]["list"]
+
+        for i in data_list:
+            if "personPhoto" in i :
+                personId = i["personId"]
+                if str(personId).isdigit() is False:
+                    personId = ''.join(filter(lambda x: x.isdigit(), personId))
+                personName = i["personName"]
+                personPhoto = i["personPhoto"][0]
+                #图片加密
+                picture_base64 = self.get_picture(personPhoto)
+                person_list[personId] = [personName,picture_base64]
+        return pageSize,page
+
+    def get_personlist(self):
+        url = "/artemis/api/resource/v2/person/personList"
+        person_list = {}
+        pageSize,page = self.person_list(person_list,url)
+        while pageSize < page:
+            pageSize = pageSize + 1
+            self.person_list(person_list,url)
+        return person_list
+
+    def get_picture(self,personPhoto):
+        url = "/artemis/api/resource/v1/person/picture"
+        headers = {
+            "access_token": self.token,
+            "Content-Type": "application/json"
+        }
+        resp = self.post(self.host + url,  personPhoto, headers)
+        resp = base64.b64encode(resp).decode()
+        return resp
+    def get_card_post(self,resp,cards,diff_value):
+
+        data_list = resp["data"]["list"]
+        for i in data_list:
+            if i["personId"] in diff_value:
+                personId = i["personId"]
+                card = i["cardNo"]
+                card = {
+                    "cardNo": card,
+                    "cardType": "normalCard",
+                    "employeeNo": personId
+                }
+
+                cards.append(card)
+
+    def get_card(self,diff_value):
+        url = "/artemis/api/resource/v1/card/cardList"
+        headers = {
+            "access_token": self.token,
+            "Content-Type": "application/json"
+        }
+        data = {
+            "pageNo": "1",
+            "pageSize": "999"
+        }
+        resp = self.post(self.host + url, data, headers)
+        resp = json.loads(resp)
+        totalsize = resp["data"]["total"]
+        pageSize = resp["data"]["pageSize"]
+        page = math.ceil(int(totalsize) / 999)
+        cards = []
+        self.get_card_post(resp,cards,diff_value)
+        while pageSize < page:
+            pageSize = pageSize + 1
+            resp = self.post(self.host + url,data,headers)
+            resp = json.loads(resp)
+            self.get_card_post(resp, cards,diff_value)
+        return cards
+
+
+# url = "/artemis/api/resource/v2/person/personList"
+# person_lists = HikiSecure.get_personlist(url)
+# print(person_lists)
+
+
+
+# url = "/artemis/api/resource/v1/person/picture"
+# 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'}]]]
+# aa = HikiSecure.get_picture(url,person_lists)
+# print(aa)
+# url = "/artemis/api/resource/v2/person/personList"
+# person_lists = HikiSecure.get_personlist(url)
+# picture_url = "/artemis/api/resource/v1/person/picture"
+# HikiSecure.get_picture(picture_url,person_lists)
+# url = "/artemis/api/resource/v1/card/cardList"
+# HikiSecure.get_card(url,person_lists)
+
+

+ 8 - 0
config.json

@@ -0,0 +1,8 @@
+{
+  "host": "https://192.168.64.44:443",
+  "appKey": "25227103",
+  "appSecret": "LMGm1LNhAE7zF6Alzqdz",
+  "hik_host": "https://api2.hik-cloud.com",
+  "hik_client_id": "62015748440c4f3c83e41dd59a9c4876",
+  "hik_client_secret": "d6ff2fdd784a4572b7371398790a7eff"
+}

+ 110 - 0
hksecure.py

@@ -0,0 +1,110 @@
+# coding=utf-8
+import base64
+import hmac
+import json
+import sys
+import threading
+import time
+import uuid
+from hashlib import sha256
+
+if (sys.version_info.major == 3):
+    import urllib.request as urllib2
+else:
+    import urllib2
+
+import ssl
+
+# 调用https必须导入
+ssl._create_default_https_context = ssl._create_unverified_context
+
+host = "https://192.168.64.44:443"  # 代理API网关nginx服务器ip端口
+appKey = "25227103"  # 秘钥appkey
+appSecret = "LMGm1LNhAE7zF6Alzqdz"  # 秘钥appSecret
+
+
+class HkSecure():
+    def __init__(self, host, appKey, appSecret):
+        self.host = host  # 代理API网关nginx服务器ip端口
+        self.appKey = appKey  # 秘钥appkey
+        self.appSecret = appSecret  # 秘钥appSecret
+        self.token = ""
+        flushTokenThread = threading.Thread(target=self.update_token)
+        flushTokenThread.start()
+        while 1:  # 等待第一次刷新token完成
+            if self.token:
+                break
+            time.sleep(1)
+
+    def update_token(self):
+        while 1:
+            try:
+                print("update token every 11 hours")
+                self.get_token()
+                time.sleep(3600 * 11)
+            except Exception as e:
+                print("update token error: wait for 60 seconds")
+                time.sleep(60)
+
+    ###获取token  12小时需要更新一次
+    def get_token(self):
+        path = "/artemis/api/v1/oauth/token"
+        base_headers = {
+            "Accept": "*/*",
+            "Content-Type": "application/json",
+        }
+        headers = self.build_signature("POST", path, base_headers)
+        print(headers)
+        post1 = self.post(self.host + path, "", headers)
+        self.token = json.loads(post1)["data"]["access_token"]
+        print(self.token)
+
+    ## 基础请求url
+    def base_request(self, url, data):
+        headers = {
+            "access_token": self.token,
+            "Content-Type": "application/json"
+        }
+        post = self.post(self.host + url, data, headers)
+        return post
+
+    def post(self, url, postData, headers):  #
+        if isinstance(postData, dict):
+            postData = json.dumps(postData)
+        postData = postData.encode("utf-8")
+        req = urllib2.Request(url, data=postData,
+                              headers=headers)
+        res = urllib2.urlopen(req, timeout=60).read().decode("utf-8")
+        return res
+
+    # 获取13位时间戳
+    def get_millisecond(self):
+        millis = int(round(time.time() * 1000))
+        return millis
+
+    def get_sha256(self, data, key):
+        key = key.encode("utf-8")
+        data = data.encode("utf-8")
+        return base64.b64encode(hmac.new(key, data, digestmod=sha256).digest()).decode("utf-8")
+
+    def build_signature(self, httpType, url, headers):
+        text = httpType + "\n"
+        for header in sorted(headers):
+            value = str(headers[header])
+            if "x-ca-" in header:
+                value = header + ":" + value
+            text += value
+            text += "\n"
+        text += url
+        sha_ = self.get_sha256(text, self.appSecret)
+        headers["x-ca-signature"] = sha_
+        headers["x-ca-key"] = self.appKey
+        headers["x-ca-nonce"] = str(uuid.uuid4())
+        return headers
+
+
+hksecure = HkSecure(host, appKey, appSecret)
+url = "/artemis/api/acs/v1/door/states"
+data = {"doorIndexCodes": ["f8f6ec5b4030477ebc9c838dc5ac670d"]}
+re = hksecure.base_request(url, data)
+print(re)

+ 48 - 0
main.py

@@ -0,0 +1,48 @@
+import json
+from Utils.Hik_iSecure import Hik_iSecure
+from Utils.Hik_Cloud import Hik_Cloud
+import datetime
+def datetime_now():
+    datetimenow = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
+    return datetimenow
+
+with open("config.json") as f:
+    f_data = json.load(f)
+    host = f_data["host"]
+    appKey = f_data["appKey"]
+    appSecret = f_data["appSecret"]
+    hik_host = f_data["hik_host"]
+    hik_client_id = f_data["hik_client_id"]
+    hik_client_secret = f_data["hik_client_secret"]
+
+HikiSecure = Hik_iSecure(host, appKey, appSecret)
+HikCloud = Hik_Cloud(hik_host,hik_client_id,hik_client_secret)
+
+# #获取海康安防系统人员列表
+# person_lists = HikiSecure.get_personlist()
+# print("%s,获取海康安防平台人员信息成功"%datetime_now())
+#
+# #获取海康云眸人员列表
+# hik_person_list = HikCloud.hik_getuserlist()
+# diff_value = set(person_lists)-set(hik_person_list)
+# print("%s,需同步人员%s个"%(datetime_now(),len(diff_value)))
+diff_value = {"0415520418954944","012827393637629142","05310840651300429"}
+if diff_value:
+    # for employee in diff_value:
+    #     employeeNo = employee
+    #     personName = person_lists[employeeNo][0]
+    #     faceImageBase64 = person_lists[employeeNo][1]
+    #     #往海康云眸添加人员
+    #     HikCloud.hik_adduser(employeeNo,personName,faceImageBase64)
+
+    #获取海康安防系统人员卡片信息
+    cards = HikiSecure.get_card(diff_value)
+    print("%s,获取海康安防平台卡片信息成功"%datetime_now())
+
+    #往海康云眸添加卡片
+    HikCloud.hik_addcard(cards)
+    #海康云眸权限组绑定人员
+    HikCloud.hik_permissiongroupspersons(groupId,diff_value)
+
+
+

+ 7 - 0
sss.py

@@ -0,0 +1,7 @@
+
+
+aa = "0112314860b2047431411"
+bb = ''.join(filter(lambda x: x.isdigit(), aa))
+print(bb)
+
+print(aa.isdigit())