Full-native implementation of MTProto protocol on Golang!
english русский
MTProto очень сложен в реализации, но при этом очень прост в использовании. По сути вы общаетесь с серверами Telegram посредством отправки сериализованых структур (аналог gRPC, разработанный Telegram llc.). Выглядит это примерно так:
func main() {
client := &Telegram.NewClient()
// for each method there is specific struct for serialization (<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 will be already asserted as described in TL specs of API
// if _, ok := resp.(*SomeResponseObject); !ok {
// panic("No way, we found a bug! Create new issue!")
// }
println(resp.InfoAboutSomething)
}
Вам не стоит задумываться о реализации шифрования, обмена ключами, сохранении и восстановлении сессии, все уже сделано за вас.
Code examples are here
Full docs are here
Все как обычно, вам необходимо загрузить пакет с помощью 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",
SystemLangCode: "en",
LangCode: "en",
Proxy: nil,
Params: nil,
// HelpGetConfig() is ACTUAL request, but wrapped in IvokeWithLayer
Query: &telegram.HelpGetConfigParams{},
})
Пример здесь
func AuthByPhone() {
resp, err := client.AuthSendCode(
yourPhone,
appID,
appHash,
&telegram.CodeSettings{},
)
if err != nil {
panic(err)
}
// Можно выбрать любой удобный вам способ ввода,
// базовые параметры сессии можно сохранить в любом месте
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
Объем документации невероятно огромен. Мы бы готовы задокументировать каждый метод и объект, но это огромное количество работы. Несмотря на это, все методы уже описаны здесь, вы можете так же спокойно их
Технически — да. Компоненты не были заточены под определенную архитектуру. Однако, возможности протестировать у разработчиков не было. Если у вас возникли проблемы, напишите в issues, мы постараемся помочь
Please read contributing guide if you want to help. And the help is very necessary!
[ ]
- Richard Cooper <rcooper.xelaj@protonmail.com>
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