Skip to content

Latest commit

 

History

History
269 lines (200 loc) · 13.7 KB

README.md

File metadata and controls

269 lines (200 loc) · 13.7 KB

MTProto

godoc reference Go Report Card codecov license MIT chat telegram version v1.0.0 unstable

FINALLY! Полностью нативная имплементация MTProto на Golang!

english русский 简体中文

Фичи

Полностью нативная реализация

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




Самая свежая версия API (117+)

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






Реактивные обновления (сгенерировано из TL спецификаций)

Все изменения в клиентах 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)
}

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

Примеры кода здесь

Полная документация здесь

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",
    // 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

Telegram Deeplinks

Нужно работать с этими стрёмными 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)
}

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

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

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

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

Почему Telegram API НАСТОЛЬКО нестабильное?

Ну... Как сказать... А гляньте лучше вот это ишью про исходники TON (ныне закрытый проект telegram). Оно вам расскажет обо всех проблемах и самого телеграма, и его апи. И его разработчиках.

Who use it

Contributing

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!

Критические уязвимости?

Ага, мы стараемся подходить к ним серьезно. Пожалуйста, не создавайте ищью, описывающие ошибку безопасности, это может быть ОЧЕНЬ небезопасно! Вместо этого рекомендуем глянуть на эту страничку и следовать инструкции по уведомлению.

TODO

  • Базовая реализация MTProto
  • Реализовать все методы для последнего слоя
  • Сделать TL Encoder/Decoder
  • Убрать все паники при парсинге TL
  • Поддержка MTProxy
  • Поддержка Socks5 из коробки (вообще вы и так можете гнать запросы через socks5)
  • Капитальное тестирование (80%+)
  • Написать свою суперскую документацию

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