使用fbchat未收到正确消息,代码中abc(message_object)调用存在问题
解决fbchat聊天机器人无法正常接收消息的问题
嘿,我之前也踩过fbchat消息处理的坑,结合你的代码来看,核心问题肯定出在onMessage里调用abc(message_object)这一步。下面是几个最可能的原因和对应的解决办法:
1. abc函数阻塞了客户端的事件循环
fbchat的客户端是靠异步事件循环来处理消息的,如果abc是个同步的耗时函数(比如要发网络请求、做大量计算),它会直接卡住整个消息处理线程,导致后续的消息根本没法被接收和处理。
解决办法:
把onMessage改成异步方法,然后用异步的方式调用abc:
from fbchat import log, Client, Message from ais import abc import asyncio class EchoBot(Client): async def onMessage(self, author_id, message_object, thread_id, thread_type, **kwargs): self.markAsDelivered(author_id, thread_id) self.markAsRead(author_id) log.info("{} from {} in {}".format(message_object, thread_id, thread_type.name)) if author_id != self.uid: # 如果abc本身是异步函数,直接await await abc(message_object) # 如果abc是同步函数,用to_thread包装成异步任务 # asyncio.create_task(asyncio.to_thread(abc, message_object)) client = EchoBot("your_email", "your_password") client.listen()
2. abc修改了原message_object的状态
fbchat的message_object是客户端内部用来管理消息的实例,如果abc函数里对这个对象做了一些意外的修改(比如删属性、改内部状态),会干扰客户端后续的消息处理流程,导致接收异常。
解决办法:
别直接传原对象,要么提取需要的字段(比如消息文本)传进去,要么传一个对象副本:
if author_id != self.uid: # 只传消息文本(最常用的场景) msg_content = message_object.text abc(msg_content) # 如果需要完整的消息信息,传副本 from copy import deepcopy msg_copy = deepcopy(message_object) abc(msg_copy)
3. abc抛出了未捕获的异常
如果abc执行时出了错但没被捕获,会直接打断onMessage的执行流程,严重的话甚至会让客户端崩溃,自然没法接收消息了。
解决办法:
给abc的调用加个异常捕获:
if author_id != self.uid: try: abc(message_object) except Exception as e: log.error(f"调用abc时出错了: {str(e)}") # 还可以给用户回个消息告知出错 self.send(Message(text="哎呀,处理你的消息时出了点小问题😅"), thread_id=thread_id, thread_type=thread_type)
4. 版本兼容性问题
不同版本的fbchat对message_object的结构定义可能不一样,如果abc是基于旧版本的fbchat写的,在新版本里调用就会出错。
解决办法:
- 检查
ais模块的abc函数适配的fbchat版本,然后安装对应的版本:
pip install fbchat==1.9.0 # 替换成你确认兼容的版本号
- 或者修改
abc函数,适配当前使用的fbchat版本的message_object结构。
内容的提问来源于stack exchange,提问作者Display name
相关产品推荐
相关产品推荐

