Парсинг Телеграм каналов и чатов своими руками

Парсинг телеграм каналов и чатов

Мы уже рассказывали про Телеграм-боты для пробива. Сегодня продолжим говорить про телегу и рассмотрим еще одну популярную тему — парсинг телеграм каналов и чатов.

Еще по теме: Угон Телеграм и как от этого защититься

Последнее время, на всяких компьютерных форумах и сайтах часто поднимают вопрос парсинга чатов и каналов Телеграм. Некоторые пытаются впарить свои сервисы, которые как правило еще то разводилово. Другие, делая умный, вид пытаются чему-то научить. Непорядок подумал я пос­мотрев на это дело и решил самос­тоятель­но разоб­рать­ся.

Парсинг телеграм каналов и чатов

В данной статье я пос­тара­юсь понятным языком (даже для далеких от программирования пользователей) рас­ска­зать, как парсить Телеграм, что мож­но сде­лать, а что нель­зя и насколько это трудоемко. Заранее предупреждаю. Я не буду выкладывать готовые исходни­ки, но покажу при­меры для наг­ляднос­ти.

Всем извес­тно, что в телег­е существуют чаты и каналы, где иногда кучкуются большое количество поль­зовате­лей. Стоит иметь список юзеров, нап­ример для рассылки или приг­лашений.

Как правило под сло­вом «пар­синг» в кон­тек­сте Telegram подразумевается получе­ние спис­ка поль­зовате­лей чата или канала. Но иногда, еще и получе­ние спис­ка сооб­щений.

Кстати, если вас интересует деанон пользователя Телеграм, очень рекомендую прочитать статью «Как узнать информацию о пользователе Telegram».

Парсинг телеграм каналов

Канал — это площадка в Телег­рам, где подписчикам разрешается толь­ко чита­ть сооб­щения создателя канала. Писать коментарии юзеры не могут, за исклю­чени­ем тех слу­чаев, ког­да к каналу Telegram при­вязан чат для ком­мента­риев. Тог­да у пользователей появ­ляет­ся воз­можность ком­менти­ровать сооб­щения канала.

Вы можете по­лучить спи­сок под­писчи­ков канала без при­вязан­ного к нему чата с ком­мента­риями, толь­ко если это ваш канал и у него менее 200 пользотелей. Если какое-то из этих усло­вий не выпол­няет­ся, пар­синг Телеграм реализовать не получится и ник­то не смо­жет его про­вес­ти, что бы вам там ни обе­щали. Может быть, в ближайщем будущем появятся новые спо­собы, но на даннй момент рабочих спо­собов не существует.

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

Списо­к сооб­щений на канале мож­но получить двумя способами: прог­рам­мно, через API Telegram и ручками, экспор­том спи­ска сооб­щений с помощью кли­ента.

Для этого в меню чата выбираем пункт «Экспорт».

Парсинг телеграм каналов
Парсинг телеграм каналов

После этого выбираем формат для экспорта и жмем «Сохранить».

Парсинг телеграм каналов
Парсинг телеграм каналов

Парсинг телеграм чатов

С чатами гораз­до инте­рес­нее. Вруч­ную вытащить спи­сок юзе­ров через стан­дар­тный кли­ент не получит­ся, раз­ве что сидеть с блок­нотом и руч­кой и выписы­вать всю инте­ресу­ющую информа­цию. Спо­соб не очень, так что при­дет­ся пос­мотреть в сто­рону род­ного API Телеграм или, если хотите упростить себе жизнь, на какую‑нибудь биб­лиоте­ку, нап­ример Telethon.

В Telethon есть фун­кция GetParticipantsRequest, которая получа­ет на вход некую сущ­ность (entity), а на выходе выда­ет спи­сок поль­зовате­лей.

Итак, поп­робу­ем скор­мить ей какой‑нибудь чат.

И пос­мотрим, что мож­но получить с помощью данной фун­кции:

Ча­ще все­го тре­буют­ся поля id, username, first_name и last_name, phone. Кро­ме того, здесь еще и куча приз­наков: bot, verified, scam, fake, photo, status и т.д.

Как видите, информа­ция самая раз­ная. Некото­рые спе­циалис­ты по пар­сингу Telegram при этом умуд­ряют­ся заяв­лять, что им уда­лось получить толь­ко ID, а юзер­ней­мы с телефо­нами — за отдель­ные день­ги. Лов­ко, ничего не ска­жешь!

Те­лефо­ны, конеч­но, в этом спис­ке будут отоб­ражать­ся толь­ко в том слу­чае, если поль­зователь в нас­трой­ках не отклю­чил показ телефо­на всем.

Кста­ти, иног­да пред­лага­ют опре­делять еще и пол поль­зовате­ля. Таких дан­ных Telegram не пре­дос­тавля­ет и не име­ет. Мне извес­тно толь­ко два спо­соба получать эту информа­цию:

  • ана­лизи­ровать юзер­ней­мы и име­на, про­гонять их по заранее соз­данной базе и делать, если воз­можно, какие‑то выводы. Если имя поль­зовате­ля, нап­ример, Карина, Юля или Алё­на, мож­но счи­тать его жен­щиной;
  • ска­чивать все сооб­щения из чата для каж­дого поль­зовате­ля, вытас­кивать отту­да гла­голы и смот­реть, нас­коль­ко час­то они закан­чива­ются на бук­ву «а». Логич­но пред­положить, что у жен­щин таких слу­чаев будет гораз­до боль­ше, чем у муж­чин.

Оче­вид­но, что оба спо­соба не дают никаких гаран­тий и поз­воля­ют опре­делять пол лишь с некото­рой веро­ятностью и к тому же тре­буют допол­нитель­ных уси­лий.

Вни­матель­но прис­мотрев­шись к резуль­тату работы GetParticipantsRequest, мы уви­дим, что незави­симо от чис­ла учас­тни­ков чата и от парамет­ра limit нам выда­ют мак­симум 200 поль­зовате­лей. Ког­да в груп­пе мень­ше 200 учас­тни­ков, это­го дос­таточ­но, но если их боль­ше, то при­дет­ся еще под­напрячь­ся.

Мои экспе­римен­ты с парамет­ром offset показа­ли, что он нужен, что­бы ука­зывать сме­щение в спис­ке поль­зовате­лей. По умол­чанию это сме­щение рав­но нулю, но если орга­низо­вать цикл, на каж­дой ите­рации которо­го уве­личи­вать offset, то будет ска­чивать­ся по 200 юзе­ров и мож­но пар­сить до бес­конеч­ности (ну или пока не закон­чатся все юзе­ры). Нап­ример, так:

Од­нако доволь­но быс­тро выяс­няет­ся, что фун­кция GetParticipantsRequest воз­вра­щает мак­симум 10 тысяч пользователей. Как уве­личить этот лимит, выяс­нить пока не уда­лось. Есть мне­ние, что это невоз­можно.

Па­раметр filter поз­воля­ет задать кри­терии, которым дол­жны соот­ветс­тво­вать воз­вра­щаемые резуль­таты.

Есть сле­дующие вари­анты:

  • ChannelParticipantsAdmins;
  • ChannelParticipantsBanned;
  • ChannelParticipantsBots;
  • ChannelParticipantsContacts;
  • ChannelParticipantsKicked;
  • ChannelParticipantsMentions;
  • ChannelParticipantsRecent;
  • ChannelParticipantsSearch.

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

Нас боль­ше все­го дол­жен заин­тересо­вать параметр ChannelParticipantsSearch, поз­воля­ющий искать поль­зовате­лей по юзер­ней­му или его час­ти. Давайте поп­робу­ем замутить цикл:

По­ясняю: мы взя­ли весь алфа­вит и переб­рали бук­вы, пыта­ясь най­ти пользователей, в user_name которых она есть.

Смот­рим, что получи­лось:

Как вид­но, иног­да спи­сок резуль­татов содер­жит мень­ше 10 тысяч, и тог­да мы можем вытащить его пол­ностью, иног­да — боль­ше, и тог­да мы опять получим толь­ко пер­вые 10 тысяч. Одна­ко тест на груп­пе со 190 тысяча­ми юзе­ров поз­волил узнать дан­ные о 140 тысячах, а это уже немало!

На­вер­няка сущес­тву­ют и дру­гие спо­собы поиг­рать с филь­тра­ми и вытащить еще боль­ше людей из чата. Пусть это будет вам домаш­ним задани­ем.

Об­ратите вни­мание: этот спо­соб работа­ет нам­ного доль­ше, и пар­синг груп­пы с нес­коль­кими десят­ками юзе­ров может занимать до нес­коль­ких десят­ков минут.

Сох­ранять резуль­таты я рекомен­дую не в тек­сто­вый файл, а в какую‑нибудь базу дан­ных, нап­ример SQLite:

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

Заключение

Итак, я вам показал, как извле­чь из чата информа­цию о 10 тысячах его учас­тни­ков, а с при­мене­нием филь­тров — гораз­до боль­ше. Нем­ного поэк­спе­римен­тировав, вы смо­жете написать скрип­ты, которые соберут нуж­ную вам информа­цию в удоб­ном виде.

Ес­ли вдруг зна­ете еще какие‑то инте­рес­ные методы по этой теме, не забудьте поделить­ся с нами в комм­ента­х!

РЕКОМЕНДУЕМ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

3 комментария

  1. Максим

    А слабо нормальный код скинуть, а не вот это частями?

  2. АЛЕКСАНДЕР

    Какой тебе код полностью, чего? Статью то прочитай! Ум

  3. влад

    гении вы пацаны

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *