如何使用 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())
我已经成功从频道中检索消息。 我用 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())