# Получаем статистику Telegram-канала при помощи api и python или свой tgstat с регистрацией и смс

<https://habr.com/ru/articles/702148/>

В некоторых группах в Telegram доступна интересная и познавательная статистика, которую можно посмотреть не только со смартфона, но и нехитрых действий с api. А если каналов много, то вообще очень полезная вещь.

## Нам понадобится

Пройти небольшой и увлекательный путь с TDLib.

* [Залогиниться](https://core.telegram.org/api/obtaining_api_id) на <https://my.telegram.org>. Перейти в "API development tools" и заполнить форму (три поля: название приложение, платформа и описание)
* Получить **api\_id** and **api\_hash**, они нужны для авторизации.
* Почитать страшные предупреждения, что за использование api для флуда и прочих накруток ваш номер забанят навсегда.

Итак, TDLib, кроссплатформенная, [работает со всеми языками](https://core.telegram.org/tdlib/docs/) (питон тоже), написана на Си. С установкой библиотеки любезно помогает сам Телеграм [по ссылке](https://tdlib.github.io/td/build.html), можно выбрать язык, систему, и все команды вам напишут.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-60539efe2203f956c7d55cc1fb5ff31be3a4229d%2F33ec2ad6deeb119b0c3d794f5dd07fbe.png?alt=media)

Тут же предлагают рассмотреть решения от третьих лиц и стоит ссылка на конкретно [alexander-akhmetov/python-telegram](https://github.com/alexander-akhmetov/python-telegram). Он, так он.

## Сразу получаем статистику (ну, почти)

Импортируем всё нужное и логинемся по инструкции

```
import json
from telegram.client import Telegram
import plotly.graph_objects as go

tg = Telegram(
    api_id='api_id',
    api_hash='api_hash',
    phone='+31611111111',  # you can pass 'bot_token' instead
    database_encryption_key='changekey123',
)
tg.login()
# if this is the first run, library needs to preload all chats
# otherwise the message will not be sent
result = tg.get_chats()
result.wait()
```

После выполнения 11 строчки, Tелеграм пришлёт код, который надо ввести. Потом нужно получить все чаты (14-15), а то чуда не произойдёт.

Дальше всё очень просто, библиотека располагает прекрасной функцией call\_method, которая вызывает всё что нужно из TDLib, а нужно нам удостовериться, что группе доступна статистика.

```
params = {
    'supergroup_id': 12324890 #id группы (без -100)
}

result = tg.call_method('getSupergroupFullInfo', params, block=True)
if result.update['can_get_statistics']:
    print('Можно продолжать')
else:
    print("что-то пошло не так")
```

В библиотеке есть собственная функция по получению информации о группе, tg.get\_supergroup\_full\_info(-100231243245), но если что-то идёт не так, возвращается None и сложно понять в чём дело, при вызове tg.call\_method('getSupergroupFullInfo', params, block=True), можно указать block=True, и ошибка будет показываться.

```
params = {
    'supergroup_id': -10012324890
}

result = tg.call_method('getSupergroupFullInfo', params, block=True)
>>Telegram error: {'@type': 'error', 'code': 400, 'message': 'Supergroup not found', '@extra': {'request_id': 'fd88892cac814b4c834973d80004d09a'}}

```

В этом случае пишет, что нет такой группы.

В общем, если есть заветный флажок can\_get\_statistics==True, можем наконец, переходить к главному, [вызову метода getChatStatistics](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1get_chat_statistics.html). Всего два параметра, айди чата, и темная или светлая тема.

```
params = {
    'chat_id': -10012324890, #тут надо -100
    'is_dark': True
}
stat_resp = tg.call_method('getChatStatistics', params, block=True)
stat = stat_resp.update
```

В ответ получаем json [со всей статистикой](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1chat_statistics_supergroup.html) и наслаждаемся результатом.

* Количество подписчиков в динамике
* Подписалось/отписалось
* Включены уведомления
* Просмотры по часам
* Источники просмотров
* Активность
* Новые посты
* [и тд](https://core.telegram.org/tdlib/docs/classtd_1_1td__api_1_1chat_statistics_supergroup.html)

## Немного визуализации

Например, можно результат визуализировать при помощи plotly

```
# загружаем данные диаграммы в json
member_count_graph=json.loads(stat['member_count_graph']['json_data'])

# переводим unix timestamp в обычное время
data_x = [
    datetime.fromtimestamp(x / 1000).strftime("%m.%d")
    for x in graph["columns"][0][1:]
]

#создаём визуализацию пользователей
fig = go.Figure()
fig.add_trace(go.Scatter(x=data_x, y=member_count_graph['columns'][1]))

fig.show()
```

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-4ea25715ddfe570c644532b22abedfff7a453159%2F186d694c14b431774b4658db7b7c9507.png?alt=media)

Всем спасибо, надеюсь, будет полезно. В производство пока это всё не запускалось, поэтому насколько стабильно и уверенно всё работает, сказать не могу.

[Ноутбук с примером всего](https://github.com/Sstoryteller2/getting-statistic-of-Telegram-Channals).

* [Список классов TDLib Class Index](https://core.telegram.org/tdlib/docs/classes.html)
* [Telegram Database Library](https://core.telegram.org/tdlib)
* [Установка TDLib](https://tdlib.github.io/td/build.html)
* [python-telegram](https://python-telegram.readthedocs.io/en/0.16.0/index.html)
