@@ -130,6 +130,7 @@ async def handler(event):
130130 self ._sync_api = None
131131 self ._bus = EventBus ()
132132 self ._before_sending_funcs = set ()
133+ self ._after_wsr_func = None
133134 self ._loop = None
134135
135136 self ._server_app = Quart (import_name , ** (server_app_kwargs or {}))
@@ -454,7 +455,8 @@ async def startup():
454455
455456 def on_websocket_connection (self , func : Callable ) -> Callable :
456457 """
457- 注册 WebSocket 连接元事件处理函数,等价于 ``on_meta_event('lifecycle.connect')``,例如:
458+ 注册 WebSocket 连接元事件处理函数,等价于 ``on_meta_event('lifecycle.connect')``
459+ 注意:若 OneBot 端不可信,请使用 bot.server_app.before_websocket
458460
459461 ```py
460462 @bot.on_websocket_connection
@@ -465,6 +467,25 @@ async def handler(event):
465467 """
466468 return self .on_meta_event ('lifecycle.connect' )(func )
467469
470+ def on_websocket_receive (self , func : Callable ) -> Callable :
471+ """
472+ 注册 WebSocket 调用 receive() 后对 payload 的后处理函数,
473+ 可用于对 WebSocket 每次上报内容的鉴权/验证
474+ 暂时仅支持注册1个
475+
476+ 注:对于 HTTP 上报,你可以使用 bot.server_app.before_request;
477+ 对于 WebSocket 的首次连接,你可以使用 bot.server_app.before_websocket 验证其 Header
478+
479+ ```py
480+ @bot.on_websocket_receive
481+ async def handler(payload: bytes):
482+ return payload
483+ """
484+ if self ._after_wsr_func :
485+ raise RuntimeError ("`on_websocket_receive` can only register once." )
486+ self ._after_wsr_func = func
487+ return func
488+
468489 async def _handle_http_event (self ) -> Response :
469490 if self ._secret :
470491 if 'X-Signature' not in request .headers :
@@ -517,8 +538,11 @@ async def _handle_wsr_event(self) -> None:
517538 self ._add_wsr_event_client ()
518539 try :
519540 while True :
541+ payload = await websocket .receive ()
542+ if self ._after_wsr_func :
543+ payload = await self ._after_wsr_func (payload )
520544 try :
521- payload = json .loads (await websocket . receive () )
545+ payload = json .loads (payload )
522546 except ValueError :
523547 payload = None
524548
@@ -534,10 +558,14 @@ async def _handle_wsr_api(self) -> None:
534558 self ._add_wsr_api_client ()
535559 try :
536560 while True :
561+ payload = await websocket .receive ()
562+ if self ._after_wsr_func :
563+ payload = await self ._after_wsr_func (payload )
537564 try :
538- ResultStore . add ( json .loads (await websocket . receive ()) )
565+ payload = json .loads (payload )
539566 except ValueError :
540567 pass
568+ ResultStore .add (payload )
541569 finally :
542570 self ._remove_wsr_api_client ()
543571
@@ -546,8 +574,11 @@ async def _handle_wsr_universal(self) -> None:
546574 self ._add_wsr_event_client ()
547575 try :
548576 while True :
577+ payload = await websocket .receive ()
578+ if self ._after_wsr_func :
579+ payload = await self ._after_wsr_func (payload )
549580 try :
550- payload = json .loads (await websocket . receive () )
581+ payload = json .loads (payload )
551582 except ValueError :
552583 payload = None
553584
0 commit comments