You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:10