在日常使用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中找到chat的id。对于频道,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_TOKEN和CHANNEL_ID替换为你自己的值,然后运行脚本。脚本会每30秒长轮询一次,新文件自动下载并按扩展名分类保存。你也可以通过cron或Windows计划任务让脚本持续运行在后台。
第五步:优化与扩展
上述脚本实现了基本功能,但在实际使用中可以考虑更多优化:
- 增量同步:记录已处理的消息ID,避免重复下载。
- 重命名规则:根据发布时间或自定义前缀重命名文件,避免同名覆盖。
- 文件大小限制:Telegram Bot API下载限制为20MB,但你可以通过
getFile获取文件路径后改用其他方式下载大文件。 - 错误处理:添加异常处理,网络断开时自动重连。
- 多频道支持:可以配置多个频道ID,循环监听。
注意事项与安全
使用Bot下载频道文件时,请遵守频道版权规则和Telegram服务条款。不要将Bot添加到受版权保护的资源频道进行批量下载,以免引发纠纷。另外,Bot Token是敏感信息,不要硬编码在公开脚本中,建议使用环境变量或配置加密存储。
总结
通过这个自定义脚本,我们成功实现了Telegram频道新文件的自动下载和分类。整个过程无需手动干预,大大提升了文件管理效率。你可以根据自身需求调整分类规则和保存逻辑,甚至结合定时任务实现定期清理。脚本的灵活性让你可以构建更强大的自动化工作流,比如将新文件转发到云盘、发送通知等。希望本文能为你提供灵感,让你的Telegram使用体验更上一层楼。