---
name: telegram-collector
description: Collect, analyze and organize information from Telegram groups and channels. Use to monitor Telegram channels, extract knowledge, build topic databases, and integrate Telegram data into your OpenClaw memory.
version: 2.0.0
tags: [telegram, data-collection, knowledge-base, monitoring]
requirements:
  - python3
dependencies:
  - telethon>=1.42.0
  - python-dotenv
allowed-tools: [exec, read, write, edit, cron]
platforms: [linux]
---

# Telegram Collector

> Сбор, хранение и инкрементальное обновление сообщений из Telegram-групп и каналов.

## Возможности

- ✅ Мониторинг каналов и супергрупп (включая форумные топики)
- ✅ Первичная загрузка всей истории (пакетами по 10 000, пауза 3 мин)
- ✅ Инкрементальная загрузка каждые 6 часов (только новые сообщения)
- ✅ Хранение по структуре: канал → топик → батчи
- ✅ Загрузка медиафайлов (фото, документы ≤50 МБ)
- ✅ Метаданные для видео и файлов >50 МБ (для отложенной загрузки)
- ✅ Восстановление дерева диалогов через reply_to

## Структура данных

```
workspace/data/telegram-collector/
└── raw/
    └── {channel_id}/                   ← числовой ID канала/группы
        ├── meta.json                   ← название, username, список топиков
        └── {topic_id}/                 ← ID форумного топика (1 = Основная)
            ├── state.json              ← прогресс загрузки, last_message_id
            ├── batch_0001.json
            ├── batch_0002.json
            └── media/
                ├── {msg_id}_photo.jpg
                ├── {msg_id}_document.pdf
                └── ...
```

### meta.json
```json
{
  "id": -1001234567890,
  "username": "snowbikerussia",
  "title": "Сноубайк Россия",
  "topics": {
    "1": "Основная",
    "63155": "Барахолка",
    "63467": "Техничка"
  }
}
```

### state.json (на каждый топик)
```json
{
  "topic_id": 63155,
  "topic_title": "Барахолка",
  "first_message_id": 1000,
  "last_message_id": 165197,
  "total_messages": 5432,
  "initial_load_complete": true,
  "last_incremental_at": "2026-03-24T14:00:00Z"
}
```

### Структура сообщения
```json
{
  "id": 165197,
  "date": "2026-03-24T13:08:29Z",
  "text": "Смотрите что купил",
  "from_id": 469188764,
  "reply_to_msg_id": 165180,
  "reply_to_top_id": 63155,
  "quote_text": null,
  "edit_date": null,
  "media": {
    "type": "photo",
    "file_id": "AgACAgI...",
    "size": 245000,
    "mime": "image/jpeg",
    "filename": null,
    "duration": null,
    "width": null,
    "height": null,
    "local_path": "media/165197_photo.jpg",
    "downloaded": true
  }
}
```

## Логика медиафайлов

| Тип | Размер | Действие |
|-----|--------|----------|
| Фото | любой | ✅ скачать |
| Документ / PDF / ZIP / etc | ≤ 50 МБ | ✅ скачать |
| Видео | любой | ⏭ только метаданные |
| Любой файл | > 50 МБ | ⏭ только метаданные |

`downloaded: false` + `local_path: null` = файл ожидает отложенной загрузки.

## Восстановление диалогов

- `reply_to_msg_id` = ID сообщения на которое ответили (или ID топика для корневых)
- `reply_to_top_id` = ID топика (для ответов внутри треда)
- Дерево диалогов строится по этим полям

## Credentials (.env)

Хранятся в `~/.openclaw/.env`, никогда в файлах скилла:

```bash
TELEGRAM_COLLECTOR_API_ID=36911437
TELEGRAM_COLLECTOR_API_HASH=***
TELEGRAM_COLLECTOR_PHONE=+7XXXXXXXXXX
TELEGRAM_COLLECTOR_SESSION=telegram_collector
```

Сессия: `skills/telegram-collector/telegram_collector.session`

## Конфигурация (config.json)

```json
{
  "data_dir": "/home/node/.openclaw/workspace/data/telegram-collector",
  "incremental_cron": "0 21 * * *",
  "sources": [
    {
      "channel_id": 1242788123,
      "username": "snowbikerussia",
      "title": "Сноубайк Россия",
      "type": "supergroup_forum",
      "enabled": true
    }
  ],
  "media": {
    "download_photos": true,
    "download_documents": true,
    "max_file_size_mb": 50,
    "skip_video": true
  }
}
```

## Скрипты

```bash
# Первичная загрузка всей истории (пакетами по 10 000, пауза 3 мин)
python3 scripts/initial_load.py

# Инкрементальная загрузка (только новые сообщения, отчёт в Telegram)
python3 scripts/incremental.py

# Двухпроходный анализ: GPT-4o mini (пасс 1) + Claude Sonnet (пасс 2)
# Поддерживает возобновление, считает стоимость, результат → data/{channel}/knowledge_base.md
python3 scripts/analyzer.py              # оба пасса
python3 scripts/analyzer.py --pass1-only # только извлечение фактов
python3 scripts/analyzer.py --pass2-only # только синтез из готовых фактов
python3 scripts/analyzer.py --reset      # начать заново
```

## Расписание

Настройки расписания (cron expression, job ID) хранятся в `config.json` (поле `incremental_cron`) и в `raw/{channel_id}/meta.json` (поле `cron_job_id`).

По завершении инкремента скрипт автоматически отправляет отчёт в Telegram.

Логи: `/tmp/incremental.log`

## Источники

Список источников хранится в `config.json` (поле `sources`).
Детальная информация по каждому каналу (топики, статус загрузки, статистика) — в `raw/{channel_id}/meta.json`.

## Установка зависимостей

```bash
curl -sS https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py
python3 /tmp/get-pip.py --break-system-packages
~/.local/bin/pip install --break-system-packages telethon python-dotenv
```
