基于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关联获取。
修改步骤:
- 新增全局字典存储用户输入:用字典保存每个用户发送的待翻译文本,键为用户ID,值为输入内容。
- 修改消息处理函数保存用户输入:在用户发送消息后,先把文本存入字典,再弹出语言选择按钮。
- 修改回调函数获取用户输入:从字典中取出对应用户的输入文本,再执行翻译逻辑。
- 修复参数错误:原代码中
@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
相关产品推荐
相关产品推荐

