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

基于Telebot的带内联按钮翻译机器人:text变量与用户消息获取问题

问题

我正在用Telebot开发带内联按钮的翻译机器人,流程是用户发送消息后,机器人给出语言选择选项;用户选定语言后完成翻译。请问以下代码中callback函数内的text变量该怎么写?如何正确获取用户的消息/输入?

import telebot
from telebot import types
from googletrans import Translator 
BOT_TOKEN = "<Bot_Token>"
bot = telebot.TeleBot(BOT_TOKEN)

key =types.InlineKeyboardMarkup()
btn1=types.InlineKeyboardButton(text ="Amharic" , callback_data="am")
btn2=types.InlineKeyboardButton(text =" Arabic" , callback_data="ar")
btn3=types.InlineKeyboardButton(text =" Hindi" , callback_data="hi")
key.add(btn1,btn2,btn3)
@bot.callback_query_handler(func=lambda call:True)
def callback(call):
    #here is my question, what does i have to write in text variable ?
    text= call.message.chat.text
     #?????????
    if call.data=="am":
        translator=Translator()
        translation=translator.translate(text,dest="am")
        bot.send_message(call.message.chat.id,text)
        
@bot.message_handler(commands = ["start"])
def welcome (message):
  bot.send_message(message.chat.id,'HELLO!!! send a message!')
@bot.message_handler(func=lambda call:True)
def choose(message):
    bot.send_message(message.chat.id,"select your language:",reply_markup=key)
bot.infinity_polling()
解决方案

你的核心问题是:点击内联按钮时,call.message指向的是机器人发送的"select your language:"这条消息,不是用户的原始输入,所以直接取call.message.chat.text完全错误。需要提前把用户的输入存储起来,通过用户ID关联获取。

修改步骤:

  1. 新增全局字典存储用户输入:用字典保存每个用户发送的待翻译文本,键为用户ID,值为输入内容。
  2. 修改消息处理函数保存用户输入:在用户发送消息后,先把文本存入字典,再弹出语言选择按钮。
  3. 修改回调函数获取用户输入:从字典中取出对应用户的输入文本,再执行翻译逻辑。
  4. 修复参数错误:原代码中@bot.message_handler(func=lambda call:True)的参数名写错了,应该是message。

完整修改代码:

import telebot
from telebot import types
from googletrans import Translator 

BOT_TOKEN = "<Bot_Token>"
bot = telebot.TeleBot(BOT_TOKEN)
# 全局字典存储用户输入的待翻译文本
user_inputs = {}

key = types.InlineKeyboardMarkup()
btn1 = types.InlineKeyboardButton(text="Amharic", callback_data="am")
btn2 = types.InlineKeyboardButton(text="Arabic", callback_data="ar")
btn3 = types.InlineKeyboardButton(text="Hindi", callback_data="hi")
key.add(btn1, btn2, btn3)

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    # 通过用户ID从字典获取之前输入的文本
    text = user_inputs.get(call.message.chat.id)
    if not text:
        bot.send_message(call.message.chat.id, "请先发送需要翻译的内容!")
        return
    
    translator = Translator()
    # 根据选择的语言执行翻译
    if call.data == "am":
        translation = translator.translate(text, dest="am")
        bot.send_message(call.message.chat.id, translation.text)
    elif call.data == "ar":
        translation = translator.translate(text, dest="ar")
        bot.send_message(call.message.chat.id, translation.text)
    elif call.data == "hi":
        translation = translator.translate(text, dest="hi")
        bot.send_message(call.message.chat.id, translation.text)

@bot.message_handler(commands=["start"])
def welcome(message):
    bot.send_message(message.chat.id, 'HELLO!!! send a message!')

@bot.message_handler(func=lambda message: True)
def choose(message):
    # 保存用户输入的文本到字典
    user_inputs[message.chat.id] = message.text
    bot.send_message(message.chat.id, "select your language:", reply_markup=key)

bot.infinity_polling()

关键说明:

  • 用user_inputs字典持久化用户输入,确保点击按钮时能正确关联到用户之前发送的文本。
  • 回调函数中先判断是否存在用户输入,避免空值报错。
  • 翻译完成后发送translation.text,而不是原文本,这是原代码的另一个小错误。

内容的提问来源于stack exchange,提问作者salih19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:50