/mtproto

Full-native go implementation of Telegram API

Primary LanguageGoMIT LicenseMIT

MTProto

help wanted godoc reference Go Report Card license MIT chat telegram version v0.1.0 unstable

FINALLY! Full-native implementation of MTProto protocol on Golang!

english русский

Features

Full native implementation

Вся библиотека начиная с отправки запросов и шифрования и заканчивая сериализацией шифровния написаны исключительно на golang. Для работы с библиотекой не требуется никаких лишних зависимостей.





Latest API version (117+)

Реализована поддержка всех возможностей API Telegram и MTProto включая функцию видеозвонков и комментариев к постам. Вы можете сделать дополнительный pull request на обновление данных!






Reactive API updates (generated from TL schema)

Все изменения в клиентах TDLib и Android мониторятся на предмет появления новых фич и изменений в TL схемах. Новые методы и объекты появляются просто по добавлению новых строк в схеме и обновления сгенерированного кода!




Implements ONLY network tools

Никаких SQLite баз данных и кеширования ненужных вам файлов. Вы можете использовать только тот функционал, который вам нужен. Вы так же можете управлять способом сохранения сессий, процессом авторизации, буквально всем, что вам необходимо!




Multiaccounting, Gateway mode

Вы можете использовать больше 10 аккаунтов одновременно! xelaj/MTProto не создает большого оверхеда по вычислительным ресурсам, поэтому вы можете иметь огромное количество инстансов соединений и не переживать за перерасход памяти!




How to use

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

Getting started

Simple How-To

Все как обычно, вам необходимо загрузить пакет с помощью go get:

go get github.com/xelaj/mtproto

Далее по желанию вы можете заново сгенерировать исходники структур методов и функций, для этого используйте команду go generate

go generate github.com/xelaj/mtproto

Все! Больше ничего и не надо!

что за InvokeWithLayer?

Это специфическая особенность 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

Документация пустует! Почему?

Объем документации невероятно огромен. Мы бы готовы задокументировать каждый метод и объект, но это огромное количество работы. Несмотря на это, все методы уже описаны здесь, вы можете так же спокойно их

Работает ли этот проект под Windows?

Технически — да. Компоненты не были заточены под определенную архитектуру. Однако, возможности протестировать у разработчиков не было. Если у вас возникли проблемы, напишите в issues, мы постараемся помочь

Who use it

Contributing

Please read contributing guide if you want to help. And the help is very necessary!

TODO

[ ]

Authors

License

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