众所周知,tg创建机器人特别简单,而机器人不管是用于通知还是用来做群管理都是十分方便的。但是,如果需要更多权限的功能就不能的胜任了。于是,我盯上了官方的客户端,并找到了一个完善的教程。
问题出现
但是,尽管教程写的很详细,我还是遇到了不少问题。
当然这些问题目前来说只针对我所参考的教程和环境
代码编译不通过
当我兴致勃勃的按照教程走完所有流程的时候,代码编译不通过无疑是最大的打击。不过根据报错信息和部分源码,我大概锁定了问题。
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
首先是tdlib编译环境和选项的问题,以下是Go
、macOS
、Apple silicon
环境的代码
xcode-select --install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install gperf cmake openssl
git clone https://github.com/tdlib/td.git
cd td
rm -rf build
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl/ -DCMAKE_INSTALL_PREFIX:PATH=../tdlib ..
cmake --build . --target install
cd ..
cd ..
ls -l td/tdlib
在上面的代码中有两个位置是比较重要的,DOPENSSL_ROOT_DIR
是openssl
的位置,而intel结构的区别就是这个位置不一样,导致这个不一样的原因是homebrew安装的默认目录是不一样的;第二个是DCMAKE_INSTALL_PREFIX
,这个参数表示tblib安装的位置,如果不是有很强的位置强迫症的话,可以把Install built TDLib to /usr/local instead of placing the files to td/tdlib.
勾选上,这里会用默认的位置,一会也可以少改动一个参数。
而在go-tdlib/tdlib.go at master · Arman92/go-tdlib · GitHub的代码中,有一个地方配置了默认的环境变量,这个对大部分的环境是可以通用的,但是arm架构的mac因为位置不同,所以需要改动。
//#cgo darwin CFLAGS: -I/usr/local/include
这个位置需要改成DCMAKE_INSTALL_PREFIX
的绝对路径,如果勾选了上面的选项,则不需要改动。
//#cgo darwin LDFLAGS: -L/usr/local/lib -L/usr/local/opt/openssl/lib
这个位置需要改成openssl所在路径,默认的在/opt/homebrew/opt/openssl/lib
,更新完之后,编译就没问题了。
无法登陆
在使用了GitHub - Arman92/go-tdlib: Golang Telegram TdLib JSON bindings的示例代码启动之后,程序一直无响应,经过debug发现是currentState.GetAuthorizationStateEnum()
的状态一直无法变动的问题,同时issue也有不少人提这个问题,但是并没有人提出解决方案。
不过,在我翻阅了别人的fork之后,我还是发现了解决方案fix 1.8.13 · GoSMMy/go-tdlib@276d500 · GitHub。
结合修改的代码和源代码的比对,应该是tdlib对相应的协议内容进行了修改。
设置代理不生效
对于大陆用户,设置代理肯定是必不可少的,如果家庭路由器提供网络环境的话,可以忽略这一步。但是设置了代理之后,系统一直超时。在issue中,我找到了问题的答案AddProxy errors with "timeout" · Issue #36 · Arman92/go-tdlib · GitHub。
根据回答者的描述,需要将添加代理的步骤放在验证之后,我试了一下,确实可以了。回头看了看原作者的示例代码go-tdlib/examples/socksProxy/socksProxy.go at master · Arman92/go-tdlib · GitHub。好吧,时间太久了。
估计是tblib逻辑改了
其他修改
fix tdlib · Arman92/go-tdlib@9ebdb46 · GitHub
lc依赖改成了lstdc我对cgo的不是很了解,代码暂时也能跑,就先不改动了
https://github.com/Arman92/go-tdlib/compare/master...wangsongyan:go-tdlib:master
userid的格式由int32改成了int64,我觉得还是有必要改的
Fix: entity url, message sender_id · Arman92/go-tdlib@e758785 · GitHub
textEntityTypeTextURL官方有对字段进行修改
sender字段改成了sender_id
最后说两句
目前发现的问题应该只是部分,作者在2018年之后就很少维护,但是代码还能使用,说明tg的开发团队的优秀。但是因为项目缺少维护,所以如果想进行深度开发的可以研究一下作者的源码,同时结合tdlib的官方文档,进行修正。
如果有能力的,希望能够对原来的开源项目进行维护,或者提一下pr。