Python Telegram Bot:按钮数据无效

Python Telegram Bot: button data invalid

我正在尝试使用 PTB 制作一个超级简单的电报机器人。机器人有一个按钮,当我单击该按钮时,机器人应该向网络发出 http 请求(无需打开浏览器)。并显示响应数据。这是我正在使用的代码片段:

def get_data():
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1').json()
    return response['body']

def start(update, context) -> None:
    inline_button = [
        [
            InlineKeyboardButton('test callback', callback_data=get_data())
        ]
    ]

    reply_markup = InlineKeyboardMarkup(inline_button)
    update.message.reply_text("Please choose:", reply_markup=reply_markup)

def button(update, context) -> None:
    query = update.callback_query
    query.answer()
    
    TEXT = f"<h3>{query.data}</h3>"
    query.edit_message_text(text=TEXT, parse_mode=ParseMode.HTML) 
    # context.bot.send_message(chat_id=update.effective_chat.id, text=f'{query.data}')

它适用于硬编码值和 50 个字符以下的文本,但是当文本大小超过 80 个字符时,我会收到以下错误:

telegram.error.BadRequest: Button_data_invalid

我认为这是由于 64 字节文本的电报限制?但在那种情况下,一些机器人如何在一条消息中显示数千个字符数据?我到底做错了什么?

您正在尝试将从网站获取的 json 数据作为 callback_data 传递给按钮。但是您真正想要的(根据您的描述)是仅在按下按钮时才获取 json 数据。您可以简单地将 callback_data 设置为一些字符串,告诉您是哪个按钮(例如 callback_data='fetch_json'),以及当您收到 CallbackQuery 时(即在 button 函数中)调用 get_data 并使用结果编辑消息文本。

如果您确实想在发送按钮之前发出请求,则必须将长文本存储在某处并在收到 CallbackQuery 时检索它。 python-telegram-bot 具有用于存储数据的内置功能,请参阅此 wiki page


免责声明:我目前是 python-telegram-bot.

的维护者