На просторах интернета можно найти множество описаний и примеров по созданию telegram bot-ов.Но Telegram Bot Api имеет ограниченный функционал. Для решения задачи по выгрузке сообщений из Telegram по ключевому слову необходимо использовать Telegram API. За основу была взята библиотека TLSharp. Стоит сразу прояснить, что дальнейшая работа возможна только для зарегистрированных пользователей в Telegram.
Стартом работы с API служит регистрация приложения:
- Заходим на сайт Телеграмма и вводим свой номер телефона. Вводим код подтверждения.
- Попадаем на страницу разработчика. Для завершения регистрации необходимо заполнить поля, характеризующие ваше будущее приложение.
- Получаем 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, в котором хранится вся информация пользовательской сессии. После этого можно выполнять любой запрос представленный в документации.
Приступаем к выгрузке сообщений из каналов, обязательное условие, предварительно нужно быть подписанным на канал. Получаем все диалоги, которые есть у пользователя:
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. Функции реализованы через запросы, например, дополнительную информацию по каналу можно получить через запрос вида:
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 });
Для формирования вашего запроса остается только заполнить параметры и далее таки же образом обрабатываем получаемые сообщения.
На этом всё, надеюсь кому-то это статья была полезной.
Автор: gusevski_sv