Сложности разработки бота для подсчета охватов
(начало тут)
Итак, что же могло пойти не так, ведь задача: открыть курсор и ввести промпт "напиши мне бота, который считает охваты телеграм каналов. На вход получает пачку ссылок, а на выходе дает статистику по охватам"
(ну как-то так).
Оказалось, что не так может пойти почти всё, с самого начала.
1️⃣ Мне пришлось разобраться, что у телеграма существуют 2 уровня API.
Первый уровень: Bot API - это команды, которые может выполнять сам бот от своего имени. Например. написать сообщение пользователю, который его активировал.
Второй уровень: MTProto API. Это команды, которые можно выполнять от имени обычного пользователя. Существует этот MTProto главным образом для того, чтобы можно было создавать свои клиентские приложения типа Telegram, но со своими функциями.
Так вот, охваты нельзя считать через Bot API. А это значит, что для подсчета охватов нужно взять реального пользователя и от его имени заходить в каналы и смотреть охваты. Кстати, в приватные каналы надо физически вступить, чтобы увидеть охваты.
2️⃣ Оказывается (вы не поверите!), у Телеграма есть флуд фильтры и он не очень любит, чтобы какой-то юзер постоянно вступал в какие-то каналы и совершал странные действия, не похожие на реальный пользовательский опыт. Поэтому очень быстро я стал получать сообщения "Flood wait until XXX (3s)", "Flood wait until XXX (254s)". И пока время не истечет, пользователь заблокирован (а значит, и бот тоже).
3️⃣ Первый подход к решению проблемы с Flood Wait - это снизить нагрузку на API Telegram. Снизить количество запросов. Вступать в каналы и не выходить из них (потому что через запрос на вступление проще всего получить этот флуд вэйт). Кэшировать каналы. Запоминать пригласительные ссылки (потому что второй по степени риска запрос - это получение id канала из пригласительной ссылки). Короче, я стал сохранять в БД все что можно. Но тут оказалось, что один человек не может вступить более чем в 500 каналов. А значит, при приближении к лимиту нужно выходить из других каналов, которые меньше используются. А значит, надо вести еще и статистику использования каналов (ну, чтобы не выйти из того, который опять пришлют через 5 минут).
После пункта 3 бот в целом был более-менее рабочий, но совершенно не масштабируемый. Больше 20 пользователей в день он не переваривал, начинали сыпаться flood wait ошибки и приходилось ждать 10-20-30 минут, чтобы увидеть ответ.
Получилась уже огромная простыня, так что я в другом посте напишу, как я его масштабировал и что из этого вышло
День синьора
Post #21
201
- ❤ 1
- 👍 1
- 👏 1
- 🐳 1