Python Telegram机器人问题:无法订阅频道及点击消息按钮
问题修复方案
问题1:无法订阅指定频道
原因
- 频道链接提取依赖字符串分割,若消息中链接格式稍有变化(如后跟标点)就会提取错误
JoinChannelRequest传入纯username时可能无法正确解析,缺少实体转换步骤- 未处理订阅时的异常场景(如已订阅、权限不足)
修复措施
- 改用正则表达式提取频道username,提升解析稳定性
- 通过
client.get_entity()将username转换为频道实体后再发起订阅 - 添加异常捕获,输出错误信息便于排查问题
问题2:无法点击「♻️ Проверить」按钮
原因
- 错误判断按钮类型:Telethon中内联按钮实际为
InlineKeyboardButton,而非MessageButton - 未匹配目标按钮的文本,直接点击第一个按钮可能并非目标按钮
- 按钮点击逻辑未绑定当前消息上下文
修复措施
- 遍历内联键盘按钮时,检查按钮文本是否为目标文本「♻️ Проверить」
- 确保按钮点击时上下文正确,避免无效触发
- 补充按钮不存在的精确判断逻辑
修改后的完整代码
import asyncio import re from telethon import TelegramClient, events from telethon.tl.functions.channels import JoinChannelRequest from telethon.errors.rpcerrorlist import AlreadyInChannelError api_id = 'api_id' api_hash = 'api_hash' client = TelegramClient('session_name', api_id, api_hash) channel_username = 'channel_username' bot_username = 'bot_username' async def handle_channel_message(event): print("Сообщение из канала:", event.message.text) await client.send_message(bot_username, 'кликать') @client.on(events.NewMessage(chats=[bot_username])) async def bot_message_handler(event): print("Сообщение от бота:", event.message.text) if 'https://t.me/' in event.message.text and '♻️ Проверить' in event.message.text: # 正则提取频道username,适配更多格式 channel_match = re.search(r'https://t\.me/(\w+)', event.message.text) if not channel_match: print("未找到有效频道链接") return channel_target = channel_match.group(1) # 处理频道订阅,包含异常捕获 try: channel_entity = await client.get_entity(channel_target) await client(JoinChannelRequest(channel_entity)) print(f"成功订阅频道: {channel_target}") except AlreadyInChannelError: print(f"已订阅频道: {channel_target}") except Exception as e: print(f"订阅频道失败: {str(e)}") return await asyncio.sleep(2) # 定位并点击目标按钮 if event.message.reply_markup and event.message.reply_markup.inline_keyboard: for button_row in event.message.reply_markup.inline_keyboard: for button in button_row: if button.text == '♻️ Проверить': await button.click() print(f"成功点击「♻️ Проверить」按钮") return print("未找到「♻️ Проверить」按钮") else: print("消息中无内联按钮") @client.on(events.NewMessage(chats=[channel_username])) async def channel_message_handler(event): await handle_channel_message(event) async def main(): await client.start() await client.run_until_disconnected() if __name__ == '__main__': asyncio.run(main())
内容的提问来源于stack exchange,提问作者Dilshodbek Sobirjonov
相关产品推荐
相关产品推荐

