CrossGram 是基于 cordis 与 mtcute 的第三方 Telegram 服务端,把 QQ、Discord、Matrix 等聊天平台桥接到 Telegram 客户端。
插件与配置在 app.yml 中声明,核心分三层:
- MTProto 服务(
@mtproto-relay/mtproto):处理 MTProto 传输、DH 握手与 Auth Key 存储。首次启动时在data/rsa-key.json生成服务器密钥对,并导出公钥data/rsa-key.json.pem供客户端配置。 - Bridge(
@mtproto-relay/bridge):实现 Telegram RPC、虚拟号登录、会话/消息投影、媒体收发、更新推送与 WebUI 管理页面。 - 平台适配器(
@mtproto-relay/platform-*):对接具体 IM 平台,实现 IMPlatform 接口。app.yml中的每个适配器实例对应一个平台账号和一个可登录的 Telegram 身份。
| 平台 | 包名 | 连接目标 | 说明 |
|---|---|---|---|
@mtproto-relay/platform-qqnt |
注入 QQNT 的 qqnt-bridge 本地服务 |
主力平台,见 packages/platform-crossgram |
|
| Discord | @mtproto-relay/platform-discord |
Discord 用户账号(Userbot) | 支持私聊、群组、频道、子频道与回应 |
| Matrix | @mtproto-relay/platform-matrix |
Matrix Client-Server API | 仅支持未加密房间 |
| Satori | @mtproto-relay/platform-satori |
Satori 适配器 | 能力取决于底层 Satori adaptor |
| 微信 | @mtproto-relay/platform-wechat |
Windows ComWeChat HTTP API | 仅接收文本消息与基础会话 |
| Static | @mtproto-relay/platform-static |
内存模拟数据 | 测试与参考实现 |
Caution
Discord 适配器使用普通用户 Token 自动操作,违反 Discord 服务条款,存在封号风险。
| 能力 | Discord | Matrix | Static | |
|---|---|---|---|---|
| 历史消息 | ✓ | ✓ | ✓ | ✓ |
| 已读同步 | 仅标记已读 | ✓ | ✓ | ✓ |
| 消息搜索 | ✓ | ✗ | ✗ | ✗ |
| 文字 / 图片 / 文件 / 图文混排 | ✓ | ✓ | ✓ | ✓ |
| 私聊与群聊 | ✓ | ✓ | ✓ | ✓ |
| 频道 / 子频道(话题) | ✗ | ✓ | Space | ✓ |
| 成员列表与管理员 | ✓ | ✓ | ✓ | ✓ |
| 设置管理员 | ✓ | ✗ | ✗ | ✓ |
| 禁言与踢人 | ✓ | ✗ | ✗ | ✗ |
| 好友与入群申请 | ✓ | ✗ | ✗ | ✗ |
| 撤回消息 | 120 秒内 | ✓ | ✓ | ✓ |
| 编辑消息 | 120 秒内撤回重发 | ✓ | 仅纯文本 | ✓ |
| 转发 | ✓ | ✓ | ✗ | ✓ |
| 合并转发 | ✓ | ✗ | ✗ | ✗ |
| 表情回应(Reaction) | ✓ | ✓ | ✗ | ✓ |
| 贴纸 / 收藏表情 | ✓ | 作为图片接收 | ✗ | ✓ |
| 系统提示(灰条) | ✓ | ✓ | ✗ | ✗ |
| 戳一戳 | ✓ | ✗ | ✗ | ✗ |
| 语音消息与转写 | ✓ | ✗ | ✗ | ✗ |
| 群文件 | ✓ | ✗ | ✗ | ✗ |
| 私聊语音通话 | 需 voice-worker |
✗ | ✗ | ✗ |
| 富文本 / 文章消息 | ✓ | ✓ | ✓ | ✓ |
详见各适配器文档:
@mtproto-relay/platform-satori 可将任意 Satori adaptor 接入 Bridge:
- id: satori-core
name: '@satorijs/core'
- id: discord-adaptor
name: '@satorijs/adapter-discord'
config:
token: your-token
- id: discord
name: '@mtproto-relay/platform-satori'
config:
bot: discord:your-bot-id # 只有一个 Bot 时可省略需要 Node.js 24+ 与 Yarn 4(通过 corepack enable 启用):
corepack enable
yarn install
yarn dev # 开发模式(热重载)
yarn build && yarn start # 生产模式首次启动会在 data/ 下生成 RSA 密钥、Auth Key 文件和 SQLite 数据库 cordis.db。WebUI 默认地址为 http://127.0.0.1:3140。
普通运行不需要 Rust 或 C++ 工具链;仅语音通话使用的 voice-worker 需要原生编译(可由 flake.nix 构建)。
MTProto 服务的 host/port 是实际监听地址;Bridge 的 serverHost/serverPort/altEndpoints 是在 help.getConfig 中向客户端公布的连接地址(反代或 NAT 下两者可能不同):
- id: mtproto01
name: '@mtproto-relay/mtproto'
config:
host: 0.0.0.0
port: 4430
rsaKeyPath: ./data/rsa-key.json
authKeyStorePath: ./data/auth-keys.json
- id: bridge01
name: '@mtproto-relay/bridge'
config:
dcId: 1
serverHost: 192.168.1.10
serverPort: 4430
altEndpoints:
- bridge-backup.example:8443
- id: qqnt
name: '@mtproto-relay/platform-qqnt'
config:
endpoint: http://127.0.0.1:18767/v1
token: your-qqnt-bridge-token # 省略时读取环境变量 QQNT_BRIDGE_TOKENcurl -fsSL https://raw.githubusercontent.com/std-microblock/crossgram/main/deploy/install.sh \
| sudo CROSSGRAM_PUBLIC_HOST=203.0.113.10 sh完整步骤(PostgreSQL 初始化、环境变量与更新脚本)见 deploy/README.md。
官方客户端写死了 Telegram 官方服务器地址与公钥,必须使用打过补丁的客户端连接 CrossGram:
| 仓库 | 上游客户端 | 平台 |
|---|---|---|
| crossgram-desktop | Telegram Desktop、64Gram、AyuGram、materialgram | Windows、macOS、Linux |
| crossgram-android | Telegram、Nagram、Nnngram、Nullgram、Mercurygram、Forkgram | Android |
| crossgram-unigram | Unigram | Windows |
| crossgram-telegram-x | Telegram X | Android |
| crossgram-mithka | Mithka | Android、iOS、桌面 |
Unigram、Telegram X 与 Mithka 共用 crossgram-tdlib。
在客户端登录页点击「服务器」,导入以下 JSON(可在 WebUI /platform-accounts、管理 Bot /server 命令或 crossgram-client-config 脚本获取):
{
"name": "Crossgram",
"enable_special_config": false,
"host": "203.0.113.10",
"port": 4430,
"rsa_key": "-----BEGIN RSA PUBLIC KEY-----\n...\n-----END RSA PUBLIC KEY-----",
"dcs": [{ "id": 1, "ip": "203.0.113.10", "port": 4430 }]
}Bridge 为每个平台账号分配 +888 开头的虚拟手机号(QQ 账号为 +888 <QQ号>,其他平台为固定随机 12 位号码)。
登录码为每 30 秒轮换的 6 位 TOTP 码,可在以下位置查看:
- WebUI
/platform-accounts页面 - 已登录客户端中的
@CrossGramAdminBot(也可直接批准扫码登录)
若在 WebUI 为账号设置了两步验证密码,输入 000000 即可进入密码验证步骤。
可在 app.yml 中按需启用:
- 合并转发查看(
@mtproto-relay/merged-forward):将 QQ 合并转发渲染为只读群聊链接,支持嵌套展开。 - 群文件 Mini App(
bridge.groupFilesMiniApp):在群聊附件菜单提供群文件浏览、搜索与下载(需为移动端配置可访问的 HTTPSpublicUrl)。 - 平台管理 Bot(
@mtproto-relay/platform-admin-bot):提供@CrossGramAdminBot会话,详见 文档。 - Telegram Bot API(
@mtproto-relay/telegram-bot-api):提供本地/bot<token>/<method>接口与@BotFather,需配置固定的verifierSecret。 - QQ 闪传(
@mtproto-relay/qq-flash-transfer-bot):提供「QQ 闪传」Bot,转发已有 QQ 文件走秒传,直接发送新文件走流式上传,返回闪传分享链接。 - 贴纸包导入(
@mtproto-relay/telegram-sticker-importer):配置TELEGRAM_STICKER_IMPORTER_BOT_TOKEN后,向 Bot 发送https://t.me/addstickers/<name>即可将官方贴纸包导入当前账号。 - 导出到 Satori(
@mtproto-relay/satori-exporter):将已接入 Bridge 的平台账号重新暴露为 Satori Bot。 - 群满员自动踢人(
@mtproto-relay/group-auto-kick):群人数达到上限时自动移出最久未发言成员,详见 文档。
yarn typecheck # 类型检查
yarn test:unit # 单元测试
yarn test:e2e # 端到端测试调试工具:
- WebUI
/mtproto-debug:按需抓取 MTProto 收发包 - WebUI
/mtproto-statistics:统计 RPC 耗时、流量与慢请求 @mtproto-relay/debug-scripts:热加载data/debug-scripts下的临时诊断脚本yarn mtproto:e2e:使用真实 MTProto 客户端连接服务执行探测脚本
架构与内部设计文档:
MIT
