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

时间:2017-06-09 22:03:13

标签: python telegram

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

我在API https://core.telegram.org/method/messages.getHistory中找到了这个方法,我认为这就像我正在尝试做的那样。但我怎么称呼呢?似乎他们使用的MTproto协议没有python示例。

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

7 个答案:

答案 0 :(得分:10)

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

pip install telethon

然后注册您的应用程序(取自telethon): enter image description here

链接是: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

答案 1 :(得分:1)

电报MTProto很难用于新手,所以我推荐telegram-cli。

您可以使用第三方 tg-export脚本,但新手也不容易。

答案 2 :(得分:1)

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

  

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

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

答案 3 :(得分:1)

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)

答案 4 :(得分:0)

使用不依赖于语言的Telegram API的一种很好的方式是使用https://www.t-a-a-s.ru/

您需要登录并创建API密钥。然后,您可以发出以下请求以获取聊天记录

GET https://www.t-a-a-s.ru/client
{
  "api_key": "YOUR_API_KEY",
  "@type": "getChatHistory",
  "chat_id": "xxxxxxxxxxx",
  "from_message_id": '0',
  "offset": 0,
  "limit": 100,
}

答案 5 :(得分:0)

您可以使用 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 :(得分:-1)

您可以将Telepot(documentation here)用于python,例如:

import telepot

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

但是您可能会耗尽历史记录,最多只能读取100条记录this