Python Telegram Bot问题:如何让回调响应以用户身份发送至聊天
Telegram Bot按钮回复模拟用户身份显示方案
核心限制
Telegram官方API禁止机器人模拟普通用户发送消息,所有机器人发出的消息都会显示机器人账号信息,无法直接替换为用户的用户名。但可以通过视觉模拟的方式实现类似效果。
实现方案:嵌入用户信息并格式化
在机器人的回复内容里带上用户的昵称,并用格式突出,让聊天记录看起来像是用户做出了回应。修改后的代码如下:
import telebot from telebot import types bot = telebot.TeleBot('你的机器人Token') @bot.message_handler(commands=['start']) def start(message): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton('да', callback_data='yes') btn2 = types.InlineKeyboardButton('нет', callback_data='no') markup.row(btn1, btn2) bot.send_message(message.chat.id, f'привет, {message.from_user.first_name}! придет ли сегодня Кевин?', reply_markup=markup) @bot.callback_query_handler(func=lambda callback: True) def callback_message(callback): # 获取用户昵称 user_name = callback.from_user.first_name # 根据按钮选择生成对应回复 if callback.data == 'yes': reply_text = f'*{user_name}*: да' elif callback.data == 'no': reply_text = f'*{user_name}*: нет' # 发送带格式的消息,加粗用户昵称模拟用户发言 bot.send_message(callback.message.chat.id, reply_text, parse_mode='MarkdownV2') # 可选:删除原按钮消息,让聊天更整洁 bot.delete_message(callback.message.chat.id, callback.message.message_id) bot.polling(non_stop=True)
代码细节说明
- 从
callback.from_user中提取用户的身份信息,这里用了昵称,也可以用callback.from_user.username获取用户名 - 用MarkdownV2的加粗格式突出用户名称,视觉上更接近用户自己发言的效果
- 可选删除原始的按钮消息,避免聊天记录里残留无关的交互消息
进阶优化:关联用户原始消息
如果想让对话逻辑更清晰,可以让机器人的回复引用用户发送的/start命令消息:
修改start函数中的发送语句,关联用户的命令消息:
bot.send_message( message.chat.id, f'привет, {message.from_user.first_name}! придет ли сегодня Кевин?', reply_markup=markup, reply_to_message_id=message.message_id )
然后在回调函数中,让回复引用这条关联消息:
bot.send_message( callback.message.chat.id, reply_text, parse_mode='MarkdownV2', reply_to_message_id=callback.message.reply_to_message.message_id )
内容的提问来源于stack exchange,提问作者Mariia Osipova
相关产品推荐
相关产品推荐

