From fca55c5cb8d5828861fd76d1c884005828957451 Mon Sep 17 00:00:00 2001 From: quantulr <35954003+quantulr@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:25:58 +0800 Subject: [PATCH] read map from config file --- hik_push/__pycache__/main.cpython-312.pyc | Bin 1807 -> 1751 bytes .../__pycache__/read_event.cpython-312.pyc | Bin 0 -> 6223 bytes hik_push/main.py | 6 +- .../__pycache__/device_map.cpython-312.pyc | Bin 677 -> 0 bytes .../event_map_mapping.cpython-312.pyc | Bin 1797 -> 0 bytes .../__pycache__/user_map.cpython-312.pyc | Bin 436 -> 0 bytes hik_push/mapping/device_map.py | 15 --- .../{event_map_mapping.py => event_map.py} | 2 +- hik_push/mapping/user_map.py | 17 ---- hik_push/read_event.py | 96 +++++------------- poetry.lock | 18 +++- pyproject.toml | 6 +- 12 files changed, 46 insertions(+), 114 deletions(-) create mode 100644 hik_push/__pycache__/read_event.cpython-312.pyc delete mode 100644 hik_push/mapping/__pycache__/device_map.cpython-312.pyc delete mode 100644 hik_push/mapping/__pycache__/event_map_mapping.cpython-312.pyc delete mode 100644 hik_push/mapping/__pycache__/user_map.cpython-312.pyc delete mode 100644 hik_push/mapping/device_map.py rename hik_push/mapping/{event_map_mapping.py => event_map.py} (98%) delete mode 100644 hik_push/mapping/user_map.py diff --git a/hik_push/__pycache__/main.cpython-312.pyc b/hik_push/__pycache__/main.cpython-312.pyc index 7c7c55b26b43a9233098a636a5ed8cc6177ff52f..bf55583e27a3980a5b9c6cd5219257c9d113fbd2 100644 GIT binary patch delta 718 zcmYjP&x_MQ6rRaUlk`Wr-GZxaLA!`xL{~xaw20tES={3uaxjF>RI)ZnnWSaAmnu~B zCK6%&6NGw`RsRPs;z2R1c=8}#3f?^VUV>#OX_5t0KUh@b=F;8z>aKyw%^IPP%Z*q{{Xjvg3}L5W7BKF1lb98+*v?rWkn<4#4I zyC)0&I0}7Ei(D8pvh1vZxGOF4`dWoh)esLc4Xu`a4J;;hJqs69AOh%&*@ z%Ks`Q6FQ-`^$TZh+cY!0coO#f$kx)!wDV?%HYv4JU%N~7^qsa-YJ#qkHre;~8bp7v zO|1fCTt!i$PC?j6%lz;X3T;j4C};u18bG&Oh|6*;!^Bm+u{sU(iS#$W%{B>1_vrdG z;Xvg}P@%nMb5>;FmDqfH-?*}oKmN@#um#JQHykPxG^z{$gfSZXy-0-_Q=?FIv4Un5 z9(J+60RAHdEhpua{Dhr1+5YU#w z+o9G0GNbRsi8u5W+E*onF7jOXy+q;sjNO;T5oLTB#Yz6}xdq%I^aAO+YVA69F0KAG zH-kuw2J(iw00q1m@eE+WD5XcF`jebHBK05SVtSz8YhPQKgx8+#e`2k#y!!agf)U=% Ghy4S$u#YbQ delta 741 zcmX|9&x_MQ6rRaUlQd~|wXG~|UED3j`~WVT53?X%7JES7)i)g z$D%eYOJ^mw(v_GzqL$(6_m{I>Tx%&~Jo7Vkgyyk};9nK~yXCnbvYFd7tJyQ@cIg=8R&CnKK0Q~Y;!r40Z8 diff --git a/hik_push/__pycache__/read_event.cpython-312.pyc b/hik_push/__pycache__/read_event.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..963ceacb3a49801ef2236272c175a5756cb24392 GIT binary patch literal 6223 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 Y#D{EsnR8{25n)g3!iF%GYoHSUAICYR4FCWD literal 0 HcmV?d00001 diff --git a/hik_push/main.py b/hik_push/main.py index e251287..8ad020a 100644 --- a/hik_push/main.py +++ b/hik_push/main.py @@ -1,10 +1,8 @@ -import asyncio import json -from typing import Dict from redis import asyncio as aioredis import uvicorn -from fastapi import FastAPI, BackgroundTasks, UploadFile +from fastapi import FastAPI, BackgroundTasks app = FastAPI() @@ -27,7 +25,7 @@ async def event_rcv(data: dict, background_tasks: BackgroundTasks): def run_app(): - uvicorn.run("main:app", host="0.0.0.0", port=8000) + uvicorn.run(app=app, host="0.0.0.0", port=8000) if __name__ == "__main__": diff --git a/hik_push/mapping/__pycache__/device_map.cpython-312.pyc b/hik_push/mapping/__pycache__/device_map.cpython-312.pyc deleted file mode 100644 index 23c493e38faeb49383b85c0b1ea7ad1f3afc5eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmX@j%ge<81lqitQ#qIz7#@Q-Fu(_8d{zN6rZc24q%fv1r7)+kq_C#2rLd=Pq;RHi zrEsV4r0~w+jbfKx3qIMgHs27U*AS21Cp+d~*J}jPYmCs#19FEUl3@_1 zIwCn0ti)0msOM>4_tTjxO2GnVNCIFzE=b6p04LkXT?Gu>j+V6=)-NU;;@5 zCXr-d3P}Z~k#t}N$pmJRY+w$_1?G`_U;!xv7Lk2!5$>~}9DwQ|IRrdRjsTC6V&E}y z99Tk5087b9;3;w%SVqnO&ysTBIdUF&fm{SukW0Wyav4}ft^lu+YTz|;-7U_Eq=wue zH_0thOWq=HlREMaxjkW-6F(NZ>xWcsbxtVTzQ_#mMk@C$Ft<~6j>;or)Vep7`a^8!TiRfxa5rgWnQh%?8yoaJ zBUMLNl=aC-YBN&SH!nZvRYG6GUeMH?^!aFbdyqM{*kUhD#}s#gIi9eIWokES=^KaY z_t5u^QT!=o|CsFWr`ed|uBe{p>g;3O*Uj&6@d?IoWp!N%_-W#<;p*h~N@%$H!`n2; zNG11RczZ%w>ybv+Xfmd_qsq#P9N3U1r)dgC`tC3GDYHGw(k2_6W@Arj8eY(sy&P1> zhiHZ|Bb$YH6Of-d;gr!#Bb8hpIS}HHq|e6#IA&7s6LoS%Ki|^E0$X3?r*9_+_;v+K z?+Z5cOqzATsn$DWr(eGRVt4Rh3bMU{>J9D+;HAn70mAg=DgxB!)gg13H6^%7*OwZW6|TdThQatYc(snjpugs z1n}Q%`C1|tNqC`7OGZ!OO{wT<+|$uBxM!kganDB2;hu}0$2}jtfO{c&5%+!Q`*nYH z0R14(51}9Cegyp}_hR&8+>fJ|a6f@wie9UoL_fv-GIR`z7>B^g8V_dKEYhzJkS75wFy0)go5c^r~LFu2(g@dUZpuZo=cN}S{msY znpx->>KPiL@QhJ-CMY~p6rLFh&m4tkfx@#y<{25F@C;FSC~h%Aaf^|OpC;oij?&`P zqWIjzf|U%PK|cTGgQ)lo5i$Je Pqr3nQQzJ(a3s5fr>t<@9 diff --git a/hik_push/mapping/device_map.py b/hik_push/mapping/device_map.py deleted file mode 100644 index a52c4b0..0000000 --- a/hik_push/mapping/device_map.py +++ /dev/null @@ -1,15 +0,0 @@ -device_map = { - "192.168.1.12": "4GB-供油站", - "192.168.1.13": "T2变电所", - "192.168.1.14": "二厂平台~西", - "192.168.1.15": "二厂平台~中o1", - "192.168.1.16": "T1变电所", - "192.168.1.17": "二厂平台~东", - "192.168.1.18": "二厂平台~中o2", - "192.168.1.19": "T3变电所", - "192.168.1.20": "T11变电所", - "192.168.1.21": "4GA-供油站", - "192.168.1.22": "T9-变压器", - "192.168.1.23": "T6-变压器", - "192.168.1.24": "4DB-供油站", -} diff --git a/hik_push/mapping/event_map_mapping.py b/hik_push/mapping/event_map.py similarity index 98% rename from hik_push/mapping/event_map_mapping.py rename to hik_push/mapping/event_map.py index 73f4b08..2931d86 100644 --- a/hik_push/mapping/event_map_mapping.py +++ b/hik_push/mapping/event_map.py @@ -1,4 +1,4 @@ -mapping = { +event_map = { 131329: '视频丢失', 131330: '视频遮挡', 131331: '移动侦测', diff --git a/hik_push/mapping/user_map.py b/hik_push/mapping/user_map.py deleted file mode 100644 index e332f42..0000000 --- a/hik_push/mapping/user_map.py +++ /dev/null @@ -1,17 +0,0 @@ -user_map = { - "192.168.1.12": [ - - ], - "192.168.1.13": [], - "192.168.1.14": [], - "192.168.1.15": [], - "192.168.1.16": [], - "192.168.1.17": [], - "192.168.1.18": [], - "192.168.1.19": [], - "192.168.1.20": [], - "192.168.1.21": [], - "192.168.1.22": [], - "192.168.1.23": [], - "192.168.1.24": [], -} diff --git a/hik_push/read_event.py b/hik_push/read_event.py index d9c7ab7..0c92705 100644 --- a/hik_push/read_event.py +++ b/hik_push/read_event.py @@ -1,82 +1,27 @@ import asyncio import json -from io import BytesIO +from pathlib import Path -import requests - -from custom_exception import FeishuAuthException -from mapping.event_map_mapping import mapping -from mapping.device_map import device_map -from mapping.user_map import user_map +import yaml +from hik_push.mapping.event_map import event_map from redis import asyncio as aioredis -app_id = "cli_a525f3d78e3e500c" -app_secret = "JVhnbKfXifddjHVwcTqbEfn1rDQBYqDD" - -headers = {"Authorization": ""} - - -def get_access_token(api_id, secret): - url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" - data = { - "app_id": api_id, - "app_secret": secret - } - resp = requests.post(url, data=data).content.decode('utf-8') - return json.loads(resp)['tenant_access_token'] - - -# 获取事件的图片 -def get_image_url(event): - analysis_key = mapping.get(event['eventType'])['detection_key'] - if analysis_key is None: - return None - images = [] - for el in event['data'][analysis_key]: - images.append(el['imageUrl']) - if len(images) == 0: - return None - return images - - -def get_value_by_nested_key(my_dict, nested_key): - ret = my_dict - for key in nested_key: - ret = ret[key] - return ret - - -# 上次图片到飞书 -def upload_image(url): - image_content = requests.get(url).content - payload = {'image_type': 'message'} - files = [ - ('image', ('file', BytesIO(image_content), 'application/octet-stream')) - ] - image = requests.request("POST", "https://open.feishu.cn/open-apis/im/v1/images", data=payload, - files=files, headers=headers).content.decode('utf-8') - data = json.loads(image) - code = data['code'] - if code == 99991663: - raise FeishuAuthException - image_key = json.loads(image)['data']['image_key'] - return image_key - - -# 推送到飞书 -def push_to_feishu(data): - push_url = "https://open.feishu.cn/open-apis/message/v4/batch_send/" - data = json.dumps(data) - r = requests.post(push_url, data=data, headers=headers).content.decode('utf-8') - data = json.loads(r) - code = data['code'] - if code == 99991663: - raise FeishuAuthException - print(r) - async def read_event(): + # 读取配置文件 + home_dir = Path.home() + with open(home_dir / '.config' / 'hik-push' / 'config.yaml', 'r', encoding='utf-8') as f: + config = yaml.safe_load(f) + if "user_ids" not in config: + print("请配置user_ids") + return + if "devices" not in config: + print("请配置devices") + return + print(config) + user_map = config['user_ids'] + device_map = config['devices'] redis_client = await aioredis.Redis(host="127.0.0.1", port=6379) while True: data = await redis_client.brpop("hik-sub-event") @@ -86,7 +31,7 @@ async def read_event(): for event in events: # 将eventType ID 替换为中文字符串 event_type = event['eventType'] - event_type_str = mapping.get(event_type, "未知事件类型") + event_type_str = event_map.get(event_type, "未知事件类型") event['eventType'] = event_type_str if "data" in event: # 如果存在 data 属性 @@ -112,7 +57,12 @@ async def read_event(): except Exception as e: print("error: ", e) continue - await asyncio.sleep(0.5) + finally: + await asyncio.sleep(0.5) + + +def run_app(): + asyncio.run(read_event()) if __name__ == "__main__": diff --git a/poetry.lock b/poetry.lock index b2d0896..0dedcb5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,6 +31,17 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + [[package]] name = "certifi" version = "2023.11.17" @@ -768,6 +779,9 @@ files = [ {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"}, ] +[package.dependencies] +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} + [package.extras] hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] @@ -1161,5 +1175,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "^3.12" -content-hash = "00976ed3a44ab76661d8b7e8a5c2a90a324be8dda00b9467ef57a5a8ee139489" +python-versions = ">=3.11" +content-hash = "9cd979c9426ddc879502c540f0abfc73c4e970e206a58ccf29df4abe53c98e9a" diff --git a/pyproject.toml b/pyproject.toml index b8301c3..116a12c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,11 @@ authors = ["quantulr <35954003+quantulr@users.noreply.github.com>"] readme = "README.md" [tool.poetry.dependencies] -python = "^3.12" +python = ">=3.11" fastapi = { extras = ["all"], version = "^0.109.0" } redis = "^5.0.1" requests = "^2.31.0" +pyyaml = "^6.0.1" [build-system] @@ -18,4 +19,5 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -hik-push = 'hik_push.main:run_app' \ No newline at end of file +hik-sub = 'hik_push.main:run_app' +hik-push = 'hik_push.read_event:run_app'