Аннотация

В статье приведён и разобран (полный и рабочий) скрипт, позволяющий автоматизированно собирать простую статистику о тг-канале: список id комментаторов с соответствующими количествами комментариев от каждого.

Введение

Всегда хочется взаимодействовать с потенциальными клиентами адресно и поименно, а не бить из пушки по воробьям. В этом плане подписчики потенциальных конкурентов - это очень ценный ресурс. Однако, список подписчиков тг-канала часто представляет собою священную тайну и просто так никто не станет делиться паствой трафиком. Поэтому получить конкретный список людей сложно, но вот комментаторов под постами никто не скрывает (возможно ли это?).

Конечно, можно вручную перебрать каждый пост и выписывать на листочек всех и каждого, но Telegram API позволяет автоматизировать этот процесс, что очень выручает, если анализируемых тг-каналов много, а постов сотни и тысячи.

Код

Актуальную версию кода можно получить в моём публичном репозитории. Сразу оговорюсь, что работа выполнялось в качестве учебной задачи по освоению python'а, поэтому слабонервных прошу отойти от экрана.

Скрипт целиком:

#====================================================================================================
import asyncio
from collections import Counter

import configparser

# класс для работы с сообщениями
from telethon import types
from telethon.sync import TelegramClient
#====================================================================================================


#====================================================
# Считываем учетные данные
config = configparser.ConfigParser()
config.read("config.ini")

# Присваиваем значения внутренним переменным
api_id   = config['Telegram']['api_id']
api_hash = config['Telegram']['api_hash']
username = config['Telegram']['username']

client = TelegramClient(username, api_id, api_hash)
#====================================================


#========================================================================================================
async def get_post_comments(channel_username, post_id, commentators, commentators_id):
    current_comment = {}
    try:
        async for message in client.iter_messages(channel_username, reply_to = post_id, reverse = True):
            print(str(post_id))
            sender = message.sender
            sender_id = message.from_id.user_id if message.from_id else None
            print(message.date, ':', message.text)
            if isinstance(sender, types.User):
                sender_name = sender.first_name if sender.first_name else "Unknown User"
                print(message.date, sender_name, ':', message.text)
                current_comment = {"date": message.date, "sender_name": sender_name, "message.text": message.text}
            elif sender is not None:
                sender_title = getattr(sender, 'title', 'Unknown Channel/Group')
                print(message.date, sender_title, ':', message.text)
                current_comment = {"date": message.date, "sender_name": sender_title, "message.text": message.text}
            else:
                print(message.date, 'Unknown Sender:', message.text)
                current_comment = {"date": message.date, "sender_name": 'Unknown Sender', "message.text": message.text}

            commentators.append(str(current_comment['sender_name']))
            commentators_id.append(str(sender_id))

            # Открытие файла в режиме добавления (append mode)
            with open('comments.txt', 'a') as file:
                file.write(
                        str(current_comment['date'])
                        + "  "
                        + str(current_comment['sender_name'])
                        + "  "
                        + str(current_comment['message.text'])
                        + '\n'
                        )
                
    except Exception as e:
        print(f'Error: {e}')

    finally:
        pass
#========================================================================================================


async def main():
    url = 'https://t.me/bogda2na_beads'
    await client.start()
    commentators = []
    commentators_id = []

    tasks = []
    for id in range(0, 481):
        tasks.append(get_post_comments(url, id, commentators, commentators_id))

    await asyncio.gather(*tasks)
    print("Запросы отправлены и ответы получены")
    counter = Counter(commentators)
    print(counter)
    counter_ids = Counter(commentators_id)
    print(counter_ids)

    # Открываем файл для добавления
    with open('commentators.txt', 'a', encoding='utf8') as file:
        for key, value in counter.items():
            file.write(f'{key} – {value}\n')

    # Открываем файл для добавления
    with open('commentators.txt', 'a', encoding='utf8') as file:
        for key, value in counter_ids.items():
            file.write(f'{key} – {value}\n')

with client:
    client.loop.run_until_complete(main())

Здесь можно выделить 4 блока:

  1. импорты;

  2. извлечение api_id, api_hash и username из файла config.ini; объявление client;

  3. функция записи комментария в текстовый файл, включая дату, имя и сам текст; функция также формирует список id комментаторов и список имен комментаторов;

  4. описание функции main, где происходит запись в файл искомого списка комментаторов.

Запросы в Telegram передаются асинхронно с помощью библиотеки asyncio. Без этого тоже можно, но о-о-очень медленно.

Использование config.ini оправдано соображениями безопасности и удобства: config.ini можно сразу добавить в gitignore и не переживать, что случайно закоммитишь что-то не то.

Блок с client.iter_messages нужно обязательно поместить в try-exception, потому что часто всплывает ошибка «Error: The message ID used in the peer was invalid (caused by GetRepliesRequest)». Она в озникает из-за того, что не все посты можно комментировать. При итоговом выводе информации, эта ошибка будет просто проигнорирована. Адрес тг-канала следует передавать в переменную url. Результат дополняет, а не перезаписывает выходные текстовые файлы.

В результате работы будут сформированы два файла в каталоге проекта:

  1. comments.txt — содержит комментарии, которые стоят не в хронологическом порядке, потому что запросы в тг отправляются асинхронно, а результаты обрабатываются по готовности

  2. commentators.txt — содержит список имён и id пользователей с указанием, сколько раз они оставляли комментарии (в общей сложности, а не под одним или под разными постами).

Результат выглядит так:

commentators.txt

Светлана – 5
Unknown Sender – 44
Юля – 4
Elena – 11
Алена Кравец – 4
Bashmakov – 28
Заира – 1
тата – 10
Мария – 2
Anastasia – 1
Татьяна – 4
. – 1
Irina – 1
Елена – 4
Наташенька – 1
Куницына Маргарита – 3
Кирилл – 1
Юлианна Константиновна – 1

878607089 – 5
None – 44
894850931 – 4
423056916 – 11
714102368 – 4
797464942 – 28
563811537 – 1
2035908009 – 10
5223286129 – 2
690890125 – 1
412976784 – 4
852712534 – 1
1031395701 – 1
1009525902 – 4
884002074 – 1
6045087523 – 3
1237066481 – 1
5135131407 – 1

comments.txt

2024-03-07 18:07:59+00:00 Светлана Очень красиво!!!!!комплект отлично сочетается с джинсами! ?
2024-03-07 19:53:34+00:00 Unknown Sender Спасибо!) да, в голове при создании как раз держала, что этот браслет будет отличным компаньоном к классическому базовому образу белая футболка/белая рубашка + джинсы. Думаю, вообще ко всему дениму подойдет)
2024-02-26 06:20:36+00:00 Юля Интересно пишешь ?
2024-02-26 06:33:26+00:00 Unknown Sender Спасибо☺️♥️
2024-02-26 10:36:47+00:00 Elena Ммм класс! Жду продолжения))
2024-02-26 11:19:10+00:00 Unknown Sender Обязательно ?
2024-03-13 10:22:02+00:00 Светлана Богдана, выздоравливай ❤️‍?
2024-03-13 10:23:10+00:00 Unknown Sender Спасибо! Самый худший день прожит - остались только косметические ньюансы)
2024-03-13 10:46:44+00:00 Алена Кравец Афигеть...как так то ?
2024-03-13 10:55:43+00:00 Unknown Sender ?
2024-03-14 07:47:57+00:00 Светлана Класс!!! Богато смотрится ???
2024-03-14 07:49:05+00:00 Unknown Sender Спасибо! Надо будет обзор сделать, в примерке выглядят акцентно, но не броско)))
2024-03-05 19:20:01+00:00 Elena Класс!!
2024-03-06 06:35:31+00:00 Unknown Sender ♥️
2024-02-27 06:12:00+00:00 Светлана Супер!!!!!!стильно!!!
2024-02-27 06:37:04+00:00 Алена Кравец Второй день собираю комплименты☺ все диву даются тонкости работы и восхищаются твоим мастерством?
Спасибо большое за эту красоту❤
2024-02-27 08:06:27+00:00 Unknown Sender Срасибо))) В жизни он очень круто выглядит?
2024-02-27 08:06:54+00:00 Unknown Sender Носи с удовольствием? ооочень рада, что нравится ☺️
2024-02-27 20:49:31+00:00 Elena Какой красавец!!!
2024-03-17 09:27:02+00:00 Elena А я люблю золотой? он мне идет?
2024-03-17 11:39:24+00:00 Светлана А я, наоборот, люблю серебро и белое золото?мне кажется, в золоте я похожа на буфетчицу из советских времён?
2024-03-17 17:03:32+00:00 Unknown Sender У меня вот такая же ассоциация как у Светланы долгое время была ? пока золотой бисер в руки не попал ?
2024-04-11 15:47:13+00:00 Bashmakov
2024-04-11 19:29:20+00:00 Unknown Sender
2024-04-04 16:35:22+00:00 Elena Класс!!!
2024-04-04 17:33:14+00:00 Bashmakov
2024-04-04 19:13:21+00:00 Юля ❤️‍?
2024-04-04 20:01:43+00:00 Unknown Sender Спасибо)) надо фурнитуру подобрать ещё, но мне уже нравится)))
2024-04-22 13:24:31+00:00 Алена Кравец Супер стильный комплект вышел, очень красивый! ❤️‍?
2024-04-22 13:25:59+00:00 Unknown Sender Спасибо! Я влюбилась в леопард, прям очень красиво в жизни выглядит
2024-03-25 08:10:45+00:00 Elena Класс!!
2024-03-25 08:32:03+00:00 Алена Кравец ???Надо больше огня, ибо очень красивые❤️‍?
2024-03-25 08:55:41+00:00 Unknown Sender Спасибо!) дары богам принесла ?
2024-03-25 08:55:56+00:00 Unknown Sender Спасибо ??
2024-05-20 09:47:32+00:00 Bashmakov
2024-06-03 09:04:21+00:00 Заира Добрый день
Хочу заказать у вас браслет, написала вам в директ инстаграм☺️
2024-06-03 10:27:21+00:00 Unknown Sender Доброго!)
2024-05-01 06:21:45+00:00 тата Как интересно свет преломляется)
2024-05-01 06:47:43+00:00 Unknown Sender Да, этот бисер хрупкий, потому что он как бы порезан вдоль грани. Из-за этого свет очень интересно ведет себя при попадании, блестит как искорки ✨ а в тени - мягкий и деликатный, полупрозрачный
2024-05-01 06:57:25+00:00 Bashmakov
2024-05-02 16:43:39+00:00 Мария Какая красотища ?
2024-05-02 17:25:42+00:00 Unknown Sender Спасибо ☺️ ?
Пока делала не знала, что такими получатся, а блеск просто гипнотический ✨
2024-05-13 06:50:19+00:00 тата Фото чудесное. Богданна, а чего видюшку с распаковкой зажала?)
2024-05-13 07:00:20+00:00 Unknown Sender ?
я её ещё не сняла, скоро будет точно! Эта посылка была неожиданным и приятным событием для меня ☺️
2024-05-13 07:46:40+00:00 Bashmakov
2024-05-15 11:20:52+00:00 Anastasia Подскажите а где будет маркет? 1-2 июня, будет какой-то анонс?
2024-05-15 21:24:20+00:00 Unknown Sender 1-2 июня будет Маркет в городе Ставрополь, в парке Победы. У себя буду показывать рабочие моменты, что готовлю. У организаторов, family market, будут очень скоро анонсы. Посмотреть более подробно можно в инсте, ник одинаковый (как мой так и у организаторов)
2024-04-12 12:46:29+00:00 Bashmakov
2024-04-13 16:10:30+00:00 Elena Круто!!
2024-04-13 16:33:38+00:00 Unknown Sender Спасибо)) теперь думаю какой браслет сделать ?
2024-05-18 06:48:55+00:00 Татьяна ???
2024-05-18 08:07:52+00:00 Bashmakov
2024-05-18 08:47:40+00:00 тата Богданна, как маленький на тебя похож)
2024-05-18 09:32:40+00:00 Unknown Sender Ахах ? может, в его голубых глазах и светлых кудрях себя не узнаю))
2024-05-18 10:28:39+00:00 тата Богданна в сумраке цвет кудрей не особенно разглядишь.
Еще раз посмотрела), контрольный, так сказать - все равно похож на тебя)
2024-06-24 08:44:38+00:00 Юля ❤️❤️❤️❤️
2024-04-26 09:26:17+00:00 Bashmakov
2024-04-26 09:51:52+00:00 Unknown Sender
2024-06-10 17:23:02+00:00 Bashmakov
2024-06-11 16:48:05+00:00 . Я хочу?
2024-06-12 05:06:11+00:00 Unknown Sender Доброго! Написала Вам в личные сообщения ?
2024-04-21 08:17:45+00:00 Bashmakov
2024-04-21 08:50:07+00:00 Unknown Sender
2024-04-22 09:36:07+00:00 тата Красиво. Спокойно. Без придурочного креатива❤️
2024-04-22 13:24:44+00:00 Unknown Sender Спасибо!)) она сама по себе очень активная и самодостаточная)))
2024-04-28 08:20:25+00:00 Мария Красотища ?
2024-04-28 22:54:22+00:00 Unknown Sender Спасибо☺️
2024-04-23 14:59:12+00:00 тата Рискну предположить Богданна) - бисер?
2024-04-23 17:15:26+00:00 Unknown Sender Бисер там тоже есть ?
Но кое-что особенное для меня)) скоро обязательно расскажу)
2024-04-23 17:16:30+00:00 тата Ждем?
2024-04-25 12:35:09+00:00 Bashmakov
2024-06-13 15:55:59+00:00 Bashmakov
2024-05-08 09:19:47+00:00 Bashmakov
2024-05-09 06:39:35+00:00 Elena Класс!!
2024-06-07 17:13:18+00:00 Bashmakov
2024-06-08 14:00:44+00:00 Elena Богданна, как прошёл маркет?
2024-06-08 14:17:30+00:00 Unknown Sender В целом, осталась довольна. Много общалась, много рассказывала о своих украшениях. Площадку не до конца поняла, маркет был в парке. Очень хочется попробовать другую площадку)
2024-06-08 14:20:58+00:00 Elena Интересно)
2024-04-15 15:50:52+00:00 Bashmakov
2024-06-14 12:55:21+00:00 Bashmakov
2024-06-14 12:58:08+00:00 Unknown Sender ?
2024-06-15 22:50:28+00:00 Irina Какие прекрасные лаконичные звёзды ❤️? научите нас?
2024-06-16 07:15:23+00:00 Unknown Sender ?
2024-04-07 10:21:17+00:00 Elena Оооооо!!!! Обожаю сочетание чёрного и золотого!
2024-04-07 10:59:56+00:00 Bashmakov
2024-06-15 20:44:03+00:00 Bashmakov
2024-06-24 11:30:18+00:00 Елена Красота то какая
2024-06-24 11:51:47+00:00 Unknown Sender Спасибо! Считаю этих крабов очень симпатичными милашками ?
2024-06-24 12:35:59+00:00 Bashmakov
2024-06-24 13:45:43+00:00 Наташенька Какие красивые!?
2024-07-03 05:15:35+00:00 тата Богданна, какой аккуратный переход цвета на сережках❤️
2024-07-03 05:23:57+00:00 Unknown Sender Я очень старалась с подбором, и моя посылка с материалом как раз во время подоспела-всё сошлось?
2024-07-03 05:56:05+00:00 Bashmakov
2024-07-03 07:18:05+00:00 Татьяна ???
2024-07-09 11:01:43+00:00 Bashmakov
2024-07-05 06:33:48+00:00 Елена Это что-то потрясающее. Как монпасье из детства ?
2024-07-05 07:37:11+00:00 Unknown Sender Спасибо! Я до сих пор под впечатлением от того как получилось. Не хотелось повторять один в один, поэтому долго думала на что заменить розовый кварц. И когда увидела этот камень в живую - сошлось! На волне вдохновения сделала ещё более спокойный вариант в серебре и с тонированым голубым кварцем. В задумках сделать с лабрадором, сапфиром, правда там цены отпугивающие большие ?
2024-07-05 07:37:46+00:00 Unknown Sender Ещё очень классно цитрин, прям как лимонные конфетки
2024-07-05 07:41:41+00:00 Елена Да, тоже пока в мечтах все эти камешки. Ну ничего со временем, потихоньку и до них дойдём.
2024-07-05 07:42:35+00:00 Unknown Sender Да! Тоже думаю, что всему свое время и будет и лабрадор и натуральный сапфир
2024-07-05 16:52:27+00:00 Татьяна Богдана , нужно прям настоящий бизнес сделать ???
2024-07-05 18:04:19+00:00 Unknown Sender Шаг за шагом, думаю выйду и на него)))
2024-07-09 08:45:13+00:00 тата Богданна, не знаю, что с концепцией, но это очень-очень красиво)
2024-07-09 09:05:32+00:00 Unknown Sender Спасибо, это самое главное ??
2024-07-14 16:07:55+00:00 тата Не была). С удовольствием послушаю рассказ)
2024-07-15 04:26:15+00:00 Unknown Sender Чуть отойду и расскажу)))
2024-07-17 08:50:11+00:00 Куницына Маргарита А я была в Ставрополе и вы мне визиточку дали
2024-07-17 09:53:59+00:00 Unknown Sender Рада вас видеть у себя в канале ?
2024-07-17 09:54:20+00:00 Куницына Маргарита А вы меня помните?
2024-07-17 12:11:42+00:00 Unknown Sender Если не ошибаюсь, вы плетите))
2024-07-17 12:34:44+00:00 Куницына Маргарита Да, я плету
2024-07-11 08:07:19+00:00 Bashmakov
2024-07-11 08:08:15+00:00 Unknown Sender А вас, молодой человек, я особенно буду ждать ?
2024-07-11 08:09:08+00:00 Bashmakov Мы с Вашим другим молодым человеком обязательно залетим на огонëк?
2024-07-11 11:25:10+00:00 Кирилл Семейный подряд
2024-07-11 18:15:02+00:00 Bashmakov Главное - не рожать при тебе
2024-06-19 14:38:42+00:00 Bashmakov
2024-06-19 14:43:17+00:00 Елена С ума сойти, какое богатство
2024-06-19 19:18:02+00:00 Unknown Sender Ой дааа, на грани разорения ?
2024-07-04 08:55:15+00:00 Татьяна Шикарный ❤️
2024-07-04 10:07:27+00:00 Unknown Sender ☺️
2024-06-25 08:32:15+00:00 Bashmakov
2024-06-07 05:31:11+00:00 Bashmakov
2024-06-07 07:33:40+00:00 Юлианна Константиновна
2024-06-22 10:33:00+00:00 Bashmakov
2024-06-24 11:28:48+00:00 Юля ?

Вывод

Да, конечно, знать только комментаторов — это далеко не то же самое, что знать всех подписчиков, НО, во‑первых, комментаторы — это именно активная и вовлеченная публика, а во‑вторых, это бесплатно.

Комментарии (1)


  1. dron88
    18.07.2024 12:19

    А как вы потом эти списки применяет, каким образом и методом?