- PVSM.RU - https://www.pvsm.ru -

Выгрузка сообщений с использованием Telegram API. С чего начать

На просторах интернета можно найти множество описаний и примеров по созданию telegram bot-ов.Но Telegram Bot Api имеет ограниченный функционал. Для решения задачи по выгрузке сообщений из Telegram по ключевому слову необходимо использовать Telegram API. За основу была взята библиотека TLSharp [1]. Стоит сразу прояснить, что дальнейшая работа возможна только для зарегистрированных пользователей в Telegram.

Стартом работы с API служит регистрация приложения:

  1. Заходим на сайт Телеграмма [2] и вводим свой номер телефона. Вводим код подтверждения.

    image

  2. Попадаем на страницу разработчика. Для завершения регистрации необходимо заполнить поля, характеризующие ваше будущее приложение.

    image

  3. Получаем api_id и api_hash.

Работа с библиотекой

Добавляем в проект Visual Studio через консоль диспетчера пакетов:

Install-Package TLSharp

Для начала работы создаём клиента с параметрами api_id и api_hash, полученными выше — совершаем подключение.

TelegramClient client = new TelegramClient(apiId, apiHash);
await client.ConnectAsync();

Для аутентификации своего аккаунта, выполняем следующее:

var hash = await client.SendCodeRequestAsync("номер телефона");
var code = "код телеграмма";
var user = await client.MakeAuthAsync("номер телефона", hash, code);

После выполнения данного этапа, TLSharp создает файл session.dat, в котором хранится вся информация пользовательской сессии. После этого можно выполнять любой запрос представленный в документации [3].

Приступаем к выгрузке сообщений из каналов, обязательное условие, предварительно нужно быть подписанным на канал. Получаем все диалоги, которые есть у пользователя:

var dialogs = (TLDialogs)await client.GetUserDialogsAsync();

Записанная переменная теперь хранит все диалоги, но для того чтобы отобрать только каналы, удобная структура позволяет выделить диалоги каналов и чатов, используя:

dialogs.Chats

Проходим по всем чатам и каналам, отдельно проверяя является ли следующий элемент чатом или каналом:

foreach (var element in dialogs.Chats){       
      if (element is TLChat){
TLChat chat = element as TLChat;

В библиотеке TLSharp реализованы все функции официального API [4]. Функции реализованы через запросы, например, дополнительную информацию по каналу можно получить через запрос вида:


TeleSharp.TL.Messages.TLChatFull channelInfo = await client.SendRequestAsync<TeleSharp.TL.Messages.TLChatFull>
(new TLRequestGetFullChat(){ChatId = chat.Id});

Вызывается метод SendRequestAsync<TeleSharp.TL.Messages.TLChatFull> с типом возвращаемого значения и в качестве параметра следует любой из предложенных в библиотеке запросов. Далее представлен код, получающий полную информацию о канале, в этом случае для получения канала нужны два параметра — это ChannelId и AccessHash:


if (element is TLChannel){
var offset = 0;
TLChannel channel = element as TLChannel;
var chan = await client.SendRequestAsync<TeleSharp.TL.Messages.TLChatFull>(new TLRequestGetFullChannel() {  Channel = new TLInputChannel() 
{ ChannelId = channel.Id, AccessHash = (long)channel.AccessHash} });
TLInputPeerChannel inputPeer = new TLInputPeerChannel() 
{ ChannelId = channel.Id, AccessHash = (long)channel.AccessHash };

Выгрузка сообщений

Выгрузка сообщений происходит порциями по 100 сообщений и параметром AddOffset настраивается выгрузка следующей порции сообщений.


while (true){
TLChannelMessages res = await client.SendRequestAsync<TLChannelMessages>
(new TLRequestGetHistory(){
                        	Peer = inputPeer,
                        	Limit = 400,
                        	AddOffset = offset,
                        	OffsetId = 0
});
var msgs = res.Messages;

Сообщения бывают двух типов TLMessage и TLMessageService. Первый — обычное текстовое сообщение, возможно содержащий в себе некоторый медиа файл. Второй тип сообщений в большинстве случаев представляет собой звонок или сообщения от Telegram Service.


                         if (res.Count > offset){
                    		offset += msgs.Count;
                        	foreach (var msg in msgs)
                        	{
                            	if (msg is TLMessage)
                            	{
                                	TLMessage sms = msg as TLMessage;
                                	st.Add(sms.Message);
                            	}
                            	if (msg is TLMessageService)
                                	continue;
                        	}
                    	}
                    	else
                        	break;
                	  }
            	}

Поиск по сообщениям

Добавим предварительный поиск по сообщениям в канале. Для этого просто воспользуемся таким же запросом, структура которого представлена выше.

TLInputPeerChannel inputPeer = new TLInputPeerChannel() 
{ ChannelId = channel.Id, AccessHash = (long)channel.AccessHash};
TLChannelMessages search = await client.SendRequestAsync<TLChannelMessages>
(new TeleSharp.TL.Messages.TLRequestSearch(){
                        	Peer = inputPeer,
                        	MaxDate = maxdate,
                        	MinDate = mindate,
                        	Q = searchWord,
                        	Filter = new TLInputMessagesFilterEmpty(),
                        	Limit = 100,
                        	Offset = offset  });        

Для формирования вашего запроса остается только заполнить параметры [5] и далее таки же образом обрабатываем получаемые сообщения.

На этом всё, надеюсь кому-то это статья была полезной.

Автор: gusevski_sv

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/275481

Ссылки в тексте:

[1] TLSharp: https://github.com/sochix/TLSharp

[2] Телеграмма : https://my.telegram.org/auth

[3] документации: https://core.telegram.org/methods

[4] официального API: https://core.telegram.org/#api-methods

[5] параметры: https://core.telegram.org/method/messages.search

[6] Источник: https://habrahabr.ru/post/351350/?utm_source=habrahabr&utm_medium=rss&utm_campaign=351350