Telegram频道文件自动整理实战:用Python脚本实现下载与分类

详解如何利用Telegram Bot API和Python脚本,自动监控频道新文件并下载分类,实现高效文件管理。

阅读提示建议先浏览小标题,再根据需要深入阅读具体段落。

在日常使用Telegram的过程中,我们往往会订阅大量频道,其中很多频道会定期分享各种文件——PDF、图片、压缩包、视频等。随着时间推移,这些文件散落在聊天记录中,想找到某个历史文件变得异常困难。虽然Telegram自带搜索功能,但无法对文件进行批量下载和分类归档。今天,我们就来编写一个自定义Python脚本,自动监控频道新文件,并将它们下载、按类型分类保存到本地,彻底解放你的双手。

准备工作:了解核心思路

要实现自动整理,我们利用Telegram Bot API。思路很简单:创建一个Bot,把它加入目标频道并赋予读取消息的权限。然后,通过Bot的getUpdates接口或setWebhook方式获取频道的实时消息。当检测到有文件时,Bot下载文件并保存到指定目录,再根据文件扩展名或MIME类型放入对应的子文件夹。整个过程完全自动化,无需人工干预。

第一步:创建Telegram Bot并获取Token

首先,在Telegram中找到@BotFather,发送/newbot,按照提示设置Bot名称和用户名。创建成功后,你会收到一个HTTP API Token,形如123456:ABC-DEF...1234,记下它,之后脚本会用到。

第二步:将Bot加入频道并授权

将刚才创建的Bot添加为目标频道的管理员(至少需要“查看消息”权限)。在频道信息页点击“管理员”,添加Bot,并勾选“查看消息”权限。这样Bot才能读取频道中发布的文件。

第三步:获取频道ID

为了监听频道消息,我们需要知道频道的数字ID(chat_id)。可以通过给Bot发送一条消息,然后调用getUpdates获取。最简单的方法是:将Bot拉到任意一个群,发送消息,再访问https://api.telegram.org/bot<YourBotToken>/getUpdates,在返回的JSON中找到chatid。对于频道,ID通常以-100开头。为了简洁,你可以在脚本中直接使用频道公开用户名(如@channelusername),Telegram也接受这种格式。

第四步:编写Python脚本

我们使用Python编写脚本,依赖requests库。若未安装,请先执行pip install requests。下面是一个基础的实现框架:

import os
import time
import requests

# 配置
BOT_TOKEN = "YOUR_BOT_TOKEN"
CHANNEL_ID = "@your_channel"  # 或 -100xxxxxxxx
SAVE_DIR = "./downloads"

# 分类规则
def classify(filename):
    ext = os.path.splitext(filename)[1].lower()
    if ext in ('.jpg', '.jpeg', '.png', '.gif', '.webp'):
        return 'images'
    elif ext in ('.pdf', '.doc', '.docx', '.ppt', '.pptx', '.xls', '.xlsx'):
        return 'documents'
    elif ext in ('.zip', '.rar', '.7z', '.tar', '.gz'):
        return 'archives'
    elif ext in ('.mp4', '.mkv', '.avi', '.mov'):
        return 'videos'
    elif ext in ('.mp3', '.wav', '.flac', '.aac'):
        return 'audios'
    else:
        return 'others'

# 检测到新消息
offset = 0
while True:
    resp = requests.get(f"https://api.telegram.org/bot/getUpdates", params={"offset": offset, "timeout": 30}).json()
    for update in resp.get("result", []):
        offset = update["update_id"] + 1
        message = update.get("message") or update.get("channel_post")
        if not message or message.get('chat', {}).get('id') != CHANNEL_ID:
            continue
        if 'document' in message:
            file_id = message['document']['file_id']
            file_name = message['document'].get('file_name', 'unknown')
        elif 'photo' in message:
            # 取最大尺寸的图片
            file_id = message['photo'][-1]['file_id']
            file_name = str(int(time.time())) + '.jpg'
        elif 'video' in message:
            file_id = message['video']['file_id']
            file_name = message['video'].get('file_name', 'video.mp4')
        else:
            continue

        # 获取文件下载路径
        file_info = requests.get(f"https://api.telegram.org/bot/getFile", params={"file_id": file_id}).json()
        file_path = file_info['result']['file_path']
        file_url = f"https://api.telegram.org/file/bot/"

        # 下载文件
        content = requests.get(file_url).content
        folder = classify(file_name)
        dest_dir = os.path.join(SAVE_DIR, folder)
        os.makedirs(dest_dir, exist_ok=True)
        dest_path = os.path.join(dest_dir, file_name)
        with open(dest_path, 'wb') as f:
            f.write(content)
        print(f"已下载:  -> /")

BOT_TOKENCHANNEL_ID替换为你自己的值,然后运行脚本。脚本会每30秒长轮询一次,新文件自动下载并按扩展名分类保存。你也可以通过cron或Windows计划任务让脚本持续运行在后台。

第五步:优化与扩展

上述脚本实现了基本功能,但在实际使用中可以考虑更多优化:

  • 增量同步:记录已处理的消息ID,避免重复下载。
  • 重命名规则:根据发布时间或自定义前缀重命名文件,避免同名覆盖。
  • 文件大小限制:Telegram Bot API下载限制为20MB,但你可以通过getFile获取文件路径后改用其他方式下载大文件。
  • 错误处理:添加异常处理,网络断开时自动重连。
  • 多频道支持:可以配置多个频道ID,循环监听。

注意事项与安全

使用Bot下载频道文件时,请遵守频道版权规则和Telegram服务条款。不要将Bot添加到受版权保护的资源频道进行批量下载,以免引发纠纷。另外,Bot Token是敏感信息,不要硬编码在公开脚本中,建议使用环境变量或配置加密存储。

总结

通过这个自定义脚本,我们成功实现了Telegram频道新文件的自动下载和分类。整个过程无需手动干预,大大提升了文件管理效率。你可以根据自身需求调整分类规则和保存逻辑,甚至结合定时任务实现定期清理。脚本的灵活性让你可以构建更强大的自动化工作流,比如将新文件转发到云盘、发送通知等。希望本文能为你提供灵感,让你的Telegram使用体验更上一层楼。

FAQ

安装与配置指南

常见问题

Telegram Bot API下载文件大小有限制吗?

是的,通过Bot API的getFile方法下载文件,最大支持20MB。如果文件更大,需要借助Telegram Desktop或第三方工具,或者使用MTProto库(如Pyrogram)来获取更大的下载链接。

脚本如何避免重复下载同一个文件?

你可以记录已处理的update_id或文件的file_unique_id。在每次循环中,将已处理的ID保存到本地数据库或文件中,下次启动时读取并跳过。

如果我的频道不是公开频道,Bot能读取吗?

可以。只要Bot被添加为频道管理员并拥有查看消息权限,即使是私有频道也能读取消息。频道ID可以用频道用户名的@格式,或者通过getUpdates获取数字ID。