- PVSM.RU - https://www.pvsm.ru -
На просторах интернета можно найти множество описаний и примеров по созданию telegram bot-ов.Но Telegram Bot Api имеет ограниченный функционал. Для решения задачи по выгрузке сообщений из Telegram по ключевому слову необходимо использовать Telegram API. За основу была взята библиотека TLSharp [1]. Стоит сразу прояснить, что дальнейшая работа возможна только для зарегистрированных пользователей в Telegram.
Стартом работы с API служит регистрация приложения:
Добавляем в проект 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
Нажмите здесь для печати.