使用golang写一个tg客户端

经验分享
882 0

众所周知,tg创建机器人特别简单,而机器人不管是用于通知还是用来做群管理都是十分方便的。但是,如果需要更多权限的功能就不能的胜任了。于是,我盯上了官方的客户端,并找到了一个完善的教程。

问题出现

但是,尽管教程写的很详细,我还是遇到了不少问题。

当然这些问题目前来说只针对我所参考的教程和环境

代码编译不通过

当我兴致勃勃的按照教程走完所有流程的时候,代码编译不通过无疑是最大的打击。不过根据报错信息和部分源码,我大概锁定了问题。

ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'

首先是tdlib编译环境和选项的问题,以下是GomacOSApple 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_DIRopenssl的位置,而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。

相关链接

最后更新 2023-06-15
评论 ( 0 )
OωO
隐私评论