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

如何用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()

关键改动说明

  1. 新增映射字典:message_id_to_user_id用来记录管理员收到的每条消息对应的原始用户ID,相当于建立一个“消息-用户”的索引。
  2. 普通用户消息处理:当用户发消息给机器人时,调用bot.send_message给管理员发送内容,同时将返回的消息ID(管理员端收到的消息ID)和用户ID存入字典。
  3. 管理员回复处理:管理员回复消息时,通过message.reply_to_message.message_id拿到管理员收到的原始消息ID,再从字典中取出对应的用户ID,直接发送消息即可。
  4. 可选清理机制:回复完成后删除字典中的对应条目,避免字典无限膨胀。

这种方法完全绕开了forward_from字段的限制,只要用户主动给机器人发过消息,就能通过映射关系找到用户ID并回复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:50:27