owpengram-server/README.zh-CN.md
2026-06-04 01:37:39 +08:00

6.6 KiB
Raw Blame History

telesrv

telesrv 是一个用 Go 编写的 Telegram-like MTProto server。它以 github.com/gotd/td v0.144.0 / Layer 225 作为 TL 与 MTProto 基础,第一兼容目标是固定基线的 Telegram Desktop。

telesrv 是独立的非官方项目,与 Telegram 官方及其团队没有关联,也未获得其背书或赞助。

English README

Telegram Desktop Alice/Bob connected to telesrv

当前状态

本项目适合本地协议研究、Telegram Desktop 兼容性验证和自建 MTProto server 实验。它不是生产级 Telegram 替代品。

当前已覆盖的主路径包括 MTProto key exchange、开发验证码登录、users/contacts/dialogs、私聊消息、超级群/频道、updates difference 恢复、本地 media/files、用户/频道头像、stickers、reactions 和 presence。

暂不默认覆盖大规模公开频道、多 DC / 文件 DC / CDN、Bot API、payments、stories、Premium 商业逻辑、生产风控、生产对象存储等能力。

欢迎贡献

欢迎大家参与贡献。现在最有价值的方向包括 Telegram Desktop 兼容性报告、可复现 RPC trace、聚焦的小 bug fix、在线/离线 updates 行为测试、已实现路径的性能优化,以及让本地启动更顺滑的文档改进。

请尽量保持改动范围清晰,并围绕兼容性目标展开。如果改动会影响 Telegram Desktop 可见行为,请在 PR 或说明里写清客户端版本/commit、验证过的 RPC 路径,以及 server 日志是否没有新增 NOT_IMPLEMENTEDUnhandled RPCbad_msg、panic 或 internal error。

仓库结构

cmd/telesrv/              server 启动入口
deploy/                   docker-compose 与 PostgreSQL migrations
internal/mtprotoedge/     MTProto transport、auth key、session、ack/resend
internal/rpc/             TL router 与 Telegram Desktop 兼容 handlers
internal/app/             domain services
internal/domain/          不依赖协议生成类型的 domain models
internal/store/           store interfaces 与 memory/postgres/redis 后端
docs/                     兼容性记录与模块设计文档

运行 telesrv

依赖:

  • Go 1.25 或更新版本
  • Docker Desktop 或带 Compose 的 Docker Engine
  • OpenSSL如果要编译匹配的 Telegram Desktop 客户端

启动 PostgreSQL 和 Redis

docker compose -f deploy/docker-compose.yml up -d

编译并启动 server

go build -o bin/telesrv.exe ./cmd/telesrv
.\bin\telesrv.exe

第一次启动时,telesrv 会创建 data/server_rsa.pem,自动执行所有数据库 migrations导入内置语言包并监听 0.0.0.0:2398

常用开发环境变量:

变量 默认值 说明
TELESRV_LISTEN 0.0.0.0:2398 MTProto 监听地址
TELESRV_ADVERTISE_IP 127.0.0.1 写入 help.getConfig 的客户端连接 IP
TELESRV_DC 2 自建 DC id
TELESRV_DEV_AUTH_CODE 12345 本地开发固定登录验证码
TELESRV_POSTGRES_DSN local Compose DSN PostgreSQL 连接串
TELESRV_REDIS_ADDR localhost:6399 Redis 地址
TELESRV_STICKER_SEED_DIR data/sticker-seed 可选的 sticker/reaction 导出种子目录

如果 sticker seed 目录不存在,启动时会自动跳过。

编译连接 telesrv 的 Telegram Desktop

官方 Telegram Desktop 二进制不能直接连接 telesrv,因为它信任的是 Telegram 官方 DC 列表和 RSA keys。你需要编译一个最小 patch 过的客户端。

目标基线:

  • Telegram Desktop commit9caf32dffc90ddd9bb08ad5777b865f729fa167b
  • TL layer225
  • 本地 DC127.0.0.1:2398DC id 2

克隆并固定 Telegram Desktop

git clone --recursive https://github.com/telegramdesktop/tdesktop.git
cd tdesktop
git checkout 9caf32dffc90ddd9bb08ad5777b865f729fa167b
git submodule update --init --recursive

编译依赖和各平台完整说明以 Telegram Desktop 上游文档为准:

  • Windowsdocs/building-win.md
  • macOSdocs/building-mac.md
  • Linuxdocs/building-linux.md

Windows x64 下,固定基线的主要步骤是:

Telegram\build\prepare\win.bat
cd Telegram
configure.bat x64 -D TDESKTOP_API_ID=YOUR_API_ID -D TDESKTOP_API_HASH=YOUR_API_HASH

然后用 Visual Studio 打开 out\Telegram.slnx,构建 Telegram project。Debug 二进制会生成在 out\Debug\Telegram.exe

Patch Telegram Desktop

telesrv 生成 data/server_rsa.pem 后,导出匹配的公钥:

openssl rsa -in data/server_rsa.pem -RSAPublicKey_out -out data/server_rsa.pub

修改 Telegram Desktop 文件:

Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp
  1. 把内置 production/test DC 列表替换为本地 DC 2
const BuiltInDc kBuiltInDcs[] = {
    { 2, "127.0.0.1", 2398 },
};

const BuiltInDc kBuiltInDcsIPv6[] = {
    { 2, "::1", 2398 },
};

const BuiltInDc kBuiltInDcsTest[] = {
    { 2, "127.0.0.1", 2398 },
};

const BuiltInDc kBuiltInDcsIPv6Test[] = {
    { 2, "::1", 2398 },
};
  1. kPublicRSAKeyskTestPublicRSAKeys 都替换为 data/server_rsa.pub 的内容。
  2. DcOptions::constructFromBuiltIn() 中给 IPv4 与 IPv6 built-in DC flags 加上 Flag::f_tcpo_only
const auto flags = Flag::f_static | Flag::f_tcpo_only;
const auto flags = Flag::f_static | Flag::f_ipv6 | Flag::f_tcpo_only;

客户端 patch 应保持最小:只改 DC endpoint、RSA public key 和 TCP-only flags不要把 UI 改动混入协议兼容 patch。

启动两个本地 Desktop 客户端

用不同的 TDesktop working directory避免 Alice 和 Bob 共用同一个 tdata

$tdesktop = "C:\path\to\tdesktop\out\Debug\Telegram.exe"
Start-Process $tdesktop -ArgumentList @("-workdir", "$PWD\.tdata-alice")
Start-Process $tdesktop -ArgumentList @("-workdir", "$PWD\.tdata-bob")

用两个不同手机号登录。本地开发默认验证码是 12345,除非你修改了 TELESRV_DEV_AUTH_CODE

如果客户端一直重连,优先检查:

  • telesrv 是否正在监听 2398
  • data/server_rsa.pub 是否同时复制到了 TDesktop 的两个 RSA key 数组。
  • TELESRV_ADVERTISE_IP 是否是客户端可访问的地址。
  • TDesktop 是否基于固定 Layer 225 基线构建,或者你已经重新审计了新 layer。

文档