You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已掌握Telethon的get_message_history方法,如何下载Telegram频道全部文件?

如何用Telethon下载Telegram频道的全部文件

Absolutely! You can definitely download all files from a Telegram channel using Telethon—here’s a practical, step-by-step guide to get it done, building on the get_message_history knowledge you already have:

前提准备

  • 确保你已安装最新版Telethon:pip install --upgrade telethon
  • 拥有有效的Telegram API ID和API hash(可通过Telegram官方开发者平台获取,无需跳转外部链接)
  • 已完成Telethon客户端的登录配置,能正常调用消息相关方法

核心实现代码

以下是完整的批量下载脚本,包含消息遍历、文件判断、重复下载规避等功能:

from telethon import TelegramClient
from telethon.tl.types import MessageDocument
import os
import asyncio

# 替换为你的个人配置
API_ID = 123456  # 你的API ID
API_HASH = "your_api_hash_string"  # 你的API hash
SESSION_NAME = "my_download_session"  # 会话名称,用于持久化登录状态
CHANNEL_TARGET = "@your_channel_username"  # 目标频道的用户名或ID
DOWNLOAD_FOLDER = "./telegram_channel_files"  # 文件保存目录

# 创建保存目录(不存在则自动创建)
os.makedirs(DOWNLOAD_FOLDER, exist_ok=True)

async def batch_download_files():
    async with TelegramClient(SESSION_NAME, API_ID, API_HASH) as client:
        offset_id = 0
        downloaded_count = 0
        
        # 循环分页获取消息,直到没有更多内容
        while True:
            # 批量获取消息,limit可根据需求调整(建议100-200,避免触发API限制)
            messages = await client.get_messages(CHANNEL_TARGET, offset_id=offset_id, limit=100)
            if not messages:
                break  # 消息遍历完成,退出循环
            
            for msg in messages:
                # 判断当前消息是否包含可下载的文件
                if isinstance(msg.media, MessageDocument):
                    # 获取文件名(优先用文件自带名称,无名称则用文件ID命名)
                    file_attr = next(attr for attr in msg.document.attributes if hasattr(attr, "file_name"))
                    file_name = file_attr.file_name if file_attr else f"file_{msg.document.id}.bin"
                    save_path = os.path.join(DOWNLOAD_FOLDER, file_name)
                    
                    # 跳过已存在的文件,避免重复下载
                    if not os.path.exists(save_path):
                        print(f"正在下载: {file_name}")
                        await client.download_media(msg, file=save_path)
                        downloaded_count += 1
                    else:
                        print(f"已跳过: {file_name}(本地已存在)")
            
            # 更新偏移量,获取下一批消息
            offset_id = messages[-1].id
        
        print(f"下载完成!共下载 {downloaded_count} 个文件")

# 执行异步下载任务
asyncio.run(batch_download_files())

关键细节优化

  • 筛选特定文件类型:如果只需要下载PDF、ZIP等特定格式文件,可以在文件判断时增加MIME类型过滤:
    if isinstance(msg.media, MessageDocument) and msg.document.mime_type == "application/pdf":
    
  • 显示下载进度:可通过progress_callback参数添加进度提示:
    def download_progress(current_bytes, total_bytes):
        print(f"进度: {current_bytes/total_bytes*100:.2f}%")
    
    await client.download_media(msg, file=save_path, progress_callback=download_progress)
    
  • 私有频道处理:若目标是私有频道,需确保你的Telegram账号已加入该频道,否则会触发权限错误。
  • API速率限制:Telegram对API请求有频率限制,脚本中已通过分页获取消息降低请求压力,无需额外添加延迟(Telethon会自动处理重试逻辑)。

内容的提问来源于stack exchange,提问作者Grender

火山引擎 最新活动