如何在Pyrogram中修改转发消息的文本内容?
Pyrogram修改转发消息文本并保留超链接的解决方案
直接调用forward方法无法修改消息内容,而使用message.text获取内容会丢失超链接等富文本格式——核心原因是超链接的格式信息存储在消息的entities(文本消息)或caption_entities(媒体消息标题)属性中,而非仅存在于纯文本里。
解决步骤及代码示例
- 获取原消息内容(区分文本消息和带标题的媒体消息)
- 修改文本内容
- 按需调整格式实体的偏移量(文本长度变化时必须操作)
- 发送消息时传入修改后的文本和对应的实体
基础版(文本长度无变化时)
如果只是替换文本中的部分内容、总长度不变,可以直接复用原实体:
@app.on_message(filters.chat(publics)) def new_channel_post(client, message): # 示例:将原文本中的"通知"替换为"紧急通知" original_content = message.text or message.caption modified_text = original_content.replace("通知", "紧急通知") # 获取原消息的格式实体 message_entities = message.entities or message.caption_entities client.send_message( chat_id=private_public, text=modified_text, entities=message_entities, parse_mode=None # 禁用自动解析,避免格式冲突 )
进阶版(文本长度变化时)
如果在文本前后添加前缀、后缀导致长度变化,必须调整实体的偏移量,否则超链接会指向错误位置:
@app.on_message(filters.chat(publics)) def new_channel_post(client, message): prefix = "【公开频道转发】" original_content = message.text or message.caption modified_text = f"{prefix}{original_content}" adjusted_entities = [] # 处理文本消息的格式实体 if message.entities: for entity in message.entities: # 复制原实体并修正偏移量(加上前缀的长度) adjusted_entity = entity.copy() adjusted_entity.offset += len(prefix) adjusted_entities.append(adjusted_entity) # 处理媒体消息标题的格式实体 elif message.caption_entities: for entity in message.caption_entities: adjusted_entity = entity.copy() adjusted_entity.offset += len(prefix) adjusted_entities.append(adjusted_entity) client.send_message( chat_id=private_public, text=modified_text, entities=adjusted_entities, parse_mode=None )
关键说明
- 必须传入
entities参数才能保留超链接、加粗等富文本格式 - 设置
parse_mode=None是为了避免Pyrogram自动解析文本,导致原有实体格式失效 - 媒体消息的格式实体存储在
caption_entities中,需要和文本消息区分处理
内容的提问来源于stack exchange,提问作者enkrbe
相关产品推荐
相关产品推荐

