Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

Рассказываем, как за несколько шагов собрать статистику по Telegram с помощью сервиса Yandex Cloud Functions и визуализировать её в Yandex DataLens.

Чтобы упростить задачу, воспользуемся скриптами, реализующими базовые функции в Yandex Cloud Functions. Для этого понадобится выполнить несколько команд в консоли.

Подготовка окружения

Нужно создать кластер ClickHouse с публичным доступом. Настройки описаны в данной статье. Также необходимо создать секрет с логином и паролем (ключи с именами user и pass) для базы данных с помощью Yandex Lockbox. Инструкция, как это сделать, есть в документации.

Для подготовки окружения сначала нужно сделать целевые таблицы. Скрипт для них представлен в этом файле. И установите на своё устройство Python 3.11 (или старше) и свежую версию Terraform, например по этой инструкции.

Если вы устанавливаете Terraform по инструкции выше — желательно выполнить шаги 1 и 2 из инструкции.

Затем нужно создать своё приложение на основе Telegram. Для этого:

  • Зарегистрируйтесь в приложении Telegram и перейдите по ссылке. Введите свой номер телефона и код, полученный после этого в мессенджере.
  • В следующем окне выберите API development tools и задайте параметры вашего приложения. Интерфейс не очень дружелюбен: он может без пояснений выдать сообщение ERROR (например, если введённое имя не соответствует требованиям системы). При успехе из полученной конфигурации вам понадобятся значения полей App api_id и App api_hash.
Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

В свою очередь, из вашего облака понадобятся:

  • Ваш Oauth‑токен для параметраyc‑oauth. Подробнее о формате здесь.
  • Идентификатор вашего каталога вида b1gb…aa6s4 для параметра folder‑id.
Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

FQDN хоста ClickHouse с публичным доступом вида XXX–XX.XX.yandexcloud.net для параметра ch‑host.

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud
  • Имя вашей БД для параметра ch‑db‑name.

С этими данными возвращаемся в консоль и копируем проект на своё устройство:

git clone https://github.com/avhaliullin/yc-sls-tg-stats

Переходим в директорию проекта и устанавливаем зависимости:

pip install -r ./src/requirements.txt

Запускаем скрипт подключения, подставляя значения параметров вместо <…>:

python src/login.py --tg-api-id <...> --tg-api-hash <...> --yc-folder-id <...> --yc-oauth <...>

В некоторых случаях вместо Python в командах следует использовать Python3.

При выполнении нужно ввести дополнительные данные: номер телефона в международном формате и код подтверждения, который вы получите в Telegram. Взамен будет выдан secret id. Он будет доступен среди прочих секретов в Lockbox. Его идентификатор понадобится для параметра tg‑secret‑id на финальном шаге.

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

Чтобы получить идентификаторы чатов, выполняем скрипт, используя в том числе полученный идентификатор секрета:

python ./src/list_groups.py --yc-oauth <...> --tg-secret-id <...>

Из полученного в результате списка выбираем нужные ID чатов. Далее вводим их через запятую для параметра dialog-ids.

После этого инициируем проект terraform командой terraform init.

Завершаем операцию самой масштабной командой построения плана. Подставляем полученные ранее значения вместо <…>. Для параметра ch-secret-id используем имя секрета, созданного в самом начале, с логином и паролем:

terraform plan -out plan.out -var folder-id=<...> -var yc-token=<...> -var ch-host=<...> -var ch-db-name=<...> -var dialog-ids=<...,...,...> -var tg-secret-id=<...> -var ch-secret-id=<...>

Применяем созданный план:

terraform apply plan.out

Если всё выполнено правильно, то появится новая версия функции. Можно выбрать её и перейти в редактор, чтобы посмотреть код.

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

Обратите внимание: на скриншоте есть ограничение по дате, начиная с которой будут выбираться исторические данные.

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

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

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

Готово! Теперь в вашей базе будут сохраняться данные из чатов. Вы можете изменять созданную функцию с помощью кнопки Создать версию — она находится в правом верхнем углу.

Для удобства визуализации в DataLens можно создать следующее представление:

CREATE OR REPLACE VIEW all_messages AS SELECT g.name, --название группы p.username, --имя пользователя m.dt, --дата и время m.group_id, --идентификатор группы m.message_id, --идентификатор сообщения m.user_id, --идентификатор пользователя m.message_text, --сообщение m.is_forwarded, --пересланное m.reply_to, --идентификатор сообщения на которое ответ m.topic_id, --идентификатор темы t.title, --заголовок темы p.is_bot --это бот FROM messages m JOIN groups g ON g.group_id = m.group_id JOIN participants p ON p.user_id = m.user_id JOIN topics t ON t.group_id = m.group_id AND t.topic_id = m.topic_id

Можно приступать к визуализации статистики в DataLens аналогично тому, как это описано в статье. Вы можете сделать это сами или воспользоваться шаблоном дашборда. Его можно развернуть из маркетплейса DataLens.

После разворачивания дашборда нужно будет в Подключении заменить реквизиты базы данных на ваши.

Инструкция: собираем и визуализируем статистику Telegram‑чатов с помощью инструментов Yandex Cloud

Таким образом, за несколько шагов мы собрали статистику Telegram‑чатов с помощью Yandex Cloud Functions и визуализировали результаты в Yandex DataLens. Теперь у вас есть готовый дашборд, которым вы можете поделиться с командой или клиентом.

Подписывайтесь на блог Yandex Cloud, чтобы узнавать еще больше новостей и историй об IT и бизнесе.

Другие истории наших партнеров и клиентов, которые активно читают наши подписчики:

2020
7 комментариев

Круто!
Что-то подобное, но для каналов можно собирать?

И у меня давний вопрос есть по навыку для Алисы. Куда только не обращался, никто не помог.
Есть телеграм-канал, хочу создать навык, который при активации будет зачитывать 1 или 2 публикации из канала за день (всего 2 поста в день, в зависимости от запроса читается один или оба, хотя можно было бы переспрашивать, но это детали). Как это можно сделать? Есть ли годный мануал для начинающего навыкостроителя? (-:

2
Ответить

Здравствуйте, Вадим! Да, для каналов можно собрать подобное.

Для вашего сервиса/сайта вы можете разработать навык с помощью платформы https://dialogs.yandex.ru
Подробнее о Яндекс Диалогах и создании новых навыков для Алисы можно прочитать на нашем сайте: https://yandex.ru/dev/dialogs/alice/

1
Ответить

спасибо за подробное объяснение ,так намного понятнее как все правильно делать

1
Ответить

Выглядит роскошно, жаль, что нельзя без специальных знаний быстро интегрировать

Ответить