Telegram消息转发机器人故障:Python代码handler函数未触发
Telegram消息转发机器人Handler未触发问题排查与修复
需求与问题描述
需求:创建Telegram机器人,将指定Telegram群组/频道的消息转发至自己的Telegram群组。
以下是编写的Python代码:
import asyncio from telethon.sync import TelegramClient, events def main(): # Укажите свои api_id, api_hash и bot_token api_id = 27468555 api_hash = '0c05213e90441c28256c5ab8a0d3c266' bot_token = '6144633328:AAFGbLEpHZlsBxD81oQ5PPhdm4ly7gpIHTQ' client = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token) chat_id_group = -1001958404478 channel_source = 601230760 @client.on(events.NewMessage(chats=channel_source)) def handler(event): '''Забирает посты из телеграмм каналов и посылает их в наш канал''' message = event.message client.send_message(chat_id_group, message) client.start() client.run_until_disconnected() main()
问题:代码运行后无法正常工作,调试发现handler函数未触发。
排查与修复步骤
检查机器人的成员身份与权限
机器人必须被添加到源频道/群组中才能读取消息:- 私有频道/群组:手动邀请机器人加入,确保它能看到频道内的消息;
- 公开频道:确认机器人可以正常访问该频道(可尝试用机器人搜索频道的@用户名验证)。
修正源频道/群组的ID
你使用的channel_source = 601230760可能格式错误:- 优先使用公开频道的
@用户名(比如@test_channel),避免数字ID匹配错误; - 若用数字ID,私有频道/群组的ID通常以
-100开头(与目标群组格式一致),可通过client.get_entity("频道@用户名")命令获取正确ID。
- 优先使用公开频道的
移除重复的
client.start()调用
代码中连续调用了两次client.start(),第一次初始化时已完成登录,第二次调用会导致异常。删除第二次的client.start()即可。调整事件处理函数的异步逻辑
Telethon更推荐使用异步编程模型,同步函数可能导致事件循环异常。修改后的代码如下:import asyncio from telethon import TelegramClient, events async def main(): api_id = 27468555 api_hash = '0c05213e90441c28256c5ab8a0d3c266' bot_token = '6144633328:AAFGbLEpHZlsBxD81oQ5PPhdm4ly7gpIHTQ' client = TelegramClient('bot', api_id, api_hash) await client.start(bot_token=bot_token) chat_id_group = -1001958404478 # 替换为正确的源频道ID或@用户名 channel_source = "@your_source_channel" @client.on(events.NewMessage(chats=channel_source)) async def handler(event): message = event.message await client.send_message(chat_id_group, message) await client.run_until_disconnected() if __name__ == "__main__": asyncio.run(main())验证API凭证有效性
确认在Telegram开发者平台获取的api_id和api_hash与机器人所属账号一致,且没有权限限制。
内容的提问来源于stack exchange,提问作者Mr Полапчик
相关产品推荐
相关产品推荐

