如何使用 telethon 从链接的频道讨论组获取消息

how to get messages from linked discussion group of channels with telethon

我已经成功从频道中检索消息。 我用 iter_messages 函数来做到这一点 但是,消息对象不包含评论,只有用户写的评论。 在对象中是一个channel_id,这似乎是链接组。但是组里没有t.me/xxx这样的URL。有没有人有解决方法?

这里是对象的摘录 JSON。

 "replies": {
  "_": "MessageReplies",
  "replies": 8,
  "replies_pts": 17846,
  "comments": true,
  "recent_repliers": [
    {
      "_": "PeerUser",
      "user_id": 57135752
    },
    {
      "_": "PeerUser",
      "user_id": 564589817
    },
    {
      "_": "PeerUser",
      "user_id": 888542547
    }
  ],
  "channel_id": 1484030956,
  "max_id": 13402,
  "read_max_id": null
},
  

如果您手动加入了这个群组,它可以工作。

async for message in client.iter_messages(peer):
    if message.replies:
        channel_peer = types.InputChannel(message.replies.channel_id, 0)
        chat = await client.get_entity(channel_peer)

但更好的方法是获取完整的频道请求,这样您就可以获取频道本身并作为实体聊天(并可能加入它?),然后查找是否有任何人是对频道的回复 post .

chat_full = await client(functions.channels.GetFullChannelRequest(peer))
channel = chat_full.chats[0]

chat = channel_full.linked_chat_id
if chat:
    chat = chat_full.chats[-1]

async for message in client.iter_messages(peer):
    msg_data = {
        "id": message.id,
        "date": message.date,
        "message": message.message,
    }
    if chat:
        msg_data["replies"] = client.get_messages(chat, reply_to=message.id)
        

此代码未经测试,但我正在研究它 o_0

最后我找到了一个工作正常的解决方案。 当您有特定的消息 ID 时,您可以设置标志 reply_to。然后你会得到频道帖子的评论。

def get_comments(client: TelegramClient, channel: str, message_id: int):
    async def crawl_comments():
        async for message in client.iter_messages(channel, reply_to=message_id):
            print(message.text)  # only comment
            full_comment_obj = message.to_dict()  # in JSON-Format
            print(full_comment_obj)

    with client:
       client.loop.run_until_complete(crawl_comments())