许多Telegram用户会遇到这样的困扰:每天关注大量频道和群组,里面分享着各类文档、图片、视频和软件安装包,但手动逐个下载保存既耗时又容易遗漏。尤其是需要将特定内容自动备份到自己的存储空间(如Google Drive、本地电脑或另一个Telegram频道)时,缺乏高效的自动化方案。本教程将手把手教你搭建一套Telegram自动转存系统,实现“指定来源内容一旦发布,即刻自动保存到目标位置”的完整闭环。
准备阶段:搭建运行环境与获取必要凭证
具体操作说明:
自动转存需要借助第三方机器人框架(如Python的Telethon库或Node.js的GramJS)在服务器或本地电脑上运行。首先,你需要准备一个可运行的Python环境(推荐Python 3.8以上版本)。打开终端或命令提示符,输入python --version确认版本。若未安装,请前往python.org下载安装,安装时务必勾选“Add Python to PATH”。接着,使用pip安装核心库:pip install telethon。同时,你需要一个Telegram账户(非机器人),用于登录并监听消息。最后,前往 my.telegram.org/apps,登录后创建一个应用,获取api_id和api_hash——这两个是后续连接Telegram服务器的钥匙。
注意事项/小提示:
- 若在国内网络环境,需确保终端能正常访问Telegram API,必要时配置代理(如设置系统代理或使用
proxychains)。 - 不要将api_id和api_hash泄露给他人,它们可完全控制你的账户权限。
- 如果使用Windows系统,建议在PowerShell(管理员模式)下执行pip安装,避免权限错误。
备用方案:
- 若不想本地搭建,可使用支持自定义脚本的云函数平台(如腾讯云函数、阿里云函数计算),但需额外配置环境依赖。
- 对于完全不懂代码的用户,可寻找现成的Telegram转存机器人(如@SaveToBot),但此类机器人功能受限且存在隐私风险。
编写核心转存脚本:指定来源与目标
具体操作说明:
创建一个Python文件,例如auto_save.py,输入以下基础框架代码(以转存到本地文件夹为例):
`python
from telethon import TelegramClient, events
import os
api_id = '你的api_id'
api_hash = '你的api_hash'
client = TelegramClient('session_name', api_id, api_hash)
source_channel = 'https://t.me/目标频道链接' # 替换为你要监听的频道或群组
save_folder = './downloaded_files' # 本地保存路径
if not os.path.exists(save_folder):
os.makedirs(save_folder)
@client.on(events.NewMessage(chats=source_channel))
async def handler(event):
if event.message.media: # 判断是否包含媒体文件
await client.download_media(event.message, file=save_folder)
print(f'已保存文件:{event.message.id}')
client.start()
client.run_until_disconnected()
`
将代码中的api_id、api_hash和source_channel替换为真实值。运行脚本后,Telegram客户端会要求你输入手机号及验证码完成登录,此后脚本将自动监听指定来源的新消息,并下载其中的媒体文件到downloaded_files文件夹。
注意事项/小提示:
- 首次运行需在控制台输入手机号及Telegram发送的验证码,若开启两步验证还需输入密码。
- 脚本默认监听所有媒体类型,若只想转存特定格式(如仅文档),可在
if条件中添加判断:event.message.media.document.mime_type。 - 频道链接必须为公开链接,私密频道需使用频道ID(可通过@getidsbot获取)。
备用方案:
- 若目标为转存到另一个Telegram频道,需在脚本中创建第二个客户端实例,并使用
client.send_file()方法转发。 - 若需转存到Google Drive,可集成
pydrive库,在下载后调用上传函数。
验证转存功能:测试消息触发与结果检查
具体操作说明:
保存脚本后,在终端执行python auto_save.py。当提示“请输入手机号”时,输入你的Telegram账号(带国家码,如+86xxxxxxxxx)。输入验证码登录成功后,脚本将进入监听状态。此时,向目标频道或群组发送一条包含图片、文档或视频的消息(或等待频道发布新消息)。观察终端输出,若显示“已保存文件:xxx”,则说明触发成功。接着,检查本地downloaded_files文件夹,确认文件已按消息ID命名保存。若文件内容可正常打开,则核心功能验证通过。
注意事项/小提示:
- 首次测试建议使用自己可控的测试群组,避免干扰他人频道。
- 注意文件大小限制:Telegram对单个文件的下载限制为2GB,但脚本默认使用流式下载,理论上可处理大文件。
- 若终端无反应,检查网络连接和api_id/api_hash是否正确,或尝试重启脚本。
备用方案:
- 若文件未保存,检查保存路径是否有写入权限,尝试以管理员身份运行脚本。
- 若监听不到消息,确认
source_channel格式正确,并确保账号已加入该频道/群组。
处理异常与持久化运行:错误捕获与后台部署
具体操作说明:
为增强稳定性,需在脚本中加入异常处理。在handler函数内使用try-except块:
`python
try:
await client.download_media(event.message, file=save_folder)
except Exception as e:
print(f'下载失败:{e}')
# 可记录日志到文件
`
对于长时间运行,推荐使用screen(Linux)或Task Scheduler(Windows)保持后台运行。Linux下执行screen -S tele_save创建会话,然后运行脚本,按Ctrl+A再按D分离会话。Windows下可将脚本打包为.exe(使用PyInstaller),再通过任务计划程序设置开机自启。
注意事项/小提示:
- 脚本运行期间不要关闭终端窗口(除非使用后台方案),否则进程会终止。
- 定期检查磁盘空间,避免下载大量文件导致存储满。
- 若遇到“Flood wait”错误,说明请求频率过高,可在
events.NewMessage中添加timeout参数或使用asyncio.sleep()延迟处理。
备用方案:
- 使用Docker容器化部署,镜像可包含完整依赖,便于迁移到服务器。
- 若需转存多个来源,可在代码中创建多个
@client.on(events.NewMessage(chats=[...]))监听列表。
常见问题补充
问:转存脚本运行一段时间后突然停止,没有报错怎么办?
答:这通常是Telegram会话过期导致。删除脚本同目录下的session_name.session文件,重新运行脚本并再次登录即可。建议设置定期重启脚本(如每天凌晨)以刷新会话。
问:如何只转存特定关键词的消息(如包含“教程”的文件)?
答:在handler函数内添加条件判断:if '教程' in event.message.text or '教程' in (event.message.file.name if event.message.file else ''),只有匹配时才执行下载。
问:转存到本地后,文件名全是数字ID,如何保留原始文件名?
答:使用client.download_media(event.message, file=save_folder, attributes=[event.message.media.document.attributes]),或直接通过event.message.file.name获取原始名称后拼接路径。
总结:通过Telethon库编写监听脚本,配合正确凭证与异常处理,即可实现Telegram频道/群组内媒体文件的自动转存,整个过程无需手动干预,且支持灵活定制过滤规则与存储目标。