diff --git a/001测试海康api.py b/001测试海康api.py index 266d99e..e5dfa24 100644 --- a/001测试海康api.py +++ b/001测试海康api.py @@ -2,7 +2,7 @@ from util.haikang_util import HaikangUtil import asyncio import base64 import json - +import os @@ -101,6 +101,84 @@ async def query_visitor_record(): async def query_visitor_record_pictures_service(svrIndexCode, picUri): await HaikangUtil.query_visitor_record_pictures(svrIndexCode, picUri) + +async def get_all_visitor_pictures(pageNo=1, pageSize=10, visitorStatus=1): + + + result = await HaikangUtil.query_visitor_record(pageNo=pageNo, pageSize=pageSize, visitorStatus=visitorStatus) + + visitor_list = list() + if result[0]: + total = result[1]['total'] + visitor_list += result[1]['list'] + while pageNo*pageSize < total: + pageNo += 1 + result = await HaikangUtil.query_visitor_record(pageNo=pageNo+1, pageSize=pageSize, visitorStatus=visitorStatus) + if result[0]: + visitor_list += result[1]['list'] + else: + break + # + # print(visitor_list) + + with open("./visitor/visitorIds.txt", "r", encoding="utf-8") as f: + visitor_ids = [line.rstrip('\n') for line in f] + # print(visitor_ids) + visitor_ids_add = list() + for visitor in visitor_list: + if visitor["visitorId"] not in visitor_ids: + visitor_ids_add.append(visitor["visitorId"]) + # 获取图片 + try: + await HaikangUtil.query_visitor_record_pictures(visitor["svrIndexCode"], visitor["picUri"], f"./visitor/face_images/{visitor['visitorName']}.jpg") + await asyncio.sleep(1) + except Exception as e: + print(e, visitor["visitorId"]) + + with open("./visitor/visitorIds.txt", "a", encoding="utf-8") as f: + for visitor_id in visitor_ids_add: + f.write(visitor_id + "\n") + + + +async def get_all_employee_pictures(pageNo=1, pageSize=500): + + result = await HaikangUtil.get_person_list(pageNo=pageNo, pageSize=pageSize) + + employee_list = list() + if result[0]: + total = result[1]['total'] + employee_list += result[1]['list'] + while pageNo * pageSize < total: + pageNo += 1 + result = await HaikangUtil.get_person_list(pageNo=pageNo + 1, pageSize=pageSize, ) + if result[0]: + employee_list += result[1]['list'] + else: + break + + + with open("./employee/personIds.txt", "r", encoding="utf-8") as f: + person_ids = [line.rstrip('\n') for line in f] + # print(visitor_ids) + person_ids_add = list() + for employee in employee_list: + if employee["visitorId"] not in person_ids: + person_ids_add.append(employee["visitorId"]) + # 获取图片 + try: + await HaikangUtil.get_person_picture(employee["serverIndexCode"], employee["picUri"], f"./employee/face_images/{employee['personName']}.jpg") + await asyncio.sleep(1) + except Exception as e: + print(e, employee["visitorId"]) + + with open("./employee/personIds.txt", "a", encoding="utf-8") as f: + for person_id in person_ids_add: + f.write(person_id + "\n") + + + + if __name__ == '__main__': #asyncio.run(get_door_list_service()) # print("*"*100) @@ -113,12 +191,13 @@ if __name__ == '__main__': #asyncio.run(get_face_group_service()) - # image_path = "./a7b3c794281902041c9b823df7667ce7.jpg" + # image_path = "./测试图片1.jpg" # asyncio.run(face_group_1vN_search_service(image_path)) #asyncio.run(face_picture_check(image_path)) #asyncio.run(query_visitor_record()) - asyncio.run(query_visitor_record_pictures_service("80890167-b8d4-4e33-af35-94db87c90816" - , "/pic?0de900=71f0ip-4eo881-342*fo1=9=8522*4l5373169147*1t1=0*0ps==418b*=6127*38da35a12-8338cd-9*l168od0f1f1=002")) + # asyncio.run(query_visitor_record_pictures_service("80890167-b8d4-4e33-af35-94db87c90816" + # , "/pic?0de900=71f0ip-4eo881-342*fo1=9=8522*4l5373169147*1t1=0*0ps==418b*=6127*38da35a12-8338cd-9*l168od0f1f1=002")) #asyncio.run(door_online_status_service(["d4a610b6554d4544bc35dd3138f128b0"])) + asyncio.run(get_all_visitor_pictures()) diff --git a/config/__pycache__/env.cpython-310.pyc b/config/__pycache__/env.cpython-310.pyc index 413bfa9..052404a 100644 Binary files a/config/__pycache__/env.cpython-310.pyc and b/config/__pycache__/env.cpython-310.pyc differ diff --git a/config/env.py b/config/env.py index ab43f22..eaf9225 100644 --- a/config/env.py +++ b/config/env.py @@ -35,6 +35,11 @@ class HaiKangSettings: HAIKANG_VISITOR_RECORD_SEARCH = '/api/visitor/v2/appointment/records' HAIKANG_VISITOR_RECORD_PICTURES = '/api/visitor/v1/record/pictures' + HAIKANG_PERSON_LIST = '/api/resource/v2/person/personList' + HAIKANG_GET_PERSON_PICTURE = '/api/resource/v1/person/picture' + + HAIKANG_FACE_SAVE_PATH = "./face_images" + class GetConfig: """ diff --git a/employee/personIds.txt b/employee/personIds.txt new file mode 100644 index 0000000..1c943a9 --- /dev/null +++ b/employee/personIds.txt @@ -0,0 +1,3 @@ +a +b +c \ No newline at end of file diff --git a/util/haikang_util.py b/util/haikang_util.py index 27c01bb..89e51ee 100644 --- a/util/haikang_util.py +++ b/util/haikang_util.py @@ -98,12 +98,10 @@ class HaikangUtil: response = await client.request( method, url, headers=headers, content=body, timeout=60 ) - if response.status_code in (301, 302, 303, 307, 308): location = response.headers.get("Location") - # 可能需要处理成 GET 请求或保留原方法 + # 可能需要处理成 GET 请求或保留原方法 response = await client.get(location, headers=headers) - response.raise_for_status() # if response.status_code >= 400: # logger.error(f"发送请求失败: {url} , {response.status_code} {response.text}") @@ -466,7 +464,7 @@ class HaikangUtil: # 获取访客记录中的图片 @classmethod - async def query_visitor_record_pictures(cls, svrIndexCode: str, picUri: str): + async def query_visitor_record_pictures(cls, svrIndexCode: str, picUri: str, save_path: str="persion.jpg"): """获取访客记录中的图片 Args: @@ -490,7 +488,53 @@ class HaikangUtil: back = await cls.send_request("POST", url, headers, body_json, False) - with open("person.jpg", 'wb') as f: + with open(save_path, 'wb') as f: + for chunk in back.iter_bytes(chunk_size=8192): + if chunk: # 忽略 keep-alive 的空 chunk + f.write(chunk) + + + + # 获取人员列表 + @classmethod + async def get_person_list(cls, pageNo: int = 1, pageSize: int = 10): + url = f"{HaiKangConfig.HAIKANG_URL}:{HaiKangConfig.HAIKANG_PORT}/artemis{HaiKangConfig.HAIKANG_PERSON_LIST}" + body_dict = { + "pageNo": pageNo, + "pageSize": pageSize, + } + body_json = json.dumps(body_dict, separators=(",", ":")) + + headers = cls.build_signed_headers( + "POST", url, body_json, HaiKangConfig.HAIKANG_AK, HaiKangConfig.HAIKANG_SK + ) + + back = await cls.send_request("POST", url, headers, body_json) + + if back["code"] == "0": + return [True, back["data"]] + else: + return [False, back["code"], back["msg"]] + + # 提取人员图片 + @classmethod + async def get_person_picture(cls, serverIndexCode, picUri, save_path: str="persion.jpg"): + + url = f"{HaiKangConfig.HAIKANG_URL}:{HaiKangConfig.HAIKANG_PORT}/artemis{HaiKangConfig.HAIKANG_GET_PERSON_PICTURE}" + body_dict = { + "serverIndexCode": serverIndexCode, + "picUri": picUri, + } + + body_json = json.dumps(body_dict, separators=(",", ":")) + + headers = cls.build_signed_headers( + "POST", url, body_json, HaiKangConfig.HAIKANG_AK, HaiKangConfig.HAIKANG_SK + ) + + back = await cls.send_request("POST", url, headers, body_json, False) + + with open(save_path, 'wb') as f: for chunk in back.iter_bytes(chunk_size=8192): if chunk: # 忽略 keep-alive 的空 chunk f.write(chunk) diff --git a/visitor/face_images/测试图片1.jpg b/visitor/face_images/测试图片1.jpg new file mode 100644 index 0000000..6142b66 Binary files /dev/null and b/visitor/face_images/测试图片1.jpg differ diff --git a/visitor/visitorIds.txt b/visitor/visitorIds.txt new file mode 100644 index 0000000..27a7ea6 --- /dev/null +++ b/visitor/visitorIds.txt @@ -0,0 +1,4 @@ +a +b +c +d \ No newline at end of file