Search by

hideinmatrix / flarum-telegram-upload

HideInMatrix

Telegram attachment storage for Flarum 2.x through FoF Upload and tg-disk.

Package info

github.com/HideInMatrix/flarum-telegram-upload

Type:flarum-extension

pkg:composer/hideinmatrix/flarum-telegram-upload

Statistics

Installs: 8

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v0.2.0 2026-10-20 05:40 UTC

This package is auto-updated.

Last update: 2026-10-20 05:45:03 UTC


README

通过 FoF Upload → tg-disk → Telegram / Cloudflare R2 存储论坛附件的独立 Flarum 扩展。

使用官方 @flarum/cli 3.0.13 的 Flarum 2.x 扩展模板建立,采用 Composer 包、PSR-4 自动加载、标准 extend.php、服务提供者和事件监听器。项目不包含论坛安装文件或实际站点配置。模板来源

功能与范围

  • 依赖 PHP 8.3+、Flarum ^2.0、FoF Upload ^2.0.1。
  • 支持常见图片、PDF、ZIP、7z、gzip 和纯文本;每个文件最多 10 MiB。
  • Telegram 使用 document 保存,避免 Telegram 压缩图片和 GIF。
  • 后台填写 tg-disk 站点 URL,选择 Telegram 或 Cloudflare R2;R2 不需要频道 ID。
  • 上传成功后保存完整文件直链:Telegram 为 {站点}/file/{id},R2 为 {站点}/r2/{key}。
  • 切换存储方式或站点地址只影响新上传;旧记录中的完整 URL 保持不变。新图片预览直接读取 tg-disk,访问策略由 tg-disk 管理。
  • 兼容旧适配器生成的 /api/tinker-telegram/{uuid} 地址。
  • 没有配置缩放、水印时,图片保留原始字节。
  • 删除仅移除论坛媒体记录,不会请求 tg-disk 删除 Telegram 文件或 R2 对象;远端内容及其直链不受影响。清理记录不需要上传 API Key。
  • 缩略图暂不单独存储,图片预览直接读取完整图片。

安装

在论坛根目录执行:

composer require hideinmatrix/flarum-telegram-upload:"^0.2"

发布流程、后续更新、Extension Manager 和当前路径包切换方式参见 发布说明,版本变更参见 CHANGELOG。

在管理后台启用 Telegram Upload,进入该扩展的配置页填写并保存:

字段 填写内容
tg-disk 站点 URL https://your-tg-disk.example.com,只填写站点地址
新上传文件的存储方式 Telegram 或 Cloudflare R2
TG_DISK_API_KEY 与 tg-disk 服务端私密 NUXT_API_KEY 完全一致,至少 32 个字符
上传频道 ID 仅 Telegram 需要,例如 -1000000000000;R2 可以留空

密钥输入框使用密码样式,设置仅管理员可读,不会写入论坛公开 API。不要填写 NUXT_SESSION_PASSWORD,也不要提交真实密钥到仓库。论坛不需要 Telegram Bot Token。保存立即作用于后续上传请求,无需重新创建容器。缺少有效配置时,tg-disk 上传存储不会启用。R2 的存储桶与凭据在 tg-disk 侧配置,论坛只使用相同的 API Key。

0.1.x 保存的完整上传接口 URL 仍兼容,后台保存新的站点 URL 后以新字段为准。旧帖子中的 /api/tinker-telegram/{uuid} 继续工作;升级不改写历史帖子或附件行。

旧版的 config.php 中 telegram-upload 配置和 TG_DISK_BASE_URL、TG_DISK_CHAT_ID、TG_DISK_API_KEY 环境变量仍兼容;后台已保存的字段优先,包括空值。建议统一使用后台配置,移除旧配置以免混淆。扩展不自动加载 .env。

安装或升级后执行:

php flarum cache:clear

在 FoF Upload → 文件类型 中,将需要的规则的存储位置选择为 tg-disk(Telegram / R2)(内部兼容键仍为 telegram);大小上限设置为 10240 KB。图片选择“完整图片预览模板”,其他文件选择“默认文件下载模板”。本扩展不会自动改变用户组权限。上传和论坛下载入口沿用 FoF 权限;直接访问 tg-disk 链接由 tg-disk 的访问规则控制。

如果服务器已部署旧的 tinker-telegram 目录适配器,请先阅读 迁移说明,避免重复注册路由。

从 0.1.x 升级

composer require hideinmatrix/flarum-telegram-upload:"^0.2" --with-all-dependencies
php flarum cache:clear

在插件后台填写站点 URL、选择存储方式并保存。已有 0.1.x 版本约束需要更新为 ^0.2,普通 composer update 不会跨过该约束。

本地开发与测试

composer install
composer validate --strict
composer lint
composer test:unit
# 只对隔离的测试数据库执行,会清空指定的测试库:
composer test:setup
composer test:integration

PHPUnit 集成测试使用 Flarum 官方 flarum/testing。测试初始化默认使用 SQLite;不要指向生产数据库。测试目录与缓存均已被 Git 忽略。

没有本地 PHP 时,先构建包含 Flarum 所需 GD 扩展的 Composer 测试容器:

docker build -f docker/Dockerfile.test -t flarum-telegram-upload-test:local .
docker run --rm -v "$PWD:/app" -w /app flarum-telegram-upload-test:local composer install
# 首次创建隔离的 SQLite 测试数据库:
docker run --rm -v "$PWD:/app" -w /app \
  -e FLARUM_TEST_TMP_DIR_LOCAL=/app/tests/integration/tmp \
  flarum-telegram-upload-test:local composer test:setup
docker run --rm -v "$PWD:/app" -w /app \
  -e FLARUM_TEST_TMP_DIR_LOCAL=/app/tests/integration/tmp \
  flarum-telegram-upload-test:local composer test

测试验证后台保存与校验、普通用户不能修改密钥、清空配置不会回退到旧密钥、上传鉴权、密钥不进入公开 API 数据、扩展启动与依赖注入、旧 URL、访客下载限制、授权图片响应以及媒体记录删除。删除沿用 FoF 的权限校验,仅清理选中的论坛记录,不发出远程请求;其他存储适配器沿用原有删除行为。测试对 tg-disk 使用模拟 HTTP,不会发送真实附件或删除 Telegram 消息。

前端源码沿用官方 CLI 的 JavaScript 管理端结构;修改后台界面后在 js/ 执行 npm ci && npm run build,并提交 js/dist/admin.js,以便 Composer 安装直接使用。

运行条件

PHP 运行用户必须能写入论坛存储目录。FoF Upload 即使使用 Telegram 存储,也会初始化 storage/private-shared/files;权限错误会在 tg-disk 调用前触发 500。目录修复命令和 v0.1.1 的只读检查工具参见 上传错误排查。

tg-disk 需要提供 POST /api/telegram/send、POST /api/r2/send、GET /file/{file_id}、GET /r2/{key}。只需部署实际使用的存储后端。上传结果包含 code、data.file_id、data.file_size;插件根据上传时的站点 URL 与存储方式拼接并保存完整文件 URL。Bot、频道和 R2 存储桶在 tg-disk 侧配置。上传通过服务端 X-API-Key 请求头鉴权,401/403 返回明确提示,不转发上游响应中的敏感内容。文件读取沿用 tg-disk 的 host/referer 规则,不附加 API Key。服务器必须能访问 tg-disk,tg-disk 的文件访问规则需允许论坛页面嵌入图片;若启用防盗链,配置对应的论坛域名。当前插件对两种后端均保持 10 MiB 上限。接口核对记录

论坛数据库仍保存附件索引和权限关联,需与扩展配置一起备份。图片直链读取依赖 tg-disk 与对应存储后端;旧论坛代理地址仍可使用。tg-disk 本身的上传鉴权和文件直链访问策略由其服务端负责。

License

MIT,见 LICENSE.md。