我想下载Telegram上公共群组中发布的聊天记录(所有消息)。我怎么能用python做到这一点?
我在API https://core.telegram.org/method/messages.getHistory中找到了这个方法,我认为这就像我正在尝试做的那样。但我怎么称呼呢?似乎他们使用的MTproto协议没有python示例。
我还查看了Bot API,但它似乎没有下载消息的方法。
答案 0 :(得分:10)
您可以使用Telethon。 Telegram API相当复杂,使用telethon,您可以在很短的时间内开始使用电报API,而无需了解API。
pip install telethon
然后获取组的消息历史记录(假设您具有组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,然后单击“设置”>“导出电报数据”。
答案 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