# Получаем статистику 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), можно выбрать язык, систему, и все команды вам напишут.

![](/files/9TImZERAszkyVA5vTszB)

Тут же предлагают рассмотреть решения от третьих лиц и стоит ссылка на конкретно [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()
```

![](/files/35y9Hy6kGfqBksyg3soF)

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

[Ноутбук с примером всего](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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.konstantinsecurity.com/readme/architect/bots/telegram/poluchaem-statistiku-telegram-kanala-pri-pomoshi-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
