如何用Python实现Telegram机器人回复隐私隐藏ID的用户消息
如何向隐私设置隐藏ID的Telegram用户发送消息?
你的核心问题是:当用户Telegram隐私设置为“允许转发消息”→“无人”或“仅联系人”时,机器人无法通过message.reply_to_message.forward_from.id获取用户ID,导致无法回复。
解决思路是在用户首次发送消息时,提前存储「管理员收到的消息ID」与「用户ID」的映射关系,后续管理员回复时,通过回复的消息ID反向查找对应用户ID,无需依赖被隐藏的forward_from字段。
修改后的完整代码
import telebot from api import bot_token, admin_id key = bot_token admin_id = admin_id bot = telebot.TeleBot(key) start_message = "Now, you can send message" # 存储管理员收到的消息ID -> 原始发送用户ID的映射 message_id_to_user_id = {} @bot.message_handler(commands=['start']) def start(message): sender_fn = message.from_user.first_name + ' ' sender_ln = message.from_user.last_name + ' ' if message.from_user.last_name else "" sender_id = str(message.from_user.id) bot.send_message(message.from_user.id, start_message) if message.from_user.username: sender_un = '@' + str(message.from_user.username) + ' ' bot.send_message(admin_id, f"{sender_fn}{sender_ln}Started Bot\n{sender_un}({sender_id})") else: bot.send_message(admin_id, f"{sender_fn}({sender_id}) Started Bot") @bot.message_handler() def handle_message(message): if message.from_user.id == admin_id: # 管理员回复消息时,通过回复的消息ID找对应用户ID try: replied_msg_id = message.reply_to_message.message_id sender_id = message_id_to_user_id[replied_msg_id] bot.send_message(sender_id, message.text) # 可选:发送后删除映射,避免字典膨胀 del message_id_to_user_id[replied_msg_id] except (KeyError, AttributeError): bot.send_message(admin_id, "无法回复该用户,请确认消息来源") else: # 普通用户发消息时,给管理员发消息并记录映射 sender_id = message.from_user.id # 发送消息给管理员,获取管理员收到的消息对象 sent_to_admin = bot.send_message(admin_id, f"用户ID {sender_id} 发来消息:\n{message.text}") # 将管理员收到的消息ID和用户ID绑定 message_id_to_user_id[sent_to_admin.message_id] = sender_id print("Bot Started!") bot.polling()
关键改动说明
- 新增映射字典:
message_id_to_user_id用来记录管理员收到的每条消息对应的原始用户ID,相当于建立一个“消息-用户”的索引。 - 普通用户消息处理:当用户发消息给机器人时,调用
bot.send_message给管理员发送内容,同时将返回的消息ID(管理员端收到的消息ID)和用户ID存入字典。 - 管理员回复处理:管理员回复消息时,通过
message.reply_to_message.message_id拿到管理员收到的原始消息ID,再从字典中取出对应的用户ID,直接发送消息即可。 - 可选清理机制:回复完成后删除字典中的对应条目,避免字典无限膨胀。
这种方法完全绕开了forward_from字段的限制,只要用户主动给机器人发过消息,就能通过映射关系找到用户ID并回复。
内容的提问来源于stack exchange,提问作者MaTiN
相关产品推荐
相关产品推荐

