📌 项目地址:FxEmbed/FxEmbed | ⭐ 5,325 颗星 | 🔧 TypeScript | 📜 未标注
在 Discord 或 Telegram 里发 X(Twitter)链接,结果视频不放、投票只剩标题、四张图只出一张,这种事谁都碰过。原因不在 Discord:X 自己的链接预览做得残缺又不稳定。FxEmbed 干的就是这件事:把链接域名稍微改一下,预览就正常了。
用法只有一步
改域名前缀:
twitter.com前面加fx,变成fxtwitter.comx.com前面加fixup,变成fixupx.combsky.app前面加fx,变成fxbsky.app
比如把 https://x.com/user/status/123 改成 https://fixupx.com/user/status/123 再发出去,视频、投票、多图、引用推文都能正常渲染。点进去的访客会被送回原链接,不影响阅读。
原理不复杂。Discord 和 Telegram 显示链接预览时,会去抓目标页面的 OpenGraph 元数据。FxEmbed 就是一个专门生成正确元数据的服务:视频直链、多图、投票选项、引用和翻译,它都按平台能解析的格式吐出来。用户不需要装任何插件。
项目本身是 TypeScript 写的,5325 个 star,MIT 协议。维护状态可以从几个地方看出来:有 Crowdin 上的多语言翻译协作、CI 里有构建和测试流水线、还有独立的状态页 status.fxtwitter.com(README 挂了 30 天在线率徽章)。
自托管
FxEmbed 是个 Cloudflare Worker。官方 Docker 镜像跑的不是普通 Node.js 服务,而是通过 Wrangler 启动本地 Workers 运行时。镜像选 node:24-bookworm-slim 而不是 Alpine,因为 Wrangler 的 workerd 二进制是 glibc 链接的,在 musl 上跑不可靠。
构建前先复制三份示例配置,按需改域名、品牌、凭据:
cp .env.example .env
cp wrangler.example.toml wrangler.toml
cp branding.example.json branding.json
然后一条命令起服务:
docker compose up -d --build
Worker 监听 http://localhost:8787。有个容易踩的坑:FxEmbed 按 Host 头路由,本地测试时要手动指定,比如:
curl -H "Host: fxtwitter.com" -H "User-Agent: Discordbot/2.0" "http://localhost:8787/user/status/123"
直接开 http://localhost:8787/ 不带 Host 头,能看到本地支持的 realm 前缀列表。
还有一个细节:.env 里的环境变量是在 Docker 构建时打包进镜像的,改了域名列表这类构建期配置必须重新 build(还是 docker compose up -d --build)。但 CREDENTIAL_KEY、EXCEPTION_DISCORD_WEBHOOK 这类运行时密钥走 shell 或 Compose 的 .env,不用重建。停服务就是 docker compose down。
除了改链接,还有 API
FxEmbed 提供公开 API,可以程序化拿到推文的结构化数据,文档在 docs.fxembed.com/api/introduction。自托管的完整指南在 docs.fxembed.com/deployment。
几个要想清楚的点
用公共实例(fxtwitter.com 等)意味着你的请求会经过第三方服务器。介意的话就自托管,顺便把默认密钥配置改掉。
另外,这类项目都依赖 X 和 Bluesky 的接口,上游一改,部分功能就可能失效。这是模式本身的限制,不是 FxEmbed 能控制的。好在项目社区还在活跃提交,遇到问题可以去 GitHub Issues 反馈,也欢迎 PR。