Python Telegram Bot带按钮消息回调错误排查及解决
Python Telegram Bot 按钮交互报错
TypeError: attribute name must be string, not 'int' 解决方法 问题场景
我需要实现一个Python Telegram Bot,需求如下:
- Bot启动后自动发送带按钮的消息,无需用户触发命令
- 用户点击按钮后,Bot识别点击的按钮并修改原消息文本
基于官方示例修改代码后,点击按钮触发了如下报错:
TypeError: attribute name must be string, not 'int'
错误原因
排查代码后发现,在按钮回调的判断逻辑里,误将query.data写成了query。query是CallbackQuery类型的对象,直接将其与字符串(按钮的callback_data值)进行比较时,会触发类型不匹配的错误。
修正方案
错误代码片段
def button(update: Update, context: CallbackContext) -> None: query = update.callback_query query.answer() # 错误:直接用query对象和字符串比较 if query == "btn1": query.edit_message_text(text="你点击了按钮1") elif query == "btn2": query.edit_message_text(text="你点击了按钮2")
正确代码片段
将判断条件中的query替换为query.data,query.data才是按钮设置的callback_data字符串值:
def button(update: Update, context: CallbackContext) -> None: query = update.callback_query query.answer() # 修正:使用query.data获取按钮的回调数据 if query.data == "btn1": query.edit_message_text(text="你点击了按钮1") elif query.data == "btn2": query.edit_message_text(text="你点击了按钮2")
完整可运行代码示例
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CallbackContext, CallbackQueryHandler def button(update: Update, context: CallbackContext) -> None: query = update.callback_query query.answer() if query.data == "btn1": query.edit_message_text(text="你点击了按钮1") elif query.data == "btn2": query.edit_message_text(text="你点击了按钮2") def main() -> None: # 替换为你的Bot Token updater = Updater("YOUR_TELEGRAM_BOT_TOKEN") dp = updater.dispatcher # 注册按钮回调处理器 dp.add_handler(CallbackQueryHandler(button)) # Bot启动后自动发送带按钮的消息,替换为目标聊天ID target_chat_id = 123456789 keyboard = [ [InlineKeyboardButton("按钮1", callback_data="btn1")], [InlineKeyboardButton("按钮2", callback_data="btn2")] ] reply_markup = InlineKeyboardMarkup(keyboard) updater.bot.send_message( chat_id=target_chat_id, text="请选择下方按钮", reply_markup=reply_markup ) updater.start_polling() updater.idle() if __name__ == "__main__": main()
总结
这个错误的核心是混淆了CallbackQuery对象和它的data属性:
query是一个包含回调所有信息的对象,不能直接与字符串比较query.data对应按钮设置的callback_data字段,是字符串类型,用来识别用户点击的具体按钮
内容的提问来源于stack exchange,提问作者Yolo Yolovich
相关产品推荐
相关产品推荐

