一、简介
本教程包含五块内容:
-
编译并安装官方 TDLib(C++)
-
生成并编译 go‑tdlib(Go 语言绑定)源码
-
在 example 目录中配置环境、编译并运行 demo
-
解决常见的编译/链接/运行时错误
-
获取并使用 Telegram 的 API_ID 和 API_HASH
二、前置准备
-
操作系统:macOS
-
Go 版本:≥ 1.23
-
工具:CMake、Make、Xcode Command Line Tools
-
Telegram 账号:用于登录 my.telegram.org 获取 API_ID/API_HASH
三、编译并安装 TDLib(C++)
-
克隆 TDLib 源码并进入构建目录:
git clone https://github.com/tdlib/td.git cd td mkdir build && cd build
-
配置、编译并安装到 /usr/local:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local .. cmake --build . --target install
-
验证安装结果:
ls /usr/local/include/td/telegram/td_json_client.h # 应输出:/usr/local/include/td/telegram/td_json_client.h ls /usr/local/lib/libtdjson* # 应输出类似 libtdjson.dylib、libtdjson.1.8.48.dylib
四、获取并生成 go‑tdlib 源码
-
克隆 go‑tdlib 并进入目录:
cd ~/projects git clone https://github.com/zelenin/go-tdlib.git cd go-tdlib
-
生成 Go 绑定代码:
make
-
验证生成结果:
ls client | grep generated.go
应至少包含:
- `function_generated.go` —— 根据 TL Schema 生成的请求方法
- `type_generated.go` —— 根据 TL Schema 生成的类型定义
- `unmarshaler_generated.go` —— JSON 反序列化逻辑
- `version_generated.go` —— 代码生成器版本信息
你可以这样确认:
若能看到上述文件,说明代码生成成功。ls client | grep generated.go
-
(可选)查看 iter/ 目录下生成的迭代器文件,如 chat_history_iterator.go 等。
五、编译并运行 Example
-
进入示例目录:
cd go-tdlib/example
-
安装 OpenSSL(如果尚未安装):
brew install openssl@3
-
设置环境变量:
export GOOS=darwin export GOARCH=arm64 # 或 amd64,视你的机器而定 export CGO_ENABLED=1 # TDLib 头文件与库 export CGO_CFLAGS="-I/usr/local/include" export CGO_LDFLAGS="-L/usr/local/lib -ltdjson" # OpenSSL 头文件与库(Homebrew 路径) export CGO_CFLAGS="$CGO_CFLAGS -I$(brew --prefix openssl@3)/include" export CGO_LDFLAGS="$CGO_LDFLAGS -L$(brew --prefix openssl@3)/lib -lssl -lcrypto"
-
清理并获取依赖:
go clean -cache -modcache go mod tidy
-
编译并内嵌 rpath:
go build -o demo \ -ldflags '-extldflags "-Wl,-rpath,/usr/local/lib"' \ demo.go
-
运行 demo:
./demo
首次运行会依次提示输入:API_ID,API_HASH,手机号(登陆授权第一步)
六、示例运行与授权流程
-
在命令行输入你的 手机号。
-
输入 Telegram 客户端发来的 验证码。
-
如果启用了两步验证,再输入 密码。
-
登录成功后,进入 authorizationStateReady。
-
示例将打印所有收到的更新;你也可以在提示下发送消息。
七、常见问题及解决
-
undefined: JsonClient / Response / Type
→ 未生成 Go 绑定,回到 “四” 执行 make 或 go generate。
-
Library not loaded: @rpath/libtdjson
→ 未设置 rpath 或环境变量。见 “五.6” 加 -rpath 或 DYLD_LIBRARY_PATH。
-
linux_syscall.c: undefined: setresgid
→ 交叉编译到 Linux,确保 GOOS=darwin GOARCH=... CGO_ENABLED=1。
-
500 Request aborted
→ 删除旧数据库目录(如 rm -rf tdlib-data/),重新运行。
-
strconv.Atoi parsing “”: invalid syntax
→ 未设置 API_ID/API_HASH,请通过 export 注入。
-
ld: library ‘ssl’ not found
→ 未配置 OpenSSL 库路径,见 “五.4” 中的 OpenSSL 设置。
八、获取 API_ID 和 API_HASH
-
打开 my.telegram.org 并登录。
-
点击 API development tools。
-
填写应用名称等,创建新应用。
-
记录页面展示的 api_id(数字)和 api_hash(字符串)。
-
通过环境变量注入:
export API_ID=你的_api_id export API_HASH="你的_api_hash"
九、小结
至此,你已完成:
-
TDLib C++ 库的编译与安装
-
go‑tdlib 源码的生成
-
example/demo 的编译、运行与授权
-
常见错误的排查与解决
-
API_ID/API_HASH 的获取与使用
下一步,我们将把示例逻辑迁移到 Kratos v2.8.4 项目中,封装成 gRPC 服务