如何在Telegram频道中保留原生的“发表评论”按钮,或在通过Bot API添加内联键盘时保持原生的线程视图?
我正在开发一个Telegram机器人,用于向一个公开频道发布内容。该频道与一个讨论组相连,因此默认情况下,每条帖子都会显示原生的“发表评论”按钮。我的主要目标是让用户点击评论按钮后,进入Telegram的原生话题视图——在该界面中,原始频道的帖子被置顶在顶部,下面只显示针对该帖子的回复。
问题所在: 通常Telegram会自动提供“发表评论”按钮。然而,当我的机器人添加了一个自定义 inline_keyboard(用于投票系统)时,原生的“发表评论”按钮会消失。
我想实现的目标: 创建一个自定义按钮,复现原生按钮的精确深层链接行为。它应当打开该帖的专属讨论串,而不仅仅是链接到整个讨论组。
我尝试过的方案(以及为什么失败):
t.me/ChannelName/MsgID?comment=1:返回“Message does not exist”(消息不存在)t.me/ChannelName/MsgID?discussion:只是打开频道中的帖子本身,并非线程视图。t.me/ChannelName/1?thread=MsgID:返回“Message does not exist”
问题:
- 有没有办法强制Telegram在显示原生的“发表评论”按钮的同时,和我的自定义
inline_keyboard一起显示? - 如果不能,如何用自定义按钮来复现同样的“发表评论”功能,让用户进入显示该帖子及其评论的原生“线程”视图?
环境:
-
- Python (Requests /
python-telegram-bot)
- Python (Requests /
- 公共频道+ 与之相连的私有/公开讨论组
- 机器人在两者中都是管理员
解决方案
因此我花了大量时间钻研这个问题,甚至查看了Telegram自家的MTProto文档来确认。
原生的“发表评论”按钮绝对不能与自定义内联键盘共存。永远不行。
Telegram的官方文档明确写着——原生评论会出现在所有频道帖子上,除了由机器人创建的帖子。这不是一个bug,也不是缺少参数的问题。Telegram故意将机器人发出的帖子排除在原生按钮之外。没有隐藏标志,也没有变通方法。
但真正的解决办法是:
当你的机器人向频道发布帖子时,Telegram会悄悄把该帖子转发到你链接的讨论组,并在那里创建一条单独的消息。评论线程就存在于那个讨论组消息上,而不是你频道的帖子。
因此,正确的按钮URL应该是:
https://t.me/YourDiscussionGroup/{group_message_id}
不是频道消息的ID,而是讨论组中的那个。
要获取讨论组的消息ID,请通过webhook监听讨论组中的来信。当自动转发到达时,它会有一个字段forward_from_message_id,与原始频道帖子的ID相匹配。保存该值,并在按钮的URL中使用它。
然后在你的投票按钮旁边再添加一个指向该URL的“发表评论”按钮。它将打开与原生按钮完全相同的线程视图——原帖置顶在顶部,下面是对该帖子的回复。
我也在MTProto文档中确认,存在一个名为messages.getDiscussionMessage的方法,在底层API级别本地实现此功能,但Bot API中并未暴露。因此,如果你使用的是python-telegram-bot,webhook的做法是唯一的选项。