如何在 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 频道