Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
10 / 10 / 1
Регистрация: 13.05.2013
Сообщений: 58
1

Telegram API (НЕ Telegram Bot API!) - как правильно спарсить все сообщения в чате?

26.12.2020, 00:55. Просмотров 1434. Ответов 2

Здравствуйте.
Мне нужно выдрать все сообщения в определенном чате. Использую библиотеку TLSharp.
Авторизация и т.д. прошли успешно.
А когда я пытаюсь скачать все сообщения порциями по 100 шт., я попадаю в бесконечный цикл.
Что я делаю не так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using TeleSharp.TL;
using TeleSharp.TL.Messages;
using TLSharp.Core;
//using other standard...
 
//code for authorization etc. is skipped
 
 int VKFID = 1175259547; //ID of the chat
 int offset = 0;
 int n = 1;
 StringBuilder sb = new StringBuilder();
 TelegramClient client = new TelegramClient(<key>, <hash>);
 TLUser user;
 
 private DateTime ConvertFromUnixTimestamp(double timestamp)
 {
     DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
     return origin.AddSeconds(timestamp);
 }
 
 private async void button3_Click(object sender, EventArgs e)
 {
     sb.Append("#\tDate\tTime\tMID\tTUID\tText" + Environment.NewLine);
     TLDialogsSlice dialogs = (TLDialogsSlice)await client.GetUserDialogsAsync();
     TLChannel chat = dialogs.Chats.Where(c => c.GetType() == typeof(TLChannel)).Cast<TLChannel>().FirstOrDefault(c => c.Id == VKFID);
     TLInputPeerChannel inputPeer = new TLInputPeerChannel() { ChannelId = chat.Id, AccessHash = (long)chat.AccessHash };
     while (true)
     {
         try
         {
             TLChannelMessages res = await client.SendRequestAsync<TLChannelMessages>
             (new TLRequestGetHistory() { Peer = inputPeer, Limit = 1000, AddOffset = offset, OffsetId = 0 });
             var msgs = res.Messages;
             if (res.Count > offset)
             {
                 offset += msgs.Count;
                 foreach (TLAbsMessage msg in msgs)
                 {
                     if (msg is TLMessage)
                     {
                         TLMessage message = msg as TLMessage;
                         sb.Append(n.ToString() + "\t" +
                             ConvertFromUnixTimestamp(message.Date).ToLocalTime().ToString("dd'.'MM'.'yyyy") + "\t" +
                             ConvertFromUnixTimestamp(message.Date).ToLocalTime().ToString("HH':'mm':'ss") + "\t" +
                             message.Id + "\t" + message.FromId + "\t" + message.Message + Environment.NewLine);
                     }
                     if (msg is TLMessageService)
                         continue;
                     n++;
                 }
                 Thread.Sleep(22000); //to avoid TelegramFloodException
             }
             else
                 break;
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);
             break;
         }
         finally
         {
             await Task.Delay(22000); //чтобы обойти TelegramFloodException
         }
     }
     textBox2.Text = sb.ToString();
     MessageBox.Show("Done");
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2020, 00:55
Ответы с готовыми решениями:

Telegram Bot API. Функция сохранения сообщения
Есть бот, взаимодействие с которым реализовано с помощью Inline кнопок. Только в паре моментов надо...

Api Telegram Bot
Захотелось попробовать написать бота для телеграмм. Решил писать без библиотек, просто запросы....

Telegram Bot API Webhook
Здравствуйте! Вебхук перестал посылать сообщения на обработчик. Они доходят только через несколько...

Парсер + Telegram-bot-api
Здравствуйте, форумчане! Вообщем есть парсер needle.get(url, function(err, res){ if(err) throw...

2
259 / 147 / 43
Регистрация: 05.07.2018
Сообщений: 467
26.12.2020, 02:12 2
Цитата Сообщение от serhiy1994 Посмотреть сообщение
А когда я пытаюсь скачать все сообщения порциями по 100 шт., я попадаю в бесконечный цикл.
Что я делаю не так?
В целом много что не так, если относительно бесконечного цикла - Вы сами его создаете в 27-й строке.
0
10 / 10 / 1
Регистрация: 13.05.2013
Сообщений: 58
26.12.2020, 15:34  [ТС] 3
aenye,да, теперь заметил. я брал код отсюда: https://habr.com/ru/post/351350/
А что еще не так?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2020, 15:34

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

node telegram bot api , как получить момент когда опрос завершился
Здравствуйте! Возник такой вопрос - возможно ли получить момент, когда опрос (викторина)...

node telegram bot api Как получить id опроса, который отправил бот
Еще один вопрос возник во время попыток разработки телеграм бота. Как можно получить id опроса...

Не отправляет значение в telegram bot api
Всем привет! Пробую писать бота в телеграмм. Довольно простецкая ситуация, а выйти из неё мне...

Подключение Telegram Bot API к боту
Здравствуйте, подскажите, пожалуйста, как мне использовать метод из Telegram Bot API в своём боте....

Telegram Bot API не могу заполнить стек
Всем привет. Появилась надобность создать стэк моих объектов класса, которые бы обрабатывали для...

Адрес http-запроса Telegram bot API
Например, в адресной строке браузера достаточно набрать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.