如何在 Telegram 中下载群组的聊天记录?

Posted

技术标签:

【中文标题】如何在 Telegram 中下载群组的聊天记录?【英文标题】:How can I download the chat history of a group in Telegram? 【发布时间】:2017-11-12 00:46:42 【问题描述】:

我想下载在 Telegram 的公共群组中发布的聊天记录(所有消息)。如何用 python 做到这一点?

我在 API https://core.telegram.org/method/messages.getHistory 中找到了这种方法,我认为这看起来像是我正在尝试做的。但我实际上如何称呼它?他们使用的 MTproto 协议似乎没有 python 示例。

我也查看了 Bot API,但它似乎没有下载消息的方法。

【问题讨论】:

bot api 无法访问消息。为此,您需要电报 API。 您可能还想看看github.com/LonamiWebs/Telebackup 以获得一些灵感(该项目仍有很多缺陷),一个Python程序,其唯一目的是下载聊天历史(因此创建它的备份)。 【参考方案1】:

您可以使用Telethon。 Telegram API 相当复杂,通过 Telethon,您可以在很短的时间内开始使用 Telegram API,而无需预先了解 API。

pip install telethon

然后注册您的应用(取自 Telethon):

链接是:https://my.telegram.org/

然后获取组的消息历史记录(假设您有组ID):

chat_id = YOUR_CHAT_ID
api_id=YOUR_API_ID
api_hash = 'YOUR_API_HASH'

from telethon import TelegramClient
from telethon.tl.types.input_peer_chat import InputPeerChat

client = TelegramClient('session_id', api_id=api_id, api_hash=api_hash)
client.connect()
chat = InputPeerChat(chat_id)

total_count, messages, senders = client.get_message_history(
                        chat, limit=10)

for msg in reversed(messages):
    # Format the message content
    if getattr(msg, 'media', None):
        content = '<> '.format(  # The media may or may not have a caption
        msg.media.__class__.__name__,
        getattr(msg.media, 'caption', ''))
    elif hasattr(msg, 'message'):
        content = msg.message
    elif hasattr(msg, 'action'):
        content = str(msg.action)
    else:
        # Unknown message, simply print its class name
        content = msg.__class__.__name__

    text = '[:] (ID=) :  type: '.format(
            msg.date.hour, msg.date.minute, msg.id, "no name",
            content)
    print (text)

示例取自telethon example并简化。

【讨论】:

请注意,如果您的群组是超级群组,您需要将其视为频道,并使用 InputPeerChannel 方法,该方法同时获取群组的 chat_id 和 access_hash。 另请注意,InteractiveTelegramClient 将停止与 pip 版本一起提供,因为它只是一个示例。请改用TelegramClient @Lonami 感谢您的提示。更新了使用 TelegramClient 而不是 InteractiveTelegramClient 的答案。还要感谢您在 github 页面上发布使用 TelegramClient 的示例。真的很有帮助! 我可以使用这个脚本下载多少条消息? 5k 还是无限?谢谢! 能否请您更新代码,因为它会引发错误,如下所示gist.github.com/aabdulwahed/5e785a0bd911d9f4f47256b5b25f3c42【参考方案2】:

通过更新(2018 年 8 月),现在 Telegram Desktop 应用程序支持非常方便地保存聊天记录。 您可以将其存储为 json 或 html 格式。

要使用此功能,请确保您的计算机上安装了最新版本的 Telegram Desktop,然后点击设置 > 导出 Telegram 数据。

https://telegram.org/blog/export-and-more

【讨论】:

这是真的。 是的,但以编程方式自动化该过程可能很有用。想象一下,您需要保存 100 个聊天,手动单击以导出每个聊天,或者您编写了一个可以作为 cron 作业运行的漂亮脚本?我更喜欢 python 方式 tbh ;)【参考方案3】:

currently accepted answer 用于非常旧的 Telethon 版本。在 Telethon 1.0 中,代码可以而且应该简化为:

# chat can be:
# * int id (-12345)
# * str username (@chat)
# * str phone number (+12 3456)
# * Peer (types.PeerChat(12345))
# * InputPeer (types.InputPeerChat(12345))
# * Chat object (types.Chat)
# * ...and many more types
chat = ...
api_id = ...
api_hash = ...

from telethon.sync import TelegramClient

client = TelegramClient('session_id', api_id, api_hash)

with client:
    # 10 is the limit on how many messages to fetch. Remove or change for more.
    for msg in client.iter_messages(chat, 10):
        print(msg.sender.first_name, ':', msg.text)

仍然可以应用任何格式,但不再需要 hasattr。例如if msg.media 就足以检查消息是否有媒体。

注意,如果你使用的是Jupyter,需要直接使用async

from telethon import TelegramClient

client = TelegramClient('session_id', api_id, api_hash)

# Note `async with` and `async for`
async with client:
    async for msg in client.iter_messages(chat, 10):
        print(msg.sender.first_name, ':', msg.text)

【讨论】:

chat 变量应该由chat = InputPeerChat(chat_id) 评估? 那么这里的chat 变量是什么?和chat_id一样吗? chat 只是一个示例,表明“任何可以解释为聊天的内容”都可以使用。是的,输入同伴或聊天 ID 可以正常工作。 我怎样才能从群聊中获取消息历史记录?【参考方案4】:

现在,您可以使用TDesktop 导出聊天记录。

这是关于 2018 年 8 月更新的blog post。


原答案:

Telegram MTProto 对新手来说很难使用,所以我推荐 telegram-cli。

您可以使用第三方 tg-export 脚本,但对新手来说仍然不容易。

【讨论】:

【参考方案5】:

您可以使用Telethon 库。为此,您需要注册您的应用并将您的客户端代码连接到它(查看this)。 然后获取一个条目(如频道、群组或聊天)的消息历史记录:

from telethon.sync import TelegramClient
from telethon.errors import SessionPasswordNeededError


client = TelegramClient(username, api_id, api_hash, proxy=("socks5", proxy_ip, proxy_port))  # if in your country telegram is banned, you can use the proxy, otherwise remove it.
client.start()

# for login
if not client.is_user_authorized():
    client.send_code_request(phone)
    try:
        client.sign_in(phone, input('Enter the code: '))
    except SessionPasswordNeededError:
        client.sign_in(password=input('Password: '))

async for message in client.iter_messages(chat_id, wait_time=0):            
    messages.append(Message(message))
        # write your code

【讨论】:

【参考方案6】:

你可以在 python 中使用 Telepot (documentation here),例如:

import telepot

token = 'your_token'
bot = telepot.Bot(token)
tmp_history = bot.getUpdates()
print(tmp_history['result'])

但您可能会遇到历史记录限制为 100 条,请阅读 this 关于它

【讨论】:

以上是关于如何在 Telegram 中下载群组的聊天记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Telegram 频道的成员转移到另一个 Telegram 频道

Telegram Bot - 如何获取群聊 ID?

Telegram Bot:从私人群组转发消息

Telegram Bot 电报机器人合集详解版

在 iOS 中使用 XMPP 从 Groupchat/Room 中退出特定成员/所有者

Activiti6.0 工作流引擎 websocket即时聊天发图片文字 好友群组 SSM源码