Телеграм предоставляет для разработчиков два API: для работы с ботами (давайте будем называть его Bot-API) и для работы с пользователями (назовем его User-API). Т.к. данная статья посвящена User-API, далее по тексту я его буду упоминать как просто API, а что относится к Bot-API - так и буду упоминать.
При работе с Телеграм, бывают ситуации, когда через Bot-API не возможно реализовать нужные действия, и необходимо их выполнить от имени аккаунта пользователя, а не бота. Поэтому, попытаемся разобраться, как все же работать с Телеграм через его API.
Например зайдем в метод auth.sendCode и изменим Layer 139 на 133, и далее при сёрфинге по всей документации версия будет отображаться выбранная нами:
В документации же Телеграм – методы описаны в стиле camelCase (первая буква первого слова в нижнем регистре, последующие первые буквы слов в верхнем), а параметры в стиле snake_case (слова разделены нижним подчеркиванием и все с малой буквы).
Нужно просто привыкнуть и все переводить в PascalCase, и добавлять в начало TL для сущностей и TLRequest для запросов.
Ключи всегда используются в паре, поэтому в обиходе их обычно называют – пара.
Все доступные методы, для работы с API, Телеграм хорошо задокументированы.
Все их описывать – не реально большой объем информации, поэтому нам главное уловить суть, научиться пользоваться документацией, и используя описание - пользоваться нашей библиотекой.
Поэтому предлагаю детально разобрать: авторизацию аккаунта в своем приложении, что даст нам сохраненный профиль, для дальнейшей работы с ним.
StarkSoftProxy.dll, TeleSharp.TL.dll и TLSharp.Core.dll
Добавим директивы using
Нужно учесть, что авторизация это не регистрация. Авторизовать можно только уже зарегистрированный номер в Телеграм.
Для авторизации, нам нужно отправить в Телеграм всего 2 запроса: auth.sendCode и auth.signIn. Первый позволяет отправить код. Второй отправляет уже полученный код из приложения, и собственно в результате мы получаем авторизацию в нашем приложении.
Разберем:
Это путь к нашему классу для запроса. Создадим сам объект запроса:
Так, мы создали объект, но для запроса, нам нужно передать параметры в этот запрос (по аналогии, можем сравнить с параметрами GET запроса, передаваемыми после ? в адресной строке: ?name1=value1&name2=value2…)
Смотрим в документации, какие параметры нам нужно передать для запроса sendCode:
Разберем:
И смотрим, у данного объекта есть уже свои параметры, и вот тут уже появляется во всех параметрах знак ? – что показывает нам, что данные параметры не обязательные и их можно не передавать:
Что нам дают не обязательные параметры?
Мы можем уточнить за счет них, настройки типа отправленного кода.
Про типы расписано в документации.
Разберем:
Как нам его создать в нашей библиотеке?
Т.к. этот объект уже не является запросом (к которому мы добавляли TLRequest), а простой параметр, то мы добавляем просто TL в начало имени, ну и согласно нашему стилю, ищем в нашей библиотеке CodeSettings => TLCodeSettings:
В итоге, нам в параметр запроса Settings – нам нужно передать объект
Давайте теперь все разобранные параметры, добавим к нашему запросу:
Точно так же заполняем остальные параметры (API пару и настройки):
Сделаем небольшой рефакторинг, т.е. присвоим все параметры не после создания объекта, а в момент создания:
В итоге то же самое, но код стал чище и читабельнее. Далее я буду сразу так создавать объекты, если вам тяжело разобрать, можете формировать объект с "поэтапным" присвоением параметров, как расписал выше.
Всем этим занимается библиотека, нам главное отправить запрос и получить ответ. А дальше мы уже будем разбирать ответ от Телеграм.
Для создания клиента – нам нужен класс TLSharp.Core.TelegramClient нашей библиотеки.
Смотрим в подсказках, что нам нужно для создания экземпляра объекта данного класса.
В первой перегрузке нужны параметры:
Это стандартные параметры для создания клиента, заложенные в библиотеке. Но нам надо использовать различные параметры, для инициализации подключения к серверу, которые используются внутри самой библиотеки. Для передачи всех этих параметров, я создал внутри библиотеки класс TLSharp.Core.AppData, и при помощи второй перегрузки создания клиента, мы сможем уже снаружи изменять все параметры подключения.
Для этого воспользуемся второй перегрузкой конструктора класса:
Здесь вместо двух первых параметров – передаем объект класса AppData с нужными нам параметрами уже для подключения:
Все эти параметры должны рандомизироваться, но в рамках реальных устройств. И тут своего рода то же целая наука, есть даже курсы, по правильному подбору данных параметров, ведь от них зависит выживаемость и работоспособность аккаунтов, которые будут работать через наши запросы.
А мы продолжим разбираться с нашими запросами.
Создаем экземпляр класса клиента, используя вторую перегрузку:
Пора отправить наш первый запрос к Телеграм и установить соединение с сервером. Делаем это вызвав метод Connect() у нашего клиента:
Если вызов данного метода не выдал исключения, то у нас все нормально, и мы успешно подключились к серверу Телеграм. Но если будут какие ошибки, нам лучше их "поймать", для этого, лучше всего обернуть все наши действия в конструкцию try{} catch{}
Идем дальше. Соединение установлено, теперь можно отправить подготовленный нами выше запрос в Телеграм. Для отправки всех запросов, будем использовать метод SendRequest нашей библиотеки.
Давайте разберем, что нам нужно передать:
Этот класс и вставляем вместо T – в нашем запросе, получаем наш готовый метод для запроса:
Данный код выполнит уже наш запрос, и если нет ошибок, присвоит переменной responseSent значение ответа, в виде объекта класса TeleSharp.TL.Auth.TLSentCode.
Отправив данный запрос, мы запросили у Телеграм код, для авторизации на новом устройстве.
Эти параметры, мы сможем получить из ответа
Какие данные нам нужны из ответа? Самый необходимы параметр, это phone_code_hash – хэш, который нам будет нужен в следующем запросе. Записываем его в нашу переменную:
Что еще тут есть интересного?
type – тип отправленного кода, точнее даже, нам Телеграм сообщает, куда он оправил код. Какие есть варианты? Можем посмотреть опять в документации:
В данном параметре type – будет объект класса, посмотрим какого:
Видим, что в Type – Абстрактный класс (есть приставка Abs), соответственно, в данном свойстве может лежать любой экземпляр одного из классов:
Давайте попробуем определить, куда же Телеграм отправил наш код:
В коде это выглядит:
Тут уже вам решать, как воспользоваться полученной информацией.
Точно также мы сможем из ответа - определить, куда Телеграм отправит следующий код, из свойства next_type (responseSent.NextType нашего результата). Здесь результат лежит так же в абстрактном классе
Описания классов, можем смотреть auth.CodeType
Можете сами потренироваться и определить, куда же Телеграм отправит следующий код.
Что бы отправить код в Телеграм, на том же подключении при котором мы и запросили код, воспользуемся контекстом (project.Context["client"]), для передачи объекта между кубиками.
А также нужные нам номер телефона и хэш – передадим через переменные Zennoposter'a project.Variables["phone"].Value и project.Variables["hash"].Value
После нашего отправленного первого запроса, Телеграм отправит код, скорее всего в приложение. Смотрим в любом удобном клиенте пятизначный цифровой код, в переписке от Telegram.
Следующим этапом, нам надо отправить запрос с полученным кодом.
Идем в документацию и смотрим, нужный нам метод:
Согласно обязательным параметрам, нам нужно передать: номер телефона, хэш, полученный из результата первого запроса responseSent и код полученный из приложения.
Создадим запрос для отправки кода, подставив сразу все нужные переменные:
Разберемся с ответом. В ответ будем ждать уже объект авторизации
Тут мы видим, что в ответ может прийти или объект auth.authorization или auth.authorizationSignUpRequired
Это значит, что в нашей библиотеке ответом будет абстрактный класс, попробуем его найти:
TeleSharp.TL.Auth.TLAbsAuthorization – этот класс будет ответом, и нам нужно указать его в методе запроса:
Данный код отправит в Телеграм запрос, получит ответ в виде объекта класса TeleSharp.TL.Auth.TLAbsAuthorization, и присвоит переменной responseSignIn.
Для начала, нам нужно определить тип полученного ответа:
Смотрим обязательные параметры и результат:
Кроме простых типов, у нас есть объект в параметрах запроса, это offset_peer
Смотрим, сюда нужно передать один из объектов, и т.к. мы запрашиваем диалоги текущего пользователя, нас интересует объект inputPeerSelf.
Смотрим его параметры и видим, что параметры у данного класса отсутствуют.
Ищем его теперь в нашей библиотеке:
В ответе будет messages.Dialogs, значит у нас это будет абстрактный класс
Составляем запрос:
Параметры OffsetDate и OffsetId – используются для пагинации, и запросов нужной "страницы". Подробно все расписано в документации.
Делаем сам запрос:
Обрабатываем ответ:
Разберем ответ, когда диалогов не более 100, т.е. получен объект класса TeleSharp.TL.Messages.TLDialogs.
Из документации видим, что в свойстве chats будет коллекция из разных объектов: допустим, нас интересуют только чаты/группы/каналы.
Видим что чаты будут выданы объектами chat. Делаем выборку из коллекции определенного типа объектов:
Для выборки из коллекции объектов каналов:
Т.к. каналы и супергруппы у нас идут одним объектом, мы их можем разделить за счет выборки, по свойству, указывающему на принадлежность к каналу
Все свойства, которые мы можем использовать расписаны в документации объектов channel
P.S.
Пытался объяснить максимально доступно по разбору User-API Телеграм.
Материал излагал, в обучающем стиле, поэтому все используемые классы указывал с полными путями, не используя юзинги, для сокращенного написания кода, что бы было понятнее расположение классов в библиотеке.
Надеюсь расписанная мной информация, поможет вам для старта в это увлекательное API.
Всем удачного изучения и использования!
.
При работе с Телеграм, бывают ситуации, когда через Bot-API не возможно реализовать нужные действия, и необходимо их выполнить от имени аккаунта пользователя, а не бота. Поэтому, попытаемся разобраться, как все же работать с Телеграм через его API.
Знаю, многие даже просто окунаясь в API Телеграм, хватаются за голову из-за не стандартной реализации. Но на деле, если вникнуть и разобраться, то все довольно просто.
Вся сложность, заключается в том, что API работает через свой протокол – MTProto, и работать через простые POST/GET запросы здесь не получится. На помощь приходят библиотеки, которые работают с данным API через нужный протокол. В настоящее время есть немало библиотек, которые позволяют это делать под C#, но практически все они работают на более новых версиях C#, и не всегда получается использовать их совместно с Zennoposter. Лично я использую библиотеку TLSharp, как одну из первых вышедшую для работы с API Телеграм под C#.
До недавнего времени, библиотека поддерживалась уже сложившимся комьюнити, но не так давно репозиторий был переведен в статус архивного. Почему пал выбор на эту библиотеку? Потому что на ней все еще можно работать через Zennoposter.
Т.к. Телеграм в канун нового года внес существенные ограничения для работы с API – минимальная версия API для работы – требуется 133 версия - в основном это было связано с переходом ID с типа int на long.
Давайте еще разберемся с Layer, что это такое? При общении в кругах пользователей API, часто упоминаются: лайер, layer, слой, уровень, кто как называет и все это по простому - номер версии API. С каждой новой версией – добавляется новый функционал, и не всегда более новая версия совместима с более старой.
На какой же версии, работает TLSharp? В текущей реализации, там всё ещё - 66 версия, в то время как на текущий момент последняя публичная версия - 139. Как же нам быть? Специально для нашего комьюнити, я выкладываю доработанную мной библиотеку, с рабочей версией - 133, на которую ориентируется Телеграм, как на минимально рабочую.
Реализация доработанной библиотеки – является форком от последней версии TLSharp, с моими доработками, поэтому работает как есть. Если у вас есть претензии - можете отказаться от ее использования.
Так же доработанная версия - позволяет указывать различные параметры устройств для подключения, чем самым достигается возможность управлять рандомизацией необходимых устройств.
Есть конечно и минусы в данной библиотеке, которые можно обойти: при переходе на 133 версию, Телеграм изменил в корне проверку пароля 2ФА, и в доработанной версии проверка пароля не реализована, поэтому авторизация аккаунтов возможна только без установленного облачного пароля, и есть еще минус уже самой библиотеки: при скачивании некоторых медиа файлов, расположенных в датацентре отличном от аккаунта - сохраненный профиль будет биться, и будет нужна повторная авторизация. Но тут больше не баг, а из-за заложенной архитектуры библиотеки, нет возможности подключаться к временному датацентру, где хранится определенный медиа файл, для его скачивания.
Вся сложность, заключается в том, что API работает через свой протокол – MTProto, и работать через простые POST/GET запросы здесь не получится. На помощь приходят библиотеки, которые работают с данным API через нужный протокол. В настоящее время есть немало библиотек, которые позволяют это делать под C#, но практически все они работают на более новых версиях C#, и не всегда получается использовать их совместно с Zennoposter. Лично я использую библиотеку TLSharp, как одну из первых вышедшую для работы с API Телеграм под C#.
До недавнего времени, библиотека поддерживалась уже сложившимся комьюнити, но не так давно репозиторий был переведен в статус архивного. Почему пал выбор на эту библиотеку? Потому что на ней все еще можно работать через Zennoposter.
Т.к. Телеграм в канун нового года внес существенные ограничения для работы с API – минимальная версия API для работы – требуется 133 версия - в основном это было связано с переходом ID с типа int на long.
Давайте еще разберемся с Layer, что это такое? При общении в кругах пользователей API, часто упоминаются: лайер, layer, слой, уровень, кто как называет и все это по простому - номер версии API. С каждой новой версией – добавляется новый функционал, и не всегда более новая версия совместима с более старой.
На какой же версии, работает TLSharp? В текущей реализации, там всё ещё - 66 версия, в то время как на текущий момент последняя публичная версия - 139. Как же нам быть? Специально для нашего комьюнити, я выкладываю доработанную мной библиотеку, с рабочей версией - 133, на которую ориентируется Телеграм, как на минимально рабочую.
Реализация доработанной библиотеки – является форком от последней версии TLSharp, с моими доработками, поэтому работает как есть. Если у вас есть претензии - можете отказаться от ее использования.
Так же доработанная версия - позволяет указывать различные параметры устройств для подключения, чем самым достигается возможность управлять рандомизацией необходимых устройств.
Есть конечно и минусы в данной библиотеке, которые можно обойти: при переходе на 133 версию, Телеграм изменил в корне проверку пароля 2ФА, и в доработанной версии проверка пароля не реализована, поэтому авторизация аккаунтов возможна только без установленного облачного пароля, и есть еще минус уже самой библиотеки: при скачивании некоторых медиа файлов, расположенных в датацентре отличном от аккаунта - сохраненный профиль будет биться, и будет нужна повторная авторизация. Но тут больше не баг, а из-за заложенной архитектуры библиотеки, нет возможности подключаться к временному датацентру, где хранится определенный медиа файл, для его скачивания.
Настройка Layer
В нашей версии библиотеки версия API статична и адаптирована под версию 133. Поэтому мы будем ориентироваться на нее, и для этого нам необходимо зайти в документацию, выбрать любой метод, и установить нужный на Layer на 133.Например зайдем в метод auth.sendCode и изменим Layer 139 на 133, и далее при сёрфинге по всей документации версия будет отображаться выбранная нами:
Стилизация
Важная особенность: все сущности в нашей библиотеке написаны в стиле – PascalCase, т.е. все слова начинаются с большой буквы без подчеркиваний и не зависит от запрос это или параметр.В документации же Телеграм – методы описаны в стиле camelCase (первая буква первого слова в нижнем регистре, последующие первые буквы слов в верхнем), а параметры в стиле snake_case (слова разделены нижним подчеркиванием и все с малой буквы).
Нужно просто привыкнуть и все переводить в PascalCase, и добавлять в начало TL для сущностей и TLRequest для запросов.
API данные
Перейдем к делу! Для работы с любым API, требуется по крайней мере api ключ, который выдается поставщиком API. В Телеграм, для работы с API используется одновременно – два ключа: Api_ID и Api_Hash, получить которые можно на странице создания своего приложения. Ключи всегда используются в паре, поэтому в обиходе их обычно называют – пара.
Документация API
Данные для работы, мы получили, давайте разберемся, с документацией.Все доступные методы, для работы с API, Телеграм хорошо задокументированы.
Все их описывать – не реально большой объем информации, поэтому нам главное уловить суть, научиться пользоваться документацией, и используя описание - пользоваться нашей библиотекой.
Поэтому предлагаю детально разобрать: авторизацию аккаунта в своем приложении, что даст нам сохраненный профиль, для дальнейшей работы с ним.
Настройки проекта Zennoposter
Для работы нам понадобятся библиотеки, добавим в ссылки GAC нашего проекта Zennoposter, библиотеки:StarkSoftProxy.dll, TeleSharp.TL.dll и TLSharp.Core.dll
Добавим директивы using
Авторизация
Что такое авторизация? Это создание новой сессии в нашем приложении, и сохранение ее в файл в виде профиля. Простыми словами - вы скачиваете официальный клиент, авторизуетесь в нем, введя номер телефона и в ответ вводите код, полученный в каком-либо уже авторизованном приложении, и дальше уже пользуетесь приложением. То же самое нам нужно сделать, но уже для своего приложения, данные которого мы создали выше.Нужно учесть, что авторизация это не регистрация. Авторизовать можно только уже зарегистрированный номер в Телеграм.
Для авторизации, нам нужно отправить в Телеграм всего 2 запроса: auth.sendCode и auth.signIn. Первый позволяет отправить код. Второй отправляет уже полученный код из приложения, и собственно в результате мы получаем авторизацию в нашем приложении.
Создаем первый запрос
Давайте разберемся, как же адаптировать запросы указанные в документации (auth.sendCode), к запросам для нашей библиотеки (TeleSharp.TL.Auth.TLRequestSendCode): auth.sendCode => TeleSharp.TL.Auth.TLRequestSendCodeРазберем:
- TeleSharp.TL – пространство имен, где расположены все наши сущности. Все классы ищем именно тут.
- Auth - пространство имен, где расположены сущности для авторизации
- TLRequest – приставка, которая добавляется ко всем сущностям, которые осуществляют запрос, то есть ко всем эти элементам из документации
Это путь к нашему классу для запроса. Создадим сам объект запроса:
C#:
var sentRequest = new TeleSharp.TL.Auth.TLRequestSendCode ();
Смотрим в документации, какие параметры нам нужно передать для запроса sendCode:
Разберем:
- phone_number – передаем в параметр номер телефона для авторизации
- api_id – API ключ нашего приложения
- api_hash – API ключ нашего приложения
- settings – настройка типа отправленного кода, для более детального изучения типа – перейдем по ссылке CodeSettings
И смотрим, у данного объекта есть уже свои параметры, и вот тут уже появляется во всех параметрах знак ? – что показывает нам, что данные параметры не обязательные и их можно не передавать:
Что нам дают не обязательные параметры?
Мы можем уточнить за счет них, настройки типа отправленного кода.
Про типы расписано в документации.
Разберем:
- allow_flashcall - Разрешить ли подтверждение телефона с помощью флэш-звонка, где кодом будет являться номер телефона входящего звонка.
- current_number - Если номер телефона используется на текущем устройстве.
- allow_app_hash - Если требуется токен, который будет включен в отправленные SMS-сообщения: требуется в более новых версиях Android, чтобы использовать API-интерфейс Android приемника SMS.
- allow_missed_call - Поддерживает ли это устройство получение кода с помощью метода auth.codeTypeMissedCall.
- logout_tokens - Ранее сохраненные токены выхода
Как нам его создать в нашей библиотеке?
Т.к. этот объект уже не является запросом (к которому мы добавляли TLRequest), а простой параметр, то мы добавляем просто TL в начало имени, ну и согласно нашему стилю, ищем в нашей библиотеке CodeSettings => TLCodeSettings:
В итоге, нам в параметр запроса Settings – нам нужно передать объект
C#:
new TeleSharp.TL.TLCodeSettings ()
C#:
var sentRequest = new TeleSharp.TL.Auth.TLRequestSendCode();
sentRequest.PhoneNumber = "12345678";
Сделаем небольшой рефакторинг, т.е. присвоим все параметры не после создания объекта, а в момент создания:
В итоге то же самое, но код стал чище и читабельнее. Далее я буду сразу так создавать объекты, если вам тяжело разобрать, можете формировать объект с "поэтапным" присвоением параметров, как расписал выше.
C#:
var sentRequest = new TeleSharp.TL.Auth.TLRequestSendCode ()
{
PhoneNumber = "12345678",
ApiId = 16623,
ApiHash = "8c9dbfe58437d1739540f5d53c72ae4b",
Settings = new TeleSharp.TL.TLCodeSettings ()
};
Создаем клиент для запросов
Всё, с созданием объекта для запроса мы разобрались. Теперь нам надо этот объект отправить на сервер Телеграм. Для отправки запроса, нам нужно создать объект – client, который уже будет обрабатывать наши созданные запросы, и работать с серверами Телеграм по тому самому протоколу MTProto.Всем этим занимается библиотека, нам главное отправить запрос и получить ответ. А дальше мы уже будем разбирать ответ от Телеграм.
Для создания клиента – нам нужен класс TLSharp.Core.TelegramClient нашей библиотеки.
Смотрим в подсказках, что нам нужно для создания экземпляра объекта данного класса.
В первой перегрузке нужны параметры:
- int apiId – наш API ключ приложения
- string apiHash - наш API ключ приложения
- ISessionStore store – интерфейс, который вы можете реализовать для работы с сохраняемым профилем. В данной библиотеке зашит формат хранимых сессий в бинарной сериализацией данных. Расширение данных профилей будет - *.dat
- string sessionUserId – путь к нашему профилю. Я в примерах буду файл профиля именовать номером телефона, а расширение файла уже будет подставляться в самой библиотеке.
- TcpClientConnectionHandler handler – хендлер нам будет нужен для работы запросов внутри библиотеки через наши прокси. Для использования – будем использовать библиотеку StarkSoftProxy, которая то же немного подправлена мной, для удобства работы.
- DataCenterIPVersion dcIpVersion – тип IP адреса Telegram, к которому мы будем обращаться (IP v4/v6)
C#:
// Подготовим данные
string phone = "1234567890"; // Номер телефона
string dirProfiles = @"D:\Profiles\"; // Путь к папке, где будут храниться профили
string pathProfile = Path.Combine(dirProfiles, phone); // Путь к файлу профиля
var proxy = new ProxyStark("socks5://user:password@IP:port"); // Создаем объект прокси
// Создаем объект клиента:
var client = new TLSharp.Core.TelegramClient(16623, "8c9dbfe58437d1739540f5d53c72ae4b", null, pathProfile, proxy.SetProxy);
// Если прокси не используем, просто не передаем последний параметр:
var client = new TLSharp.Core.TelegramClient(16623, "8c9dbfe58437d1739540f5d53c72ae4b", null, pathProfile);
Для этого воспользуемся второй перегрузкой конструктора класса:
Здесь вместо двух первых параметров – передаем объект класса AppData с нужными нам параметрами уже для подключения:
C#:
var app = new TLSharp.Core.AppData(16623, "8c9dbfe58437d1739540f5d53c72ae4b")
{
DeviceModel = "Desktop", // Модель нашего устройства
AppVersion = "1.4.8 x64", // Версия нашего приложения
LangCode = "ru", // Язык нашего приложения
SystemLangCode = "ru", // Язык нашей системы
SystemVersion = "Windows 10", // Версия нашей системы
};
А мы продолжим разбираться с нашими запросами.
Создаем экземпляр класса клиента, используя вторую перегрузку:
C#:
var client = new TLSharp.Core.TelegramClient(app, sessionUserId: pathProfile, handler: proxy.SetProxy);
Отправляем первые запрос
Клиент у нас создан.Пора отправить наш первый запрос к Телеграм и установить соединение с сервером. Делаем это вызвав метод Connect() у нашего клиента:
C#:
client.Connect();
Идем дальше. Соединение установлено, теперь можно отправить подготовленный нами выше запрос в Телеграм. Для отправки всех запросов, будем использовать метод SendRequest нашей библиотеки.
Давайте разберем, что нам нужно передать:
C#:
var responseSent = client.SendRequest<T>(sentRequest);
- sentRequest – подготовленный нами запрос
- T – здесь надо указать класс, экземпляр которого нам должен вернуться в ответе. Где его найти? Тип ответа, который вернет Телеграм – указан в документации метода запроса, в разделе Result:
Этот класс и вставляем вместо T – в нашем запросе, получаем наш готовый метод для запроса:
C#:
var responseSent = client.SendRequest<TeleSharp.TL.Auth.TLSentCode>(sentRequest);
Отправив данный запрос, мы запросили у Телеграм код, для авторизации на новом устройстве.
Разбираем полученный ответ отправленного запроса
Что бы посмотреть, какая информация нам вернется в ответе, смотрим в документации.Эти параметры, мы сможем получить из ответа
Какие данные нам нужны из ответа? Самый необходимы параметр, это phone_code_hash – хэш, который нам будет нужен в следующем запросе. Записываем его в нашу переменную:
C#:
var hash = responseSent.PhoneCodeHash;
type – тип отправленного кода, точнее даже, нам Телеграм сообщает, куда он оправил код. Какие есть варианты? Можем посмотреть опять в документации:
В данном параметре type – будет объект класса, посмотрим какого:
Видим, что в Type – Абстрактный класс (есть приставка Abs), соответственно, в данном свойстве может лежать любой экземпляр одного из классов:
Давайте попробуем определить, куда же Телеграм отправил наш код:
В коде это выглядит:
C#:
var responseSent = client.SendRequest<TeleSharp.TL.Auth.TLSentCode>(sentRequest);
var type = responseSent.Type;
if(type is TeleSharp.TL.Auth.TLSentCodeTypeApp)
{
// Код был отправлен в приложение
}
else if(type is TeleSharp.TL.Auth.TLSentCodeTypeSms)
{
// Код был отправлен СМС на телефон
}
else if(type is TeleSharp.TL.Auth.TLSentCodeTypeCall)
{
// Код был отправлен звонком на телефон
}
else if(type is TeleSharp.TL.Auth.TLSentCodeTypeFlashCall)
{
// Код был отправлен флеш-звонком
}
Точно также мы сможем из ответа - определить, куда Телеграм отправит следующий код, из свойства next_type (responseSent.NextType нашего результата). Здесь результат лежит так же в абстрактном классе
Описания классов, можем смотреть auth.CodeType
Можете сами потренироваться и определить, куда же Телеграм отправит следующий код.
Получаем код из приложения
В рамках данной статьи, я не буду углубляться, каким способом передать полученный нами код, то ли вы через всплывающую форму сделаете запрос кода, то ли через текстовый файл, то ли еще каким либо образом. В текущем проекте мы просто разделим код авторизации на два кубика, и будем выполнять код пошагово и впишем полученный код непосредственно в переменную Zennoposter'a: project.Variables["code"].Value.Что бы отправить код в Телеграм, на том же подключении при котором мы и запросили код, воспользуемся контекстом (project.Context["client"]), для передачи объекта между кубиками.
А также нужные нам номер телефона и хэш – передадим через переменные Zennoposter'a project.Variables["phone"].Value и project.Variables["hash"].Value
Отправляем второй запрос с кодом
А мы давайте пойдем дальше, и закончим уже начатую с вами авторизацию.После нашего отправленного первого запроса, Телеграм отправит код, скорее всего в приложение. Смотрим в любом удобном клиенте пятизначный цифровой код, в переписке от Telegram.
Следующим этапом, нам надо отправить запрос с полученным кодом.
Идем в документацию и смотрим, нужный нам метод:
Согласно обязательным параметрам, нам нужно передать: номер телефона, хэш, полученный из результата первого запроса responseSent и код полученный из приложения.
Создадим запрос для отправки кода, подставив сразу все нужные переменные:
C#:
var signInRequest = new TeleSharp.TL.Auth.TLRequestSignIn()
{
PhoneNumber = project.Variables["phone"].Value,
PhoneCodeHash = project.Variables["hash"].Value,
PhoneCode = project.Variables["code"].Value
};
Тут мы видим, что в ответ может прийти или объект auth.authorization или auth.authorizationSignUpRequired
Это значит, что в нашей библиотеке ответом будет абстрактный класс, попробуем его найти:
TeleSharp.TL.Auth.TLAbsAuthorization – этот класс будет ответом, и нам нужно указать его в методе запроса:
C#:
var responseSignIn = client.SendRequest<TeleSharp.TL.Auth.TLAbsAuthorization>(signInRequest);
Разбираем полученный ответ второго запроса
Если запрос выполнен успешно, то в переменной responseSignIn будет лежать результат, иначе будет библиотекой выдано исключение, которое нам нужно будет обрабатывать. А сейчас предположим, что у нас получен успешный ответ, давайте его разберем:Для начала, нам нужно определить тип полученного ответа:
C#:
if(responseSignIn is TeleSharp.TL.Auth.TLAuthorization)
{
// Успешная авторизация. Если интересно, можем отсюда получить данные текущего пользователя
var authorization = (TeleSharp.TL.Auth.TLAuthorization)responseSignIn;
var user = authorization.User as TLUser;
var lastName = user.LastName;
var firstName = user.FirstName;
var phone = user.Phone;
var username = user.Username;
}
else if(responseSignIn is TeleSharp.TL.Auth.TLAuthorizationSignUpRequired)
{
// Учетная запись с таким номером телефона не существует в Telegram: пользователь должен зарегистрироваться
}
Успешная авторизация!
Всё, мы прошли авторизацию в нашем приложении, теперь дальше можно работать с нашим аккаунтом, используя всю мощь API Телеграм.Получаем диалоги аккаунта
В заключении, давайте сделаем запрос, получив все диалоги текущего аккаунта. Используем метод messages.getDialogsСмотрим обязательные параметры и результат:
Кроме простых типов, у нас есть объект в параметрах запроса, это offset_peer
Смотрим, сюда нужно передать один из объектов, и т.к. мы запрашиваем диалоги текущего пользователя, нас интересует объект inputPeerSelf.
Смотрим его параметры и видим, что параметры у данного класса отсутствуют.
Ищем его теперь в нашей библиотеке:
В ответе будет messages.Dialogs, значит у нас это будет абстрактный класс
Составляем запрос:
C#:
var requestDialog = new TeleSharp.TL.Messages.TLRequestGetDialogs()
{
OffsetDate = 0,
OffsetId = 0,
OffsetPeer = new TeleSharp.TL.TLInputPeerSelf(),
Limit = 100,
Hash = 0
};
Делаем сам запрос:
C#:
var responseDialog = client.SendRequest<TeleSharp.TL.Messages.TLAbsDialogs>(requestDialog);
C#:
if(responseDialog is TeleSharp.TL.Messages.TLDialogs)
{
// Полный список чатов с сообщениями и вспомогательными данными. Если у аккаунта не более 100 диалогов
}
else if (responseDialog is TeleSharp.TL.Messages.TLDialogsSlice)
{
// Неполный список диалогов с сообщениями и вспомогательными данными. В одном ответе телеграм отдает не более 100 диалогов. Если их больше - будет данный тип объекта. Отличается от TLDialogs - только наличием свойства Count с информацией о общем количестве диалогов.
}
else if (responseDialog is TeleSharp.TL.Messages.TLDialogsNotModified)
{
// Диалоги не изменились.
}
Разберем ответ, когда диалогов не более 100, т.е. получен объект класса TeleSharp.TL.Messages.TLDialogs.
C#:
// Полный список чатов с сообщениями и вспомогательными данными. Если у аккаунта не более 100 диалогов
var dialogs = (TeleSharp.TL.Messages.TLDialogs)responseDialog;
// получим список чатов на аккаунте
var chats = dialogs.Chats;
Видим что чаты будут выданы объектами chat. Делаем выборку из коллекции определенного типа объектов:
C#:
var onlyChats = chats.OfType<TeleSharp.TL.TLChat>();
C#:
var groupsChannels = chats.OfType<TeleSharp.TL.TLChannel>();
C#:
var onlyChannels = chats.OfType<TeleSharp.TL.TLChannel>().Where(x => x.Broadcast);
var onlyGroups = chats.OfType<TeleSharp.TL.TLChannel>().Where(x => x.Megagroup);
P.S.
Пытался объяснить максимально доступно по разбору User-API Телеграм.
Материал излагал, в обучающем стиле, поэтому все используемые классы указывал с полными путями, не используя юзинги, для сокращенного написания кода, что бы было понятнее расположение классов в библиотеке.
Надеюсь расписанная мной информация, поможет вам для старта в это увлекательное API.
Всем удачного изучения и использования!
.
- Тема статьи
- Соц. сети
- Номер конкурса статей
- Семнадцатый конкурс статей
Вложения
-
24,4 КБ Просмотры: 529
-
3,1 МБ Просмотры: 571
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование модератором: