Сбор информации о подписчиках Telegram-канала - LEFT JOIN

Свяжитесь с нами в любой удобной для вас форме

Менеджер

Написать в телеграмм

Онлайн
Телеграмм
или
Заполните форму

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())
12465 просмотров

Комментарии

  • None
    None

    Что-то не работает… Ругается: SyntaxError: ’await’ outside function

    • Николай Валиотти
      Николай Валиотти

      Добрый день! Проверили способ прямо сейчас — у нас всё работает. Пришлите, пожалуйста, свой код (можно через gist.github.com) и версию Python.

      • None
        None

        Да я вообще не очень разбираюсь в Python’е. Только начал учить буквально на днях. Парсер чатов-то сделал, но там попроще было (на другом сайте), а сейчас понадобился для дела свой канал собрать, а там такие камни подводные 🙂

  • None
    None

    ttps://gist.github.com/Mnsrff/7265c78a28f6039809906683246ce394#file-gistfile1-txt сдаюсь 🙂

    • Николай Валиотти
      Николай Валиотти

      В Python вовсе необязательно разделять отдельные участки кода на функции, как, например, в C 🙂 Попробуйте написать без них, просто записывая последовательно все команды из материала в файл — должно получиться вот так: https://gist.github.com/Elisejj/aec7867e5da55e295d148882ae41488c

      • None
        None

        Если так делать, то он снова на await ругается: SyntaxError: ’await’ outside function

        Я ж с такой «атаки в лоб» и начинал 🙂 В общем, вот такое решение у меня работает (всё парсит и файл сохраняет): https://gist.github.com/Mnsrff/9cba7a3231034fac900dd00b692d7c0f

        Но хотелось бы разобраться, почему так 🙂 Почему у вас без функций всё работает, а я вынужден был всё в них заворачивать и вызывать 🙂 Python 3.7 у меня. Библиотеки установлены.

  • Marsel Kh
    Marsel Kh

    Добрый день. Спасибо за код.
    А с чем может быть связано несовпадение количества участников группы и количество выгруженных? Подписчики могут где-то ограничить приватность и не светиться в группах?
    А то у меня из 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. Он доступен в паблике?

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

[ Рекомендации ]

Читайте также

1 минута чтения

*

21 марта 2021

Обнаружение статистических выбросов в R

1 минута чтения

*

20 сентября 2020

Доклады онлайн-конференции FutureData

[ Дальше ]