MTProto 真的很难实现,但却极易使用。简单地说,此库只是将序列化的结构发送至 Telegram 服务器(就像 gRPC 一样,但来自 Telegram LLC)。就像这样:
func main() {
client := &Telegram.NewClient()
// 对于每一个方法,都有一个具体的结构体用来序列化(<method_name>Params{})
result, err := client.MakeRequest(&telegram.GetSomeInfoParams{FromChatId: 12345})
if err != nil {
panic(err)
}
resp, ok := result.(*SomeResponseObject)
if !ok {
panic("Oh no! Wrong type!")
}
}
不难吧?其实在 TL API 规范中还有更简单的发送请求的方法:
func main() {
client := &Telegram.NewClient()
resp, err := client.GetSomeInfo(12345)
if err != nil {
panic(err)
}
// resp 已被按照 TLS API 规范中的描述来断言,可以直接使用
// if _, ok := resp.(*SomeResponseObject); !ok {
// panic("No way, we found a bug! Create new issue!")
// }
println(resp.InfoAboutSomething)
}
你无需考虑加密、密钥交换、保存和还原会话以及其他常规事务,我们全都替你处理好了。
示例代码在这里
完整的文档在这里
安装方式很简单,简单地执行 go get
:
go get github.com/xelaj/mtproto
之后,你可以通过执行 go generate
来根据需要生成方法和函数的源结构:
go generate github.com/xelaj/mtproto
就这么简单!你不需要做其他的任何事情了!
这是 Telegram 的一个功能,如果你想创建一个包含当前服务器配置信息的客户端,那么你需要这么做:
resp, err := client.InvokeWithLayer(apiVersion, &telegram.InitConnectionParams{
ApiID: 124100,
DeviceModel: "Unknown",
SystemVersion: "linux/amd64",
AppVersion: "0.1.0",
// 请使用"en",其他任何值都会导致错误产生
SystemLangCode: "en",
LangCode: "en",
// HelpGetConfig() 是一个确切的包含在 InvokeWithLayer 内的请求
Query: &telegram.HelpGetConfigParams{},
})
为什么?我们不知道!Telegram API 文档中介绍了此方法,其他任何启动请求都将收到错误。
示例代码在这里
func AuthByPhone() {
resp, err := client.AuthSendCode(
yourPhone,
appID,
appHash,
&telegram.CodeSettings{},
)
if err != nil {
panic(err)
}
// 你可以通过任意方式来获取收到的验证码,比如通过 HTTP 请求等。
fmt.Print("Auth code:")
code, _ := bufio.NewReader(os.Stdin).ReadString('\n')
code = strings.Replace(code, "\n", "", -1)
// 这就是电话验证的全部过程!
fmt.Println(client.AuthSignIn(yourPhone, resp.PhoneCodeHash, code))
}
就这么简单!你不需要任何循环,异步执行代码开箱即用。你只需要遵循官方的 Telegram API 文档即可。
想处理那些奇葩的 tg://
链接吗?请查看 deeplinks
包。如下是简单的示例:
package main
import (
"fmt"
"github.com/xelaj/mtproto/telegram/deeplinks"
)
func main() {
link, _ := deeplinks.Resolve("t.me/xelaj_developers")
// 顺便说一下,ResolveParameters 只是 tg://resolve 链接的结构体,并非所有链接都是 resolve 的
resolve := link.(*deeplinks.ResolveParameters)
fmt.Printf("Oh! Looks like @%v is the best developers channel in telegram!\n", resolve.Domain)
}
事实上是有相当庞大的文档的。我们准备描述每一个方法和对象,但是那将耗费巨大的工作量。尽管所有的方法全都已经描述在了这里。
从技术上讲,支持。在实践中,组件不需要具体的系统架构,但是我们目前并没有测试这一点。如果你遇到了任何问题,请随时创建 issue 来反馈,我们会尽力帮助。
请使用 Google 翻译 来查看 这个 issue 它可以回答你的所有问题。
如果你愿意提供帮助,请阅读我们的贡献指南。
不想写代码?请阅读这个页面,我们同样欢迎 nocoders!
请千万不要创建 issue 来反馈安全漏洞,因为这样会影响到很多人。请通过阅读这个并遵循里面提到的步骤来通知我们。
- 基础 MTProto 实现
- 实现最新 layer 中的所有方法
- 实现 TL 编码器和解码器
- 避免解析 TL 时产生 panics
- 支持 MTProxy
- 支持 socks5
- 添加测试
- 丰富文档
- Richard Cooper <[email protected]>
- Anton Larionov <[email protected]>
- Arthur Petukhovsky <[email protected]>
- Roman Timofeev <[email protected]>
- Artem <[email protected]>
- Bo-Yi Wu <[email protected]>
- 0xflotus <[email protected]>
- Luclu7 <[email protected]>
- Vladimir Stolyarov <[email protected]>
- grinrill @grinrill
- kulallador <[email protected]>
- rs <[email protected]>
WARNING! This project is only maintained by Xelaj inc., however copyright of this source code IS NOT owned by Xelaj inc. at all. If you want to connect with code owners, write mail to this email. For all other questions like any issues, PRs, questions, etc. Use GitHub issues, or find email on official website.
This project is licensed under the MIT License - see the LICENSE file for details