tgs sources list#

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

Использование#

tgs sources list [flags]

Флаги#

ФлагСокр.ТипПо умолчаниюОписание
--typestring[](все)Фильтр по типу: channel, supergroup, group, user, bot (повторяемый или через запятую)
--with-statsboolfalseЗапросить расширенную статистику (всего/за 24ч/первое сообщение + полная информация) для каждого источника
--limit-lint0Максимум записей в ответе (1-500, 0=все)
--cursorstringКурсор пагинации из предыдущего ответа
--folderstring""Ограничить выдачу чатами внутри этой папки (id или имя), включая архивные; несовместим с --cursor
--archivedboolfalseВключить архивированные диалоги (игнорируется при --folder — папка и так содержит свои архивные чаты)
--max-waitint60Максимум секунд ожидания при FLOOD_WAIT
--no-cacheboolfalseОтключить кеш пиров и статистики
--profile-pstringИмя профиля аккаунта

Порядок определения профиля, если --profile не указан: переменная TGS_PROFILE -> файл .tgs.yaml -> "default".

Примеры#

Список всех диалогов:

tgs sources list

Только каналы и супергруппы:

tgs sources list --type channel,supergroup

Получить статистику по каждому источнику (медленнее — ~4 API-запроса на источник):

tgs sources list --with-stats

Включить архивированные диалоги:

tgs sources list --archived

Только чаты из папки «Крипто» (включая архивные):

tgs sources list --folder Крипто

Постраничный обход большого аккаунта:

# Первая страница
tgs sources list --limit 50

# Следующая страница с курсором из предыдущего ответа
tgs sources list --limit 50 --cursor "eyJvIjo1MCwiZCI6MH0"

Вывод#

Возвращает JSON с массивом sources, полями total и returned, а также cursor для пагинации.

{
  "sources": [
    {
      "id": -1001234567890,
      "type": "channel",
      "title": "Durov's Channel",
      "username": "durov",
      "access": "public",
      "members_count": 1234567,
      "verified": true,
      "unread_count": 0,
      "last_message": {"id": 4321, "date": "2026-05-28T08:15:00Z"}
    },
    {
      "id": -1009876543210,
      "type": "supergroup",
      "title": "Go Programming",
      "username": "golang",
      "access": "public",
      "members_count": 78432,
      "has_topics": true,
      "unread_count": 5,
      "last_message": {"id": 120450, "date": "2026-05-28T07:42:11Z"}
    }
  ],
  "total": 287,
  "returned": 2,
  "cursor": "eyJvIjo1MCwiZCI6MH0"
}

total — число диалогов до фильтра и обрезки лимитом (всего в обходимой папке/папках), returnedlen(sources), т.е. фактический размер ответа после применения --type и --limit. С --type-фильтром обычно returned < total.

При использовании --with-stats каждый источник также содержит объект stats:

{
  "stats": {
    "total_messages": 12345,
    "messages_24h": 3,
    "first_message": {"id": 1, "date": "2015-08-26T10:00:00Z"}
  }
}

Поля источника#

ПолеТипОписание
idintTelegram peer ID (отрицательный для каналов и групп)
typestringОдно из: channel, supergroup, group, user, bot
titlestringОтображаемое имя
usernamestringПубличный username без @; отсутствует, если не задан
accessstringpublic или private; отсутствует для пользователей
members_countintКоличество участников/подписчиков; отсутствует, если недоступно
descriptionstringОписание или «О чате»; только при наличии полной информации
has_commentsboolКанал имеет дискуссионную группу; присутствует только если true
linked_chat_idintID привязанной дискуссионной группы; только если применимо
creation_datestringUTC RFC3339 — дата создания чата/канала; присутствует только для каналов/групп с --with-stats или через inspect
invite_linkstringОсновная ссылка-приглашение; присутствует, если доступна
first_namestringИмя пользователя/бота; отсутствует для каналов/групп
last_namestringФамилия пользователя; отсутствует, если не задано
phonestringНомер в формате E.164 (без +); отсутствует, если не виден контакту
verifiedboolОфициально верифицированный аккаунт; присутствует только если true
scamboolПомечен Telegram как мошеннический; присутствует только если true
fakeboolПомечен Telegram как фейковый; присутствует только если true
restrictedboolОграничен в некоторых регионах; присутствует только если true
restricted_reasonstringСвободная строка с причиной ограничения; отсутствует, если нет
deletedboolУдалённый аккаунт пользователя; присутствует только если true
archivedboolДиалог архивирован; присутствует только если true
pinnedboolДиалог закреплён; присутствует только если true
savedboolЭто «Избранное» (“Saved Messages”); присутствует только если true
gigagroupboolШироковещательная группа (gigagroup); присутствует только если true
has_topicsboolСупергруппа с темами форума; присутствует только если true
unread_countintКоличество непрочитанных сообщений (всегда присутствует, в т.ч. 0)
last_messageobject{id, date} последнего сообщения
statsobjectПрисутствует только при использовании --with-stats
stats_errorstringКороткий код ошибки Telegram (например CHANNEL_PRIVATE), если получение статистики не удалось; отсутствует при успехе

Поле cursor полностью отсутствует в JSON, когда больше нет результатов (оно не возвращается со значением ""). Итерируйте через jq -r '.cursor? // empty' для корректного завершения цикла.

Заметка о производительности#

По умолчанию tgs sources list работает быстро — читает список диалогов из вашего аккаунта. Флаг --with-stats делает примерно 4 дополнительных API-запроса на источник: channels.getFullChannel / messages.getFullChat / users.getFullUser для полной информации, messages.search для общего счётчика, плюс пагинированные messages.getHistory для подсчёта за 24 часа и поиска первого сообщения. Для аккаунтов с сотнями диалогов это может занять несколько минут. Статистика неактивных источников (последнее сообщение старше 7 дней) кешируется на диске и используется повторно между запусками.

Точность статистики#

  • total_messages — серверный счётчик сообщений диалога.
  • messages_24h — проходит до ~1000 последних сообщений и считает те, что попали в окно 24 часов; для гиперактивных источников значение упирается в этот лимит.
  • first_message — best-effort: для broadcast-каналов Telegram MTProto иногда не возвращает самое старое сообщение, и поле просто отсутствует.

Смотрите также#