跳转至

Telegram 投递

同时提供 bot token、目标地址并设置 telegram.enabled = true 后,投递就会启用。

默认 MTProto 配置

[telegram]
enabled = true
bot_token = ""
chat_id = "@your_channel"
upload_transport = "mtproto"
media_type = "audio"
send_as_document = false
upload_timeout_seconds = 7200

[telegram.mtproto]
session_path = "telegram-mtproto.session"
max_upload_bytes = 1990000000

[telegram.bot_api]
api_base = "https://api.telegram.org"
max_upload_bytes = 49000000
split_large_audio = true
max_upload_parts = 10

相对的 session_path 会解析到 [app].data_dir 下面;Docker 中即 /data。 session 保存 bot 授权,必须保持私密。不要共享、写入镜像或提交到仓库。

MTProto 使用与应用其他功能相同的 BotFather token 登录 bot。它不会登录个人 Telegram 账号,也不会要求手机号、登录验证码或两步验证密码。setup 不会连接 Telegram;首次 实际发生的 MTProto 投递才会创建并保存可复用的 bot session。

官方 PyPI 与 GHCR 发行包可以使用默认 MTProto 路径。源码构建需要在私有配置中 提供自己的 application 凭据对:

[telegram.mtproto]
api_id = 123456
api_hash = "0123456789abcdef0123456789abcdef"

也可以在运行时成对提供:

ASMR_TG_MTPROTO_API_ID=123456
ASMR_TG_MTPROTO_API_HASH=0123456789abcdef0123456789abcdef

只接受完整的一对。完整的运行时变量凭据会覆盖私有 TOML 中的完整凭据。官方安装包 用户通常不需要设置这两处;源码构建必须配置其中一处。

环境变量覆盖

变量 用途 TOML 回退
ASMR_TG_BACKUP_DATA_DIR 数据库、下载和相对 session 的根目录 [app].data_dir
TELEGRAM_BOT_TOKEN BotFather token telegram.bot_token
TELEGRAM_CHAT_ID 目标聊天或频道 telegram.chat_id
ASMR_TG_UPLOAD_TRANSPORT mtprotobot_api telegram.upload_transport
ASMR_TG_MTPROTO_API_ID MTProto application ID telegram.mtproto.api_id
ASMR_TG_MTPROTO_API_HASH MTProto application hash telegram.mtproto.api_hash
TELEGRAM_API_BASE Bot API 地址 telegram.bot_api.api_base
TELEGRAM_MAX_UPLOAD_BYTES Bot API 单文件大小上限 telegram.bot_api.max_upload_bytes

环境文件应保持 0600。MTProto application 凭据对并不是 bot token,也不能替代它。

选择 transport

启用 FFmpeg 时,上传封面会生成最大 320×320 的正方形 JPEG:原图居中裁切为正方形 (横图裁左右、竖图裁上下),再等比缩小,不拉伸、不补黑边。此处理适用于新上传的 媒体,已有消息的封面保持原样。

upload_transport 决定媒体上传器:

  • mtproto 通过一个持久化 MTProto client 上传,不需要额外 Bot API 服务;
  • bot_api 使用配置的 HTTP Bot API 端点,并且只有媒体上传需要 curl

即使媒体使用 MTProto,Telegram 控制面板仍会使用一个 Bot API 地址。设置了 [control].api_base 时优先使用它,否则继承 [telegram.bot_api].api_base。控制面板 使用自己的 Python HTTP client,不需要 curl

MTProto、Bot API 与音频分块之间不存在自动回退顺序。Telegram 可能已经接受消息时发生 超时,会被记录为 uncertain,以避免重复消息。transport 切换始终需要显式配置。

MTProto 媒体上传

默认 1,990,000,000 字节的应用限制为 Telegram 普通上传上限预留了余量。MTProto 直接上传媒体,保持正常的标题、caption 和封面行为,不创建音频分段。

新的 pipx 安装可以从一开始就包含可选 extra:

pipx install "asmr-tg-backup[performance]"

对于已有的 pipx 安装,请把加速器注入该应用自己的隔离环境:

pipx inject asmr-tg-backup "cryptg>=0.5,<1"

在虚拟环境中,请使用该环境的 Python 安装 extra:

python -m pip install "asmr-tg-backup[performance]"

cryptg 只是可选的加密加速器,不会改变投递语义。

上传器使用单一进程级 client。不要把应用横向扩容为多个共享同一 SQLite 状态或 MTProto session 的进程。

使用已有 Bot API

[telegram]
upload_transport = "bot_api"

[telegram.bot_api]
api_base = "https://api.telegram.org"
max_upload_bytes = 49000000
split_large_audio = true
max_upload_parts = 10

setup 中选择 已有 API URL 时,会按大文件端点配置 1.99 GB 上限并关闭分块。如果 填写 api.telegram.org,请改为 49 MB 并启用音频分块。远程地址使用 HTTPS;本机回环 和 Compose 内网地址可以使用 HTTP。

可播放音频分块

分块是 Bot API 的超限策略,不是第三种 transport,也不会从 MTProto 自动回退到 分块。只有显式选择 bot_api 时才会执行。音频超过 telegram.bot_api.max_upload_bytes 且已启用分块时,ffmpeg 会创建 2-10 个可独立 播放的 M4A/MP3 分段,并作为一个媒体组发送。

每一段都会得到:

  • Part i/n 结尾的独立标题;
  • 自己的 thumbnail attachment;
  • 完整可播放的媒体容器。

caption 放在第一项。如果文件无法在 max_upload_parts 内装下,投递会给出明确的超限 原因并停止,不会无限重试。document 与 video 必须符合端点本身的限制。

本地 Bot API

如果主机已经安装 telegram-bot-api,原生 setup 可以把它注册为监听 127.0.0.1:18081 的用户服务。Compose 可通过 local-api profile 启动同类服务,地址为 http://telegram-bot-api:8081

服务端的 TELEGRAM_API_ID/HASH 与应用自身的 ASMR_TG_MTPROTO_API_ID/HASH 是两套独立变量。setup 不会下载 C++ 服务端,也不会 自动执行 Telegram bot 迁移。把云端使用过的 token 转移到本地前,请执行 官方迁移流程

Caption 与媒体类型

caption_template 可以使用 {title}{url}{feed_name}(来源名称)、 {video_id}{tag}media_type 接受 audiovideodocumentsend_as_document = true 会强制使用 document 投递。

上传失败不会删除本地完整备份文件。