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

Aiogram中获取转发消息的来源聊天ID与消息ID失败问题求助

Aiogram中获取转发消息的来源聊天ID与消息ID失败问题求助

嘿,我来帮你解决这个问题!

你遇到的这个情况其实很常见——当把消息转发到部分类型的聊天(比如超级群组频道)时,Telegram会自动丢失原消息的部分来源属性,导致你没办法直接从转发后的消息对象里拿到forward_from_chat这类字段,所以打印出来全是None。而且forward_origin返回的MessageOriginUser确实只包含用户基本信息,不会带原消息的ID和聊天ID,这是Telegram API的限制,不是Aiogram的问题。

那怎么解决呢?核心思路是在转发消息的那一刻,主动把原消息的关键信息和频道里生成的转发消息关联存储起来,因为这时候我们还能直接拿到用户的原消息数据。

给你具体的代码修改方案:

首先,我们需要一个存储关联关系的地方——测试阶段可以用全局字典,生产环境建议用数据库或者Redis做持久化(不然机器人重启后数据就丢了)。

修改转发消息的函数

# 测试用全局字典,生产环境替换为数据库/Redis
forward_map = {}

@dp.message(WriteAppeal.message) 
async def wrote(message: Message, state: FSMContext): 
    # 转发消息到频道,同时获取频道中生成的转发消息对象
    forwarded_channel_msg = await bot.forward_message(
        chat_id=CHANNEL_ID, 
        from_chat_id=message.chat.id, 
        message_id=message.message_id
    )
    # 把频道消息ID和原消息的chat_id、message_id关联存储
    forward_map[forwarded_channel_msg.message_id] = (message.chat.id, message.message_id)
    await message.answer('Обращение благополучно отправлено!')

修改处理/answer命令的函数

@dp.message(Command('answer')) 
async def answering(message: Message): 
    # 先判断用户是否回复了频道里的某条消息
    if not message.reply_to_message:
        await message.answer("请先回复需要处理的用户求助消息!")
        return

    # 从回复的频道消息中拿到ID,去查关联的原消息信息
    channel_msg_id = message.reply_to_message.message_id
    original_chat_id, original_msg_id = forward_map.get(channel_msg_id, (None, None))

    if not original_chat_id or not original_msg_id:
        await message.answer("找不到这条消息的原始来源信息!")
        return

    # 给原用户发送回复,这里可以把/answer命令本身的前缀去掉
    reply_text = message.text.replace('/answer', '').strip()
    await bot.send_message(
        chat_id=original_chat_id,
        text=f'Ответ на ваше обращение: \n {reply_text}',
        reply_to_message_id=original_msg_id
    )
    await message.answer("回复已成功发送给原用户!")

这样修改后,你就能稳定获取到原消息的聊天ID和消息ID了,再也不会出现属性为None的情况。另外补充一点:如果你的频道是超级群组,Telegram的转发机制会对来源信息做更多隐藏,所以这种主动存储的方式是最可靠的解决方案。

备注:内容来源于stack exchange,提问作者Ok Google

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:19:50