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
相关产品推荐
相关产品推荐

