基于Telethon的转发机器人可运行但无法正常转发问题求助
解决Telethon转发机器人无法实时转发指定消息的问题
问题概述
编写的Telethon转发机器人代码可运行,但发送包含vi_或ai_的消息时,机器人未执行转发操作。需求是:机器人接收含vi_或ai_的新消息后,立即将其转发给指定用户。
原代码如下:
import telethon api_id = XX api_hash = 'XX' client = telethon.TelegramClient('anon', api_id, api_hash) async def main(): await client.connect() me = await client.get_me() chat_id = me.id while True: messages = await client.get_messages(chat_id) for message in messages: if "vi_" in message.text or "ai_" in message.text: await client.forward_messages('user', message.id) with client: client.loop.run_until_complete(main())
原代码问题分析
- 轮询方式低效且无法实时触发:用
while True循环调用get_messages轮询消息,不仅会重复处理旧消息,也无法实时捕捉刚发送的新消息,导致转发不及时甚至不触发。 - 监听范围错误:将
chat_id设为自身ID,仅会轮询自己账号的消息列表,无法监听来自其他聊天的新消息(比如别人发给你的消息、指定群组的消息)。 - 转发目标参数不严谨:直接使用字符串
'user'作为转发目标,若无法正确解析为Telegram实体(如用户名、用户ID),会导致转发失败。
修正后的代码
from telethon import TelegramClient, events # 替换为你的API信息 api_id = XX api_hash = 'XX' # 替换为要转发到的目标用户(可以是用户名、用户ID或聊天实体) TARGET_USER = 'target_username_or_id' client = TelegramClient('anon', api_id, api_hash) @client.on(events.NewMessage()) async def handle_new_message(event): message = event.message # 检查消息文本是否包含指定关键词(处理消息无text的情况,比如媒体消息) if message.text and ("vi_" in message.text or "ai_" in message.text): try: await client.forward_messages(TARGET_USER, message) print(f"已转发消息:{message.text[:50]}...") except Exception as e: print(f"转发失败:{str(e)}") if __name__ == '__main__': client.start() # 保持客户端运行,持续监听事件 client.run_until_disconnected()
关键修正点说明
- 使用事件监听替代轮询:通过
@client.on(events.NewMessage())装饰器监听所有新消息,一旦有新消息触发就立即执行处理逻辑,实现实时响应。若只需监听特定聊天,可添加chats参数,比如events.NewMessage(chats=['your_chat_id_or_username'])。 - 处理消息文本为空的情况:判断消息是否有
text属性,避免媒体消息(如图片、视频)因无文本导致报错。 - 严谨处理转发目标:确保
TARGET_USER是Telegram可识别的实体,建议优先使用用户ID(数字),避免用户名变更导致失效。 - 简化客户端运行逻辑:使用
client.start()自动处理连接和登录,client.run_until_disconnected()保持客户端持续运行,无需手动管理事件循环。
内容的提问来源于stack exchange,提问作者taterut
相关产品推荐
相关产品推荐

