前言
一直以来 websocket 相应消息的接收都是有问题,之前想过很多办法,包括设置 sleep 等待,设置标志等的来分离 recv 来处理正确的响应,但是始终都没成功,这次改变了一下思路成功了
修改前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 发送群消息并获取消息 ID async def send_group_msg_with_reply(websocket, group_id, content): try: message = { "action": "send_group_msg", "params": {"group_id": group_id, "message": content}, } await websocket.send(json.dumps(message)) response = json.loads(await websocket.recv()) message_id = response.get("data", {}).get("message_id") logging.info( f"[API]已发送群消息: {content} 到群 {group_id},消息ID: {message_id}" ) return message_id except Exception as e: logging.error(f"[API]发送群消息(带回复)失败: {e}") return None
|
例如这个发送群消息并获取消息 ID 的函数,一开始消息处理的速度很快,几乎是毫秒级回应,所以一直没怎么处理,也不影响正常运行
今天在扩展违禁词监控的时候,新增了一个触发违禁词之后检查之后的聊天记录,如果发现有违规者发送了视频,就直接撤回。
修改后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 发送群消息并获取消息 ID async def send_group_msg_with_reply(websocket, group_id, content): try: message = { "action": "send_group_msg", "params": {"group_id": group_id, "message": content}, "echo": "send_group_msg_with_reply", } await websocket.send(json.dumps(message)) while True: response = await websocket.recv() response_data = json.loads(response) if response_data.get("echo") == "send_group_msg_with_reply": message_id = response_data.get("data", {}).get("message_id") logging.info(f"[API]已发送群消息到群 {group_id},消息ID: {message_id}") return message_id except Exception as e: logging.error(f"[API]发送群消息(带回复)失败: {e}") return None
|
修改后的函数添加了循环遍历,并使用 ob11 提供的 echo 字段来做标记。
这样就可以循环遍历,通过遍历收到的消息中符合 echo 对应的消息,就可以摘出想要的回应消息,以便于信息的处理