From 6aa5a836b94031c1cee64d203a717e9b86111780 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 5 Jun 2024 18:40:00 +0800 Subject: [PATCH] fix webpush api --- app/api/endpoints/message.py | 6 +-- app/modules/webpush/__init__.py | 66 +++++++++++++++++++++++++++++++++ app/schemas/types.py | 1 + 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 app/modules/webpush/__init__.py diff --git a/app/api/endpoints/message.py b/app/api/endpoints/message.py index dbe3a382..1cf72c33 100644 --- a/app/api/endpoints/message.py +++ b/app/api/endpoints/message.py @@ -159,7 +159,7 @@ def set_switchs(switchs: List[NotificationSwitch], return schemas.Response(success=True) -@router.post("/subscribe", summary="客户端webpush通知订阅", response_model=schemas.Response) +@router.post("/webpush/subscribe", summary="客户端webpush通知订阅", response_model=schemas.Response) def subscribe(subscription: schemas.Subscription, _: schemas.TokenPayload = Depends(verify_token)): """ 客户端webpush通知订阅 @@ -168,7 +168,7 @@ def subscribe(subscription: schemas.Subscription, _: schemas.TokenPayload = Depe return schemas.Response(success=True) -@router.post("/send-webpush", summary="发送webpush通知", response_model=schemas.Response) +@router.post("/webpush/send", summary="发送webpush通知", response_model=schemas.Response) def send_notification(payload: schemas.SubscriptionMessage, _: schemas.TokenPayload = Depends(verify_token)): """ 发送webpush通知 @@ -178,7 +178,7 @@ def send_notification(payload: schemas.SubscriptionMessage, _: schemas.TokenPayl webpush( subscription_info=sub, data=json.dumps(payload.dict()), - vapid_private_key=settings.VAPID.get("private_key"), + vapid_private_key=settings.VAPID.get("privateKey"), vapid_claims={ "sub": settings.VAPID.get("subject") }, diff --git a/app/modules/webpush/__init__.py b/app/modules/webpush/__init__.py new file mode 100644 index 00000000..d6399a81 --- /dev/null +++ b/app/modules/webpush/__init__.py @@ -0,0 +1,66 @@ +import json +from typing import Union, Tuple + +from pywebpush import webpush, WebPushException + +from app.core.config import global_vars, settings +from app.log import logger +from app.modules import _ModuleBase, checkMessage +from app.schemas import MessageChannel, Notification + + +class WebPushModule(_ModuleBase): + def init_module(self) -> None: + pass + + @staticmethod + def get_name() -> str: + return "VoceChat" + + def stop(self): + pass + + def test(self) -> Tuple[bool, str]: + """ + 测试模块连接性 + """ + return True, "" + + def init_setting(self) -> Tuple[str, Union[str, bool]]: + pass + + @checkMessage(MessageChannel.WebPush) + def post_message(self, message: Notification) -> None: + """ + 发送消息 + :param message: 消息内容 + :return: 成功或失败 + """ + if not message.title and not message.text: + logger.warn("标题和内容不能同时为空") + return + try: + if message.title: + caption = message.title + content = message.text + else: + caption = message.text + content = "" + try: + for sub in global_vars.get_subscriptions(): + webpush( + subscription_info=sub, + data=json.dumps({ + "title": caption, + "body": content + }), + vapid_private_key=settings.VAPID.get("privateKey"), + vapid_claims={ + "sub": settings.VAPID.get("subject") + }, + ) + except WebPushException as err: + print("WebPush Error:", str(err)) + + except Exception as msg_e: + logger.error(f"发送消息失败:{msg_e}") diff --git a/app/schemas/types.py b/app/schemas/types.py index cde3ec20..e2fbba9d 100644 --- a/app/schemas/types.py +++ b/app/schemas/types.py @@ -138,6 +138,7 @@ class MessageChannel(Enum): SynologyChat = "SynologyChat" VoceChat = "VoceChat" Web = "Web" + WebPush = "WebPush" # 用户配置Key字典