3 минут чтения
8 февраля 2021 г.
Сбор информации о подписчиках Telegram-канала
На 2021 год боты в Telegram так и не имеют метода, позволяющего получать информацию о подписчиках канала. Тем не менее, существует достаточно сложное в освоении Telegram API и построенная на нём библиотека Telethon. Сегодня мы посмотрим, как при помощи библиотеки выгрузить информацию о подписчиках своего канала.
Создание приложения
Для начала необходимо создать приложение, через которое будут отправляться запросы к API. Перейдите на https://my.telegram.org и авторизуйтесь в Telegram-аккаунте:
После успешной авторизации перейдите на страницу API development tools:
Заполните все поля и жмите на создание приложения:
Из полученной конфигурации нам необходим app api_id и app api_hash:
Запрос к API
Импортируем telethon — он поможет сформировать запрос, и pandas — полученный ответ мы запишем в DataFrame.
from telethon import TelegramClient
import pandas as pd
Вводим api_id, api_hash, наш номер телефона и ссылку на канал, информацию о подписчиках которого хотим получить. Доступ к информации о подписчиках есть только у администраторов канала.
api_id = 1234567
api_hash = ‘1b42hj25kd8jw42b234kwj242c’
phone = ‘+71234567890’
channel_href = ‘https://t.me/leftjoin’
Создаём новую сессию — вместо session_name можно подставить любое другое название. Методы в библиотеке работают асинхронно, поэтому ответа от них требуется ожидать:
client = TelegramClient(‘session_name’, api_id, api_hash)
client = await client.start()
dialogs = await client.get_dialogs()
Собираем все каналы текущего пользователя. Из ссылки забираем часть с именем канала и вытаскиваем из словаря нужный:
channels = {d.entity.username: d.entity
for d in dialogs
if d.is_channel}
my_channel = channel_href.split(‘/’)[-1]
channel = channels[my_channel]
Подписчиков, доступ к которым не ограничен приватностью, можно получить методом get_participants. С 20 июля 2018 года Telegram установил ограничение в 200 подписчиков для вызова метода, и установка параметра aggressive на True поможет получить всех подписчиков за раз.
members_telethon_list = await client.get_participants(channel, aggressive=True)
Из полученных библиотечных структур извлекаем информацию о пользователях — их имена и телефоны:
username_list = [member.username for member in members_telethon_list]
first_name_list = [member.first_name for member in members_telethon_list]
last_name_list = [member.last_name for member in members_telethon_list]
phone_list = [member.phone for member in members_telethon_list]
Из четырёх списков собираем DataFrame и пишем его в csv-таблицу:
df = pd.DataFrame()
df[‘username’] = username_list
df[‘first_name’] = first_name_list
df[‘last_name’] = last_name_list
df[‘phone’] = phone_list
df.to_csv(‘subscribers.csv’, index=False)
Результат работы — такая таблица:
Для запуска в Jupyter Notebook описанный ниже код можно просто вставить в ячейку, но при запуске из Python-файла будет такая ошибка:
SyntaxError: ‘await’ outside function
Устранить проблему можно, записав весь код в асинхронную функцию. Целиком выглядеть код будет так:
from telethon import TelegramClient
import pandas as pd
import asyncio
async def main():
api_id = 1234567
api_hash = ‘1b42hj25kd8jw42b234kwj242c’
phone = ‘+71234567890’
channel_href = ‘https://t.me/leftjoin’
client = TelegramClient(‘session_name’, api_id, api_hash)
client = await client.start()
dialogs = await client.get_dialogs()
channels = {d.entity.username: d.entity
for d in dialogs
if d.is_channel}
my_channel = channel_href.split(‘/’)[-1]
channel = channels[my_channel]
members_telethon_list = await client.get_participants(channel, aggressive=True)
username_list = [member.username for member in members_telethon_list]
first_name_list = [member.first_name for member in members_telethon_list]
last_name_list = [member.last_name for member in members_telethon_list]
phone_list = [member.phone for member in members_telethon_list]
df = pd.DataFrame()
df[‘username’] = username_list
df[‘first_name’] = first_name_list
df[‘last_name’] = last_name_list
df[‘phone’] = phone_list
df.to_csv(‘subscribers.csv’, index=False)
if __name__ == ‘__main__’:
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Комментарии
Добавить комментарий
[ Рекомендации ]
Читайте также
[ Связаться ]
Давайте раскроем потенциал вашего бизнеса вместе
Заполните форму на бесплатную консультацию
Что-то не работает… Ругается: SyntaxError: ’await’ outside function
Добрый день! Проверили способ прямо сейчас — у нас всё работает. Пришлите, пожалуйста, свой код (можно через gist.github.com) и версию Python.
Да я вообще не очень разбираюсь в Python’е. Только начал учить буквально на днях. Парсер чатов-то сделал, но там попроще было (на другом сайте), а сейчас понадобился для дела свой канал собрать, а там такие камни подводные 🙂
ttps://gist.github.com/Mnsrff/7265c78a28f6039809906683246ce394#file-gistfile1-txt сдаюсь 🙂
В Python вовсе необязательно разделять отдельные участки кода на функции, как, например, в C 🙂 Попробуйте написать без них, просто записывая последовательно все команды из материала в файл — должно получиться вот так: https://gist.github.com/Elisejj/aec7867e5da55e295d148882ae41488c
Если так делать, то он снова на await ругается: SyntaxError: ’await’ outside function
Я ж с такой «атаки в лоб» и начинал 🙂 В общем, вот такое решение у меня работает (всё парсит и файл сохраняет): https://gist.github.com/Mnsrff/9cba7a3231034fac900dd00b692d7c0f
Но хотелось бы разобраться, почему так 🙂 Почему у вас без функций всё работает, а я вынужден был всё в них заворачивать и вызывать 🙂 Python 3.7 у меня. Библиотеки установлены.
Добрый день. Спасибо за код.
А с чем может быть связано несовпадение количества участников группы и количество выгруженных? Подписчики могут где-то ограничить приватность и не светиться в группах?
А то у меня из 574 юзеров выгружается только 470, хотя последний элемент в members_telethon_list total равняется 574.
Да, я подозреваю, что дело в настройках приватности у ряда пользователей, которые не дают свои данные выгрузить. У меня была аналогичная ситуация с экспортом собственных подписчиков.
Добрый день.
Подскажите пожалуйста, как вытащить ID юзеров.
Разобрался:)
Подскажите, есть ли способ получить список подписчиков канала, которые были удалены?
насколько мне известно, нет, увы, их уже не получить
Мы пробрасываем лиды из ФБ в телегу и гугл таблицы через Webjack. Сервис работает как часы.
Можно получить месяц халявы и бесплатную настройку по промокоду semen21, напишите его в чат техподдержки на сайте
Здравствуйте! Подскажите пожалуйста, возможно ли узнать, кто-нибудь мог таким образом спарсить подписчиков с моего канала?
вся статья об этом, вы ее читали?
Читал, но ничего не понял)))
У меня есть канал, и ощущение что один из админов спарсил моих подписчиков. Могу ли я как-то это проверить.
П.С.: Извиняюсь, если мой вопрос для Вас совсем тупой. Я чукча)
Добрый день
У меня почему-то выдает ошибку:
KeyError Traceback (most recent call last)
C:\Users\Public\Documents\Wondershare\CreatorTemp/ipykernel_7648/3941792516.py in
15 if d.is_channel}
16 my_channel = channel_href.split(’/’)[-1]
—-> 17 channel = channels[my_channel]
18
19 members_telethon_list = await client.get_participants(channel, aggressive=True)
KeyError: ’TestChannelRomanLyzhov’
Хотя канал существует, при выполнении даже был запрос на авторизацию с подтверждением через телеграм.
Канал @TestChannelRomanLyzhov свежесозданный, для теста.
Сможете помочь?
А у меня не находит ваш канал: TestChannelRomanLyzhov. Он доступен в паблике?