Полностью нативная имплементация MTProto на Golang!
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)
}
Вам не стоит задумываться о реализации шифрования, обмена ключами, сохранении и восстановлении сессии, все уже сделано за вас.
Примеры кода здесь
Полная документация здесь
Все как обычно, вам необходимо загрузить пакет с помощью 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",
// just use "en", any other language codes will receive error. See telegram docs for more info.
SystemLangCode: "en",
LangCode: "en",
// HelpGetConfig() is ACTUAL request, but wrapped in InvokeWithLayer
Query: &telegram.HelpGetConfigParams{},
})
Почему? А хер его знает! Этот метод описан в документации Telegram API, любые другие стартовые запросы получат ошибку.
Пример здесь
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
Нужно работать с этими стрёмными tg://
ссылками? Загляните в пакет deeplinks
, вот самый простейший пример:
package main
import (
"fmt"
"github.com/xelaj/mtproto/telegram/deeplinks"
)
func main() {
link, _ := deeplinks.Resolve("t.me/xelaj_developers")
// кстати говоря, ResolveParameters это просто структура для ссылок tg://resolve, не все ссылки это исключительно ResolveParameters
resolve := link.(*deeplinks.ResolveParameters)
fmt.Printf("Ого! похоже что @%v это лучший девелоперский чат в телеге!\n", resolve.Domain)
}
Объем документации невероятно огромен. Мы бы готовы задокументировать каждый метод и объект, но это огромное количество работы. Несмотря на это, все методы уже описаны здесь, вы можете так же спокойно их
Технически — да. Компоненты не были заточены под определенную архитектуру. Однако, возможности протестировать у разработчиков не было. Если у вас возникли проблемы, напишите в issues, мы постараемся помочь
Ну... Как сказать... А гляньте лучше вот это ишью про исходники TON (ныне закрытый проект telegram). Оно вам расскажет обо всех проблемах и самого телеграма, и его апи. И его разработчиках.
Please read contributing guide if you want to help. And the help is very necessary!
Don't want code? Read this page! We love nocoders!
Ага, мы стараемся подходить к ним серьезно. Пожалуйста, не создавайте ищью, описывающие ошибку безопасности, это может быть ОЧЕНЬ небезопасно! Вместо этого рекомендуем глянуть на эту страничку и следовать инструкции по уведомлению.
- Базовая реализация MTProto
- Реализовать все методы для последнего слоя
- Сделать TL Encoder/Decoder
- Убрать все паники при парсинге TL
- Поддержка MTProxy
- Поддержка Socks5 из коробки (вообще вы и так можете гнать запросы через socks5)
- Капитальное тестирование (80%+)
- Написать свою суперскую документацию
- Richard Cooper <rcooper.xelaj@protonmail.com>
- Anton Larionov <Anton.Larionov@infobip.com>
- Arthur Petukhovsky <petuhovskiy@yandex.ru>
- Roman Timofeev <timofeev@uteka.ru>
- Artem <webgutar@gmail.com>
- Bo-Yi Wu <appleboy.tw@gmail.com>
- 0xflotus <0xflotus@gmail.com>
- Luclu7 <me@luclu7.fr>
- Vladimir Stolyarov <xakep6666@gmail.com>
- grinrill @grinrill
- kulallador <ilyastalk@bk.ru>
- rs <yuiop1955@mail.ru>
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