# Парсер контента · гайд по установке и работе

Это твоя копия «парсера контента» Майи — программы, которая следит за Instagram-аккаунтами конкурентов, находит их залётные reels и посты за последние 7 дней, складывает всё в Google-таблицу и присылает в Telegram. Плюс умеет по одной ссылке на reels выдать текст того, что в нём говорят (транскрибацию).

Гайд написан для человека, который никогда не открывал Терминал. Каждый шаг: что нажать → что скопировать → как проверить. Почти каждый шаг можно не делать руками, а попросить Claude — готовые фразы в блоках `code`. Если положила папку пакета не в `~/alena-setup`, подставь в фразах свой путь.

Рядом с гайдом лежат: `env.example` (шаблон файла с ключами) и `CHANGES-FOR-ALENA.md` (техническое, для Майи и Claude).

---

## Содержание

0. [Как это встроено в твой контент](#0-как-это-встроено-в-твой-контент)
1. [Что понадобится и сколько стоит](#1-что-понадобится-и-сколько-стоит)
2. [Аккаунты и ключи — по одному](#2-аккаунты-и-ключи--по-одному)
3. [Подготовка мака](#3-подготовка-мака)
4. [Установка кода](#4-установка-кода)
5. [Настройка под себя](#5-настройка-под-себя)
6. [Первый запуск и проверка](#6-первый-запуск-и-проверка)
7. [Railway: чтобы открывалось с телефона](#7-railway-чтобы-открывалось-с-телефона)
8. [Как пользоваться](#8-как-пользоваться)
9. [Все фразы для Claude в одном месте](#9-все-фразы-для-claude-в-одном-месте)
10. [Если что-то сломалось](#10-если-что-то-сломалось)
11. [Безопасность](#11-безопасность)
12. [Шпаргалка](#12-шпаргалка)

---

## 0. Как это встроено в твой контент

Парсер — это первый шаг твоей фабрики reels:

```
1. Парсер раз в неделю собирает свежие reels 20–40 конкурентов
        ↓
2. Ты смотришь топ по комментариям (это и есть «залётные»)
        ↓
3. Отмечаешь галочками 3–5 роликов → «Взять в работу»
   Парсер сам делает транскрибацию речи → в таблицу
        ↓
4. Копируешь транскрибацию и отдаёшь Claude в скилл /reels-expert,
   режим 1 «Адаптация залётного ролика»
        ↓
5. Получаешь СВОЙ сценарий: тот же приём, что сработал у них,
   но про тело / расслабление / исполнение желаний — твоим голосом
```

Что делает парсер сам:
- **Анализ reels** — берёт до 30 последних reels у каждого аккаунта из твоего списка, оставляет только за 7 дней, сортирует по комментариям, пишет в таблицу и показывает топ.
- **Анализ постов** — то же для каруселей и обычных постов (по 12 последних у каждого).
- **Разбор по ссылке** — кидаешь ссылку на любой reels → получаешь транскрибацию и подпись. Для карусели — только подпись.
- **Взять в работу** — выбранные ролики уходят в отдельный лист таблицы, и парсер сам транскрибирует их в фоне.

Что он НЕ делает: не запускается по расписанию (только когда ты нажала кнопку), не пишет сценарии (это делает скилл `/reels-expert`), не работает с закрытыми аккаунтами.

Две версии одного и того же:
- **Веб-страница** — основная. Кнопки, галочки, история. Работает с компьютера, а после шага 7 — с телефона.
- **Telegram-бот** (персонаж «Кирилл») — те же анализы через кнопки в чате. Удобно, когда нет под рукой браузера. Работает только на Railway или пока запущен на маке.

---

## 1. Что понадобится и сколько стоит

| Сервис | Зачем | Цена | Обязательно? |
|--------|-------|------|--------------|
| Telegram-бот (@BotFather) | Telegram-версия парсера | бесплатно | да (без токена код не запускается на Railway) |
| Apify | сбор данных из Instagram | бесплатно: $5 кредитов в месяц. Хватает на 3–4 полных запуска по 25–30 аккаунтов | да |
| OpenAI | транскрибация речи (Whisper) | предоплата от $5. Одна минута речи ≈ $0,006 → 100 роликов ≈ $0,6 | да, если нужна транскрибация |
| Anthropic (Claude API) | адаптация текста внутри парсера | — | **нет**, сейчас в интерфейсе выключено. Пропусти |
| Google Cloud + Google-таблица | куда пишутся результаты | бесплатно | да |
| Railway | чтобы парсер работал в облаке и открывался с телефона | Hobby $5/мес (в них включено $5 использования; парсер тратит $1–3) | нет — можно запускать на маке |
| GitHub-аккаунт | получить код от Майи | бесплатно | да |
| Claude Code на маке | чтобы просить Claude делать шаги | у тебя уже есть | — |

Итого: минимум $0/мес (Apify free + мак), комфортно $5–10/мес (Railway + пополнение OpenAI раз в несколько месяцев).

Нужна карта, которая проходит за рубежом (Apify/OpenAI/Railway — иностранные сервисы). `[нужна деталь: какая карта есть у Алёны]`.

---

## 2. Аккаунты и ключи — по одному

Заведи заметку «Ключи парсера» в Заметках мака (или в менеджере паролей) и складывай туда всё, что получишь на этом шаге. В чаты и Claude ключи не вставляй — Claude на шаге 5 сам прочитает их из файла.

### 2.1 Telegram-бот и твой ID

1. В Telegram найди **@BotFather** → нажми **Start**.
2. Напиши `/newbot`.
3. Он спросит имя — напиши любое, например `Парсер Алёны`.
4. Спросит username — латиницей, должен заканчиваться на `bot`, например `alena_parser_bot` (если занят — добавь цифры).
5. BotFather пришлёт сообщение с токеном вида `1234567890:AAH1b2c3...`. Скопируй в заметку как **TELEGRAM_BOT_TOKEN**.
6. Теперь свой ID: найди **@userinfobot** → Start → он пришлёт `Id: 123456789`. Скопируй число в заметку как **TELEGRAM_CHAT_ID**.
7. Открой своего нового бота (по ссылке из сообщения BotFather) и нажми **Start** — пока он молчит, это нормально: он ещё не запущен.

Проверка: в заметке две строки — токен с двоеточием посередине и ID из 9–10 цифр.

### 2.2 Apify

1. Зайди на **apify.com** → **Sign up** → через Google или почту. Карту на бесплатном плане не просят.
2. После входа: слева внизу **Settings** → вкладка **API & Integrations** (может называться **Integrations**).
3. В блоке **Personal API tokens** нажми **Create a new token** (или скопируй тот, что уже есть). Токен начинается с `apify_api_`.
4. Скопируй в заметку как **APIFY_API_TOKEN**.

Проверка: в разделе **Billing** видно «Free plan» и «$5.00 monthly usage». Это твой лимит. Дата обновления лимита — там же (у Майи цикл сбрасывается 8-го числа, у тебя будет свой день — запиши его).

Фраза для Claude (проверить, что токен рабочий, после шага 5):
```
Проверь мой токен Apify из файла ~/reels-monitor/.env: сделай запрос
GET https://api.apify.com/v2/users/me/limits и скажи, сколько лимита осталось в этом месяце.
Сам токен в ответе не показывай.
```

### 2.3 OpenAI (Whisper)

1. Зайди на **platform.openai.com** → **Sign up** (это отдельный вход от ChatGPT-подписки; подписка ChatGPT Plus сюда НЕ подходит, нужен именно баланс API).
2. Слева **Settings** → **Billing** → **Add payment details** → карта → **Add to credit balance** → минимум $5. Этого хватит на сотни роликов.
3. Слева **API keys** → **Create new secret key** → имя `parser` → **Create**. Ключ начинается с `sk-`. Показывается один раз — сразу скопируй в заметку как **OPENAI_API_KEY**.

Проверка: в **Billing** баланс $5.00. В **Limits** ничего трогать не надо.

### 2.4 Anthropic (Claude API) — пропусти

В текущей версии парсера Claude внутри не используется (Майя убрала адаптацию из интерфейса — сценарии пишутся отдельно, в Claude Code через скилл). Ключ **ANTHROPIC_API_KEY** оставь пустым. Если Майя позже включит адаптацию — добавишь ключ в те же переменные.

### 2.5 Google-таблица и доступ для парсера

Парсер пишет в таблицу не от твоего имени, а от имени «служебного аккаунта» Google — это такой робот-пользователь с собственной почтой. Его надо создать и дать ему доступ к таблице.

**А. Таблица**
1. Открой **sheets.google.com** → **Пустая таблица**. Назови `Парсер конкурентов`.
2. Посмотри на адрес в браузере: `https://docs.google.com/spreadsheets/d/`**`1AbCdEf...длинная строка...`**`/edit`. Всё между `/d/` и `/edit` — это ID таблицы. Скопируй в заметку как **GOOGLE_SHEET_ID**.

**Б. Служебный аккаунт**
1. Открой **console.cloud.google.com** (тот же Google-аккаунт). Первый раз попросит принять условия — прими.
2. Вверху слева кнопка выбора проекта → **New project** → имя `parser` → **Create**. Подожди 10 секунд, выбери его в том же списке.
3. Меню ☰ → **APIs & Services** → **Library** → в поиске `Google Sheets API` → открыть → **Enable**.
4. Меню ☰ → **IAM & Admin** → **Service Accounts** → **Create service account**.
   - Name: `parser` → **Create and continue** → роль можно не выбирать → **Continue** → **Done**.
5. В списке появится аккаунт с почтой вида `parser@parser-123456.iam.gserviceaccount.com`. Скопируй эту почту в заметку.
6. Нажми на него → вкладка **Keys** → **Add key** → **Create new key** → **JSON** → **Create**. На мак скачается файл `parser-123456-abc.json`.
7. Переименуй скачанный файл в **`google_creds.json`** (в Finder: выделить → Enter → новое имя). Пока оставь в Загрузках, на шаге 5 положим на место.

**В. Доступ**
1. Вернись в таблицу → кнопка **Настройки доступа** (Share) справа вверху.
2. Вставь почту служебного аккаунта из пункта Б.5 → роль **Редактор** → сними галочку «Уведомить» → **Отправить**.

Проверка: в окне доступа таблицы видно два пользователя — ты и `parser@...iam.gserviceaccount.com` (Редактор). Файл `google_creds.json` лежит в Загрузках. Внутри него есть строка `"client_email": "parser@..."` — можно открыть двойным кликом и посмотреть, но ничего не менять.

### 2.6 GitHub

1. Если нет аккаунта — **github.com** → **Sign up**. Ник запиши, отправь Майе: она пригласит тебя в репозиторий с кодом.
2. Когда придёт письмо «... invited you to reels-monitor-alena» — нажми **Accept invitation**.

### 2.7 Railway — позже

Понадобится только на шаге 7. Сначала запустим на маке.

---

## 3. Подготовка мака

Нужны четыре вещи: инструменты командной строки Apple, Python 3.12, git/gh и Claude Code. Проверь, что есть, — попроси Claude:

```
Проверь, что у меня установлено: xcode-select -p, python3 --version (нужен 3.11 или новее),
git --version, gh --version, ffmpeg -version. Ничего не ставь, просто скажи, чего нет.
```

Чего нет — ставим:

**Инструменты командной строки Apple** (git внутри): открой Терминал (⌘+пробел → «Терминал») и вставь
```
xcode-select --install
```
Появится окно — **Установить**. 5–15 минут.

**Python 3.12**: скачай установщик с **python.org/downloads/macos** («macOS 64-bit universal2 installer» для версии 3.12.x) → открыть → Далее до конца. Именно с python.org, не через Homebrew: на старых версиях macOS Homebrew часто не может собрать пакеты, а установщик python.org работает везде.
Проверка в Терминале: `python3.12 --version` → `Python 3.12.x`.

**gh (GitHub в терминале)**: с **github.com/cli/cli/releases** скачай файл `gh_X.Y.Z_macOS_universal.pkg` → открыть → установить. Потом в Терминале:
```
gh auth login
```
Отвечай: `GitHub.com` → `HTTPS` → `Yes` (authenticate Git) → `Login with a web browser` → скопируй код, Enter, вставь в браузере → Authorize.
Проверка: `gh auth status` → `Logged in to github.com account <твой ник>`.

Если gh ставиться не хочет — не страшно: на шаге 4 есть вариант без gh.

**Claude Code** — у тебя уже стоит. Все дальнейшие фразы говоришь ему, открыв Терминал, набрав `claude` и Enter.

Фраза для Claude на весь шаг:
```
Подготовь мак по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 3: проверь Command Line Tools,
Python 3.12 (если нет — скажи мне скачать с python.org, сам через brew не ставь), gh. Потом покажи gh auth status.
```

---

## 4. Установка кода

Код будет жить в домашней папке: `~/reels-monitor` (не на Рабочем столе — так проще с правами macOS).

### 4.1 Скачать код

Вариант А (gh работает):
```
gh repo clone maiyamaiya19999-bit/reels-monitor-alena ~/reels-monitor
```
Точное имя репозитория пришлёт Майя — если оно другое, подставь.

Вариант Б (без gh): `git clone https://github.com/maiyamaiya19999-bit/reels-monitor-alena.git ~/reels-monitor` — git спросит логин (ник GitHub) и пароль. Вместо пароля нужен **Personal access token**: github.com → аватар → **Settings** → **Developer settings** → **Personal access tokens** → **Tokens (classic)** → **Generate new token** → галочка `repo` → **Generate** → скопировать и вставить в терминал вместо пароля.

Проверка: `ls ~/reels-monitor` показывает `bot.py core.py web.py ai.py requirements.txt Dockerfile bloggers.txt`.

### 4.2 Виртуальное окружение и библиотеки

В Терминале по одной строке:
```
cd ~/reels-monitor
python3.12 -m venv venv
./venv/bin/python -m pip install --upgrade pip
./venv/bin/python -m pip install -r requirements.txt
```
Последняя команда качает библиотеки 1–3 минуты. В конце должно быть `Successfully installed ...`.

Проверка: `./venv/bin/python -c "import fastapi, gspread, apify_client; print('ok')"` → `ok`.

### 4.3 ffmpeg (для транскрибации)

ffmpeg вырезает звук из видео, чтобы отправить в Whisper файл поменьше. Три варианта — от простого к запасному:

1. **Homebrew** (если стоит и macOS свежая): `brew install ffmpeg`. Если брю нет или он ругается «cannot build / no bottle available» — не мучайся, переходи к варианту 2.
2. **Через pip** (работает на любой macOS):
   ```
   cd ~/reels-monitor
   ./venv/bin/python -m pip install static-ffmpeg
   ./venv/bin/python -c "import static_ffmpeg.run as r; print(r.get_or_fetch_platform_executables_else_raise()[0])"
   ```
   Последняя команда скачает ffmpeg и напечатает путь к нему (что-то вроде `.../static_ffmpeg/bin/darwin/ffmpeg`). Сделай ссылку, чтобы парсер его нашёл:
   ```
   ln -sf "$(./venv/bin/python -c 'import static_ffmpeg.run as r; print(r.get_or_fetch_platform_executables_else_raise()[0])')" ./venv/bin/ffmpeg
   ```
   И дальше запускай парсер с активированным окружением (`source venv/bin/activate` перед запуском — см. шаг 6), чтобы `ffmpeg` был виден.
3. **Совсем без ffmpeg.** Парсер это переживёт: в коде есть запасной путь — если ffmpeg нет, он отправляет в Whisper файл целиком. Instagram отдаёт звук отдельной маленькой дорожкой, так что в лимит 24 МБ почти всегда укладывается. Просто в логе будет строка «ffmpeg недоступен, отправляю видео целиком».

На Railway (шаг 7) ffmpeg уже есть — он ставится внутри Dockerfile.

Фраза для Claude на весь шаг 4:
```
Установи парсер по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 4: клонируй репозиторий
maiyamaiya19999-bit/reels-monitor-alena в ~/reels-monitor, создай venv на python3.12,
поставь requirements.txt, ffmpeg — сначала попробуй brew, если не выйдет — вариант через static-ffmpeg.
В конце покажи проверки из гайда.
```

---

## 5. Настройка под себя

### 5.1 Файл `.env` — ключи

1. Скопируй шаблон: в Терминале `cp ~/alena-setup/parser/env.example ~/reels-monitor/.env` (если Майя положила `env.example` в репозиторий — `cp ~/reels-monitor/env.example ~/reels-monitor/.env`).
2. Открой файл: `open -e ~/reels-monitor/.env` (откроется в TextEdit; файл с точкой в начале в Finder не виден — это нормально).
3. Вставь значения из заметки после `=`, без кавычек и пробелов:

```
TELEGRAM_BOT_TOKEN=   ← из 2.1
TELEGRAM_CHAT_ID=     ← из 2.1 (число)
APIFY_API_TOKEN=      ← из 2.2
OPENAI_API_KEY=       ← из 2.3
ANTHROPIC_API_KEY=    ← пусто
GOOGLE_SHEET_ID=      ← из 2.5-А
WEB_PASSWORD=         ← придумай пароль для веб-страницы (латиница, без пробелов)
DATA_DIR=             ← пусто (это для Railway)
```
4. Сохрани (⌘S), закрой.

Фраза для Claude (он вставит значения из твоей заметки-файла, но никуда их не перешлёт):
```
Заполни ~/reels-monitor/.env по шаблону env.example: значения возьми из файла ~/Documents/ключи-парсера.txt.
Не показывай мне ключи в ответе, просто скажи, какие переменные заполнены, а какие остались пустыми.
```
(для этого сохрани заметку с ключами как текстовый файл `~/Documents/ключи-парсера.txt`; после установки файл можно удалить.)

### 5.2 `google_creds.json`

Перенеси файл из Загрузок в папку парсера:
```
mv ~/Downloads/google_creds.json ~/reels-monitor/google_creds.json
```
Проверка: `ls ~/reels-monitor/google_creds.json` — путь напечатан без ошибки.

### 5.3 Список конкурентов `bloggers.txt`

Файл `~/reels-monitor/bloggers.txt` — по одному нику Instagram в строке, без `@`. В копии от Майи там её список (англоязычные SMM- и ИИ-блогеры). Замени на свой — как подбирать, в разделе 8.1. Для первого запуска хватит 5–10 аккаунтов.

`open -e ~/reels-monitor/bloggers.txt` → отредактируй → ⌘S.

Список можно менять и потом прямо на веб-странице (разделы 04 и 05) — файл править не обязательно.

### 5.4 Константы в коде — только если Майя не применила патч

Открой `CHANGES-FOR-ALENA.md` → раздел 2. Если Майя применила патч, в коде ничего менять не надо: `GOOGLE_SHEET_ID` и твой Telegram ID парсер возьмёт из `.env`. Проверить просто:
```
grep -n "GOOGLE_SHEET_ID" ~/reels-monitor/core.py | head -1
```
Если в строке есть `os.environ` — патч есть. Если там длинная строка в кавычках — патча нет, и тогда попроси Claude:
```
В ~/reels-monitor примени патч из раздела 2 файла ~/alena-setup/parser/CHANGES-FOR-ALENA.md
(GOOGLE_SHEET_ID, ALLOWED_IDS, DEFAULT_VOICE из переменных окружения) и покажи diff.
```

### 5.5 Твой голос («Мой стиль»)

Это описание тебя, на которое опирается Claude внутри парсера (сейчас не используется, но пусть будет твоё, а не Майи). Заполнишь на веб-странице в разделе **06 Мой стиль** после первого запуска — вставь этот текст (он же в `CHANGES-FOR-ALENA.md`, раздел 3):

> Я — Алёна (@the.tsarevna), Царевна. Специалист по осознанному расслаблению: помогаю женщинам расслаблять тело и благодаря этому исполнять свои желания. Блог про тело и психосоматику простым языком: подавленные эмоции → зажимы → автопилот → та же жизнь. Всё, что я даю, человек получает лёжа и слушая — я НЕ тренер, никаких упражнений и осанки.
>
> Тон: подруга, которая старше не годами, а километражем, — без надрыва и без позиции сверху. Длинные предложения через «и» и «потому что», короткие строки, самоирония только над собой, «проги» вместо терминов, эмодзи вместо интонации (🤡 😢 🤷🏼‍♀️). Не «состояние», а «чувствование телом». Слова «Claude» и «reels» пишу латиницей.
>
> Аудитория: женщины 30–45, уставшие «железные леди» на автопилоте — хотят, чтобы их оставили в покое, и вернуть саму способность хотеть.
>
> Границы: никаких медицинских обещаний («вылечу», «уберу боль»), без гарантий и сроков, про финансовую независимость не говорю.

### 5.6 Пароль веб-версии

Это `WEB_PASSWORD` в `.env` (пункт 5.1). Если оставить пустым — пароль `kirill`, его знают все, кто читал код Майи. Поставь свой.

---

## 6. Первый запуск и проверка

### 6.1 Веб-версия на маке

```
cd ~/reels-monitor
source venv/bin/activate
python -m uvicorn web:app --port 8123
```
(если ffmpeg ставила не через static-ffmpeg, можно короче: `./venv/bin/python -m uvicorn web:app --port 8123`)

В Терминале появится `Uvicorn running on http://127.0.0.1:8123`. Открой в браузере **http://localhost:8123** → введи пароль → страница «Кирилл — парсер Reels».

Остановить: в Терминале Ctrl+C.

Проверка по шагам:
1. Раздел **04 Список блогеров** показывает твои ники из `bloggers.txt`. Нет → файл пустой или `.env` не читается (смотри вывод в терминале).
2. **01 Анализ** → **Запустить анализ Reels**. 1–3 минуты. Появится список «@ник · дата · 💬 комментарии ❤️ лайки» и ссылка «Открыть ... →» на новый лист в таблице.
3. Открой таблицу — появился лист `🎬 Reels ДД.ММ ЧЧ:ММ` с колонками Блогер / Тип / Дата / Комментарии / Лайки / Ссылка.
4. **02 Разбор по ссылке** → вставь ссылку на любой reels с речью → **Транскрибировать** → через минуту текст. Это проверяет OpenAI.

Если на шаге 2 ошибка — сразу в раздел 10.

### 6.2 Telegram-бот на маке (необязательно)

```
cd ~/reels-monitor && source venv/bin/activate && python bot.py
```
В терминале `Бот запущен`. Напиши своему боту `/start` — придёт меню с кнопками «Анализ Reels 🎬», «Анализ постов 🖼», «Список 📋», «Добавить ➕», «Удалить ❌». Бот работает, пока открыт Терминал. (Одновременно с `bot.py` поднимается и веб-версия на порту 8080: http://localhost:8080.)

Бот молчит → твой ID не совпадает с `TELEGRAM_CHAT_ID`/`ALLOWED_IDS` — раздел 10.

Фраза для Claude на весь шаг 6:
```
Запусти парсер локально по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 6.1, в фоне,
проверь, что http://localhost:8123 отвечает и что /api/bloggers с моим паролем из .env возвращает список.
Если есть ошибки в логе — объясни по-простому, что не так.
```

---

## 7. Railway: чтобы открывалось с телефона

На маке парсер работает, только пока открыт Терминал. Railway — облако, где он крутится постоянно: с телефона открываешь адрес, вводишь пароль и жмёшь кнопки. Telegram-бот там тоже живёт круглосуточно.

### 7.1 Аккаунт и тариф
1. **railway.com** → **Login** → через GitHub.
2. Trial даёт $5 один раз, потом нужен план **Hobby $5/мес** (в него включено $5 использования — парсер тратит меньше). Account → **Plans** → Hobby → карта.

### 7.2 Railway CLI на маке
В Терминале:
```
curl -fsSL https://railway.com/install.sh | sh
railway login
```
Откроется браузер → **Confirm**. Проверка: `railway whoami` → твоя почта.
(Если `curl ... | sh` не сработал, второй способ: `npm i -g @railway/cli` — нужен Node.js с nodejs.org.)

### 7.3 Проект и первый деплой
```
cd ~/reels-monitor
railway init
```
Спросит имя проекта → `reels-monitor`. Потом:
```
railway up --detach
```
Код улетит на Railway, соберётся по Dockerfile (там сразу ставится ffmpeg). Первый раз 3–5 минут. Первый деплой **упадёт** — переменных ещё нет. Это ожидаемо, идём дальше.

### 7.4 Variables
1. **railway.com** → проект `reels-monitor` → сервис (прямоугольник) → вкладка **Variables** → **Raw Editor**.
2. Вставь (значения — из своей заметки):
```
TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...
APIFY_API_TOKEN=...
OPENAI_API_KEY=...
GOOGLE_SHEET_ID=...
WEB_PASSWORD=...
DATA_DIR=/data
GOOGLE_CREDS_JSON=...
```
3. `GOOGLE_CREDS_JSON` — это **всё содержимое** файла `google_creds.json` одной строкой. Открой файл в TextEdit, ⌘A, ⌘C, вставь после `=`. Внутри есть кавычки и фигурные скобки — так и надо. В Raw Editor ничего экранировать не нужно.
4. **Update Variables** / **Deploy**.

`PORT` задавать не надо — Railway подставляет сам. `ANTHROPIC_API_KEY` — не нужен.

### 7.5 Volume — чтобы список блогеров не стирался
Без этого при каждом деплое Railway пересоздаёт контейнер, и всё, что ты добавила через кнопки (блогеры, история, стиль), пропадает.

1. В проекте нажми **+ Create** (или правой кнопкой по пустому полю) → **Volume**.
2. Привяжи к сервису `reels-monitor` → **Mount path**: `/data` → сохранить.
3. Сервис перезапустится. `DATA_DIR=/data` из Variables указывает как раз сюда. При первом старте парсер сам скопирует `bloggers.txt` из кода в `/data`.

### 7.6 Адрес для телефона
1. Сервис → **Settings** → **Networking** → **Generate Domain**. Если спросит порт — `8080`.
2. Получишь адрес вида `reels-monitor-production-xxxx.up.railway.app`. Открой на телефоне, введи пароль.
3. Safari на iPhone: **Поделиться** → **На экран «Домой»** — будет как приложение.

### 7.7 Проверка
- **Deployments** → последний деплой зелёный, в логах `Бот запущен`.
- Написать боту в Telegram `/start` → пришло меню.
- С телефона запустить **Анализ Reels** → появился лист в таблице.
- В **Список блогеров** добавить кого-то, потом `railway up --detach` ещё раз → блогер остался (значит Volume работает).

### 7.8 Как обновлять
Любое изменение кода на маке (например, Майя прислала обновление) → `cd ~/reels-monitor && railway up --detach`. Автодеплоя из GitHub нет — только этой командой.

Фраза для Claude на весь шаг 7:
```
Задеплой парсер на Railway по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 7: railway init
в ~/reels-monitor, railway up --detach. Переменные и Volume я добавлю сама в браузере — скажи, когда
и что именно вставлять, и проверь потом логи через railway logs.
```
Переменные в Railway Claude может добавить и сам командой `railway variables --set "ИМЯ=значение"` — но тогда ему придётся видеть ключи; проще вставить в Raw Editor руками.

---

## 8. Как пользоваться

### 8.1 Кого добавлять в список (20–40 аккаунтов)

Парсер полезен ровно настолько, насколько хорош список. Твоя ниша — четыре направления, ищи по ним:

| Направление | Кого искать | Где искать |
|-------------|-------------|-----------|
| Тело и психосоматика простым языком («шея болит не от подушки», зажимы, подавленные эмоции) | женщины-эксперты, которые объясняют связь тела и эмоций бытовым языком, без медицинского жаргона, говорящая голова в reels, RU и EN | Instagram-поиск по словам «психосоматика», «зажимы в теле», «тело помнит», «somatic healing», «mind body connection»; вкладка Reels у понравившегося аккаунта → похожие |
| Медитации и практики (расслабление лёжа и слушая, йога-нидра — НЕ асаны и не фитнес) | те, кто даёт аудиопрактики, расслабление, практики перед сном; всё, что человек делает лёжа | поиск «медитация для женщин», «расслабление», «йога-нидра», «yoga nidra», «guided relaxation», «practices for sleep» |
| Женское выгорание, «железная леди», нервная система | эксперты про усталость «всё на мне», день сурка, «не могу расслабиться», регуляцию нервной системы простым языком | поиск «выгорание у женщин», «хроническая усталость», «нервная система», «burnout recovery for women», «nervous system regulation» |
| Женские блоги про возвращение к себе (желания, «разреши себе чувствовать», из функции — в живую женщину) | женщины, которые рассказывают свой путь «услышала себя» через личную историю, а не через марафоны | поиск «возвращение к себе», «услышать себя», «разреши себе», «вернуть желания», «reconnect with yourself» |

Критерии — берём, если:
- **Живой**: 3+ reels в неделю. Парсер смотрит только 7 дней — если аккаунт постит раз в месяц, он тратит лимит впустую.
- **Твоего масштаба или чуть выше**: 10–300к подписчиков. У миллионников залетает всё подряд — по их цифрам ничего не поймёшь.
- **Тот же формат**: говорящая голова, текст на экране, сторителлинг под нарезку — то, что ты сама сможешь повторить (голос за кадром без лица — не твой формат, такие аккаунты бери только ради приёмов в хуках).
- **Открытый аккаунт**: закрытые парсер не читает.
- **Речь есть**: для транскрибации нужна речь. Танцы и молчаливые «эстетичные» видео — мимо.

Не берём: бренды, агентства, магазины, аккаунты, где reels — только репосты, и всех, кто постит реже раза в неделю.

Хороший стартовый состав: 10 тело/психосоматика (из них 5 RU), 8–10 медитации и практики, 8 выгорание/нервная система, 5–7 возвращение к себе. Итого 30–35. Раз в месяц пересматривай: кто ни разу не попал в топ за 4 недели — на выход, на его место новый.

Как добавить: на веб-странице **05 Добавить блогеров** → вставь ники, ссылки или @ — через запятую или с новой строки → **Добавить**. Удалить — в **04 Список блогеров** крестик рядом с ником. В Telegram — просто кинуть боту ссылку или @ник.

Фраза для Claude (подбор кандидатов):
```
Прочитай ~/.claude/brand/PROFILE.md. Предложи 30 Instagram-аккаунтов-конкурентов по критериям
из раздела 8.1 гайда ~/alena-setup/parser/PARSER-GUIDE.md: по 4 направлениям, RU и EN, 10–300к подписчиков,
активные в reels. Для каждого: ник, направление, почему подходит. Ники, в которых не уверен, помечай «проверить».
```
(Claude не видит Instagram — это черновик, который ты проверяешь глазами, а не готовый список.)

### 8.2 Как часто запускать

- **Раз в неделю, в один и тот же день** (например, понедельник утром): анализ reels + анализ постов. Парсер смотрит ровно 7 дней назад, поэтому недельный ритм ничего не пропускает.
- Лимит Apify: на бесплатном плане $5/мес. Один анализ reels на 30 аккаунтов ≈ $0,9, анализ постов ≈ $0,4. Четыре недели × $1,3 ≈ $5,2 — впритык. Если лимит кончается: постов — раз в две недели, либо список 25 аккаунтов, либо только reels.
- Разбор по ссылке стоит копейки (Apify ≈ $0,003 + Whisper ≈ $0,01 за ролик).
- Проверить остаток: apify.com → **Billing** → Usage this month.
- Не нажимай кнопку дважды подряд: второй запуск не стартует, пока идёт первый (в интерфейсе будет «Анализ уже идёт»).

### 8.3 Как читать таблицу

Каждый запуск создаёт новый лист (вкладка внизу таблицы): `🎬 Reels 15.09 10:20` или `🖼 Посты 15.09 10:25`. Свежий лист всегда первый слева.

| Колонка | Что это |
|---------|---------|
| Блогер | @ник |
| Тип | Reels / карусель / пост |
| Дата | дата публикации (мск) |
| Комментарии | **главная метрика** — по ней отсортировано, сверху самые обсуждаемые |
| Лайки | для сравнения |
| Ссылка | открыть в Instagram |

Почему комментарии, а не просмотры: просмотры Apify не отдаёт стабильно, а комментарии — самый честный признак, что ролик зацепил (люди спорят, спрашивают, делятся). Ролик с 50 комментариями у аккаунта на 20к — это залётный, даже если у соседа с 500к лайков больше.

На что смотреть в топ-10: **что за приём** — вопрос-переворот, «непопулярное мнение», «3 ошибки», история «было/стало», спор с установкой. Это ты и будешь адаптировать, а не тему дословно.

В веб-версии тот же список показывается под кнопкой анализа и в **03 История запросов** (последние 50 запусков хранятся на сервере, даже если таблицу почистила).

### 8.4 «Взять в работу»

1. Под результатами анализа (или в **История** → **Показать ролики**) у каждого ролика есть галочка. Отметь 3–5 самых интересных.
2. Кнопка **Взять в работу (N)** → парсер создаёт лист `🎯 В работе 15.09 10:40` и запускает транскрибацию в фоне. Внизу статус «транскрибирую 2/5».
3. В листе появляются ещё две колонки: **Транскрибация** (только для reels; пока идёт — ⏳; «(без речи)» — если в ролике нет голоса) и **Подпись** (для всех).
4. Через 1–3 минуты всё заполнено. Лист можно переименовать под тему недели — он не удалится.

Если в колонке ⚠️ и текст ошибки — раздел 10.

### 8.5 Разбор по ссылке

Увидела залётный ролик сама (в ленте, у подруги, в сохранёнках) — не надо добавлять автора в список:
1. Instagram → под роликом **Поделиться** → **Копировать ссылку**.
2. Веб-страница → **02 Разбор по ссылке** → вставить → **Транскрибировать**.
3. Через 30–90 секунд: **Транскрибация** и **Подпись**, у каждой кнопка **Скопировать**.

Работает с ссылками вида `instagram.com/reel/...`, `instagram.com/p/...`. Для карусели вернёт только подпись (текст со слайдов парсер не читает — Майя это отключила за качество).

### 8.6 Из транскрибации в свой сценарий

Открой Claude Code (`claude` в Терминале) и напиши:
```
/reels-expert

Режим 1 — адаптация залётного ролика.
Тема под меня: [о чём хочу — например, «почему твои визуализации не работают, пока тело зажато»]
Мой оффер в конце: [например, «забери аудиопрактики „Отпусти тело“ — ссылка в шапке»]

ЗАЛЁТНЫЙ РОЛИК:
[вставь транскрибацию]

Подпись оригинала:
[вставь подпись, если есть]
```
Скилл сам прочитает твой профиль и голос, сохранит приём оригинала (хук, структуру, ритм) и перепишет под твою нишу и твой оффер. На выходе — сценарий под суфлёр на 40–60 секунд. Если скилл называется у тебя иначе (`/reels-script`) — фраза та же.

Правило: адаптируем приём, а не переписываем чужой текст. Ролик должен быть твоим — про тело, расслабление, исполнение желаний, твою историю. И две проверки на выходе: не звучит ли обещание как «делать телом что-то физическое» (ты НЕ тренер, всё лёжа и слушая) и нет ли медицинских обещаний («вылечу», «уберу боль»).

---

## 9. Все фразы для Claude в одном месте

Перед каждой фразой Claude полезно сказать: «Прочитай гайд `~/alena-setup/parser/PARSER-GUIDE.md`, потом делай». Секреты (токены, ключи) в чат не вставляй — он читает их из `.env` сам.

| Что нужно | Фраза |
|-----------|-------|
| Проверить мак | `Проверь мой мак по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 3, ничего не устанавливай, только скажи, чего нет` |
| Установить код | `Установи парсер по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 4` |
| Заполнить .env | `Заполни ~/reels-monitor/.env из ~/Documents/ключи-парсера.txt по шаблону env.example, ключи в ответе не показывай` |
| Патч (если нужен) | `Примени патч из раздела 2 файла ~/alena-setup/parser/CHANGES-FOR-ALENA.md к ~/reels-monitor` |
| Запустить локально | `Запусти парсер по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 6.1, и проверь, что страница отвечает` |
| Остановить локально | `Останови uvicorn парсера` |
| Деплой на Railway | `Задеплой парсер по гайду ~/alena-setup/parser/PARSER-GUIDE.md, шаг 7, переменные я вставлю сама` |
| Обновить на Railway | `Выполни railway up --detach в ~/reels-monitor и покажи, что деплой прошёл` |
| Список конкурентов | `Предложи 30 аккаунтов-конкурентов по разделу 8.1 гайда ~/alena-setup/parser/PARSER-GUIDE.md` |
| Проверить лимит Apify | `Проверь остаток лимита Apify через api.apify.com/v2/users/me/limits с токеном из ~/reels-monitor/.env, токен не показывай` |
| Что-то сломалось | `Парсер выдал ошибку: «[вставь текст]». Найди причину по разделу 10 гайда ~/alena-setup/parser/PARSER-GUIDE.md и скажи, что делать` |
| Логи Railway | `Покажи последние 100 строк railway logs для reels-monitor и объясни, есть ли ошибки` |
| Сценарий из транскрибации | `/reels-expert` + шаблон из 8.6 |

---

## 10. Если что-то сломалось

Первым делом — три лимита: Apify (Billing), OpenAI (Billing), Railway (Usage). В 80 % случаев дело в них.

| Симптом | Причина | Что сделать |
|---------|---------|-------------|
| «Ошибка Apify: ... monthly usage hard limit exceeded» / «insufficient credit» | кончились $5 бесплатного лимита Apify | ждать даты обновления (apify.com → Billing) или сократить список до 25 и запускать посты реже. Разбор по ссылке тоже не будет работать до обновления |
| «Ошибка Apify: ... 401 / invalid token» | опечатка в `APIFY_API_TOKEN` | скопировать токен заново из apify.com → Settings → API & Integrations, заменить в `.env` / Railway Variables, перезапустить |
| «Apify не ответил вовремя» (бот) / анализ висит 5+ минут | Instagram тормозит или слишком длинный список | подождать 10 минут, запустить снова; если повторяется — уменьшить список |
| «За последние 7 дней свежих Reels не нашлось» | аккаунты неактивны, или ники с ошибкой, или закрытые | проверить список: открыть 2–3 аккаунта руками. Ники — без `@` и без пробелов |
| «Список блогеров пуст» | `bloggers.txt` пустой | добавить ники в разделе 05 или в файл |
| «Whisper вернул ошибку 429 ... insufficient_quota» | закончился баланс OpenAI | platform.openai.com → Billing → Add to credit balance |
| «Whisper вернул ошибку 401» | неправильный `OPENAI_API_KEY` | создать новый ключ, заменить |
| «Для транскрибации нужен ключ OpenAI» | переменная `OPENAI_API_KEY` пустая | заполнить `.env` / Railway Variables |
| «Не получилось распознать звук — похоже, в этом ролике нет речи» | музыка без голоса или звук недоступен | это не поломка. Взять другой ролик |
| «Видео слишком длинное для транскрибации (больше 24 МБ)» | нет ffmpeg и ролик длинный | поставить ffmpeg (шаг 4.3) — на Railway он уже есть |
| Telegram-бот молчит на `/start` | твоего ID нет в `ALLOWED_IDS` (или `TELEGRAM_CHAT_ID` неверный) | проверить ID через @userinfobot; если патч применён — поправить `TELEGRAM_CHAT_ID`/`TELEGRAM_ALLOWED_IDS`; если нет — `bot.py`, строка 30. Перезапустить |
| Бот молчит, в логах `Conflict: terminated by other getUpdates request` | бот запущен в двух местах сразу (мак + Railway) | остановить один из них (на маке Ctrl+C) |
| Бот молчит, в логах `Unauthorized` / `InvalidToken` | токен бота неверный | @BotFather → `/mybots` → бот → API Token → скопировать заново |
| «Не удалось записать в Google таблицу: 403 ... PERMISSION_DENIED» | служебному аккаунту не дали доступ к таблице | таблица → Настройки доступа → добавить почту `...@...iam.gserviceaccount.com` как Редактора |
| «... 404 ... Requested entity was not found» (таблица) | неверный `GOOGLE_SHEET_ID` | скопировать ID из адреса таблицы заново (между `/d/` и `/edit`) |
| «... 403 ... Google Sheets API has not been used in project ... before or it is disabled» | не включён Sheets API | console.cloud.google.com → APIs & Services → Library → Google Sheets API → Enable |
| `FileNotFoundError: google_creds.json` | файла нет рядом с кодом (мак) или пустая `GOOGLE_CREDS_JSON` (Railway) | положить файл в `~/reels-monitor/` / вставить содержимое в переменную |
| Результаты в таблице есть, а анализ пишет «⚠️ Не удалось записать» | лист с таким именем уже существует и заблокирован, или таблица защищена | снять защиту листов; или просто запустить ещё раз через минуту (имя листа содержит время) |
| После деплоя на Railway список блогеров снова стартовый, история пустая | нет Volume или `DATA_DIR` не `/data` | шаг 7.5: создать Volume с mount path `/data`, проверить переменную `DATA_DIR=/data` |
| Railway: деплой красный, в логах `KeyError: 'TELEGRAM_BOT_TOKEN'` (или другой ключ) | не заполнена переменная | Variables → добавить → Deploy |
| Railway: страница не открывается | нет домена / сервис упал | Settings → Networking → Generate Domain; Deployments → смотреть лог |
| Railway: «Trial ended» / сервис остановлен | закончился trial | Account → Plans → Hobby |
| Веб-страница: «Неверный пароль» | другой `WEB_PASSWORD` на маке и на Railway | посмотреть переменную там, где запущен парсер. Если пусто — пароль `kirill` |
| Веб-страница: кнопки не реагируют, «Загружаю...» навсегда | старый пароль сохранился в браузере | обновить страницу, войти заново |
| На маке: `ModuleNotFoundError` | забыла `venv` | команды запускать как `./venv/bin/python ...` или после `source venv/bin/activate` |
| На маке: `python3.12: command not found` | Python не установлен с python.org | шаг 3 |
| На маке: `Address already in use` (порт 8123) | парсер уже запущен в другом окне | закрыть то окно (Ctrl+C) или взять другой порт `--port 8124` |
| В листе «В работе» колонка «Транскрибация» осталась ⏳ | фоновая задача упала (лимит OpenAI/Apify) или сервер перезапустился | смотреть логи; запустить «Взять в работу» ещё раз для этих роликов |

Не нашла свой случай — скопируй текст ошибки и отдай Claude фразой из раздела 9.

---

## 11. Безопасность

- **Все ключи — только твои.** Не проси у Майи её токены и не давай свои. Один ключ = один человек, иначе списания и лимиты перемешаются.
- **Никому не отправляй `.env` и `google_creds.json`**: ни в Telegram, ни в чат с Claude, ни в скриншотах. Если случайно отправила — ключ считай сгоревшим: удали его в сервисе (Apify → токен → Delete; OpenAI → API keys → Revoke; BotFather → `/revoke`) и создай новый.
- **`.env` и `google_creds.json` не попадают в git** — они в `.gitignore`. Перед любым `git push` проверь: `cd ~/reels-monitor && git status` — этих файлов в списке быть не должно. Если видишь — стоп, зови Claude: `В ~/reels-monitor .env попал в git status — убери его из индекса, не удаляя файл`.
- **Репозиторий — приватный.** GitHub → репо → Settings → внизу Danger Zone → должно быть `Private`.
- **Пароль веб-страницы** — свой, не `kirill`. Адрес Railway никому не давай: страница видна всем, у кого есть адрес и пароль.
- **Claude не нужно показывать ключи**: он читает их из файла сам. Если Claude в ответе вдруг напечатал ключ — попроси его не делать так и не пересылай ответ никому.
- Файл с заметкой «ключи-парсера.txt» после установки удали или храни в менеджере паролей.

---

## 12. Шпаргалка

```
Папка с кодом            ~/reels-monitor
Ключи                    ~/reels-monitor/.env            (шаблон: env.example)
Доступ к таблице         ~/reels-monitor/google_creds.json
Список конкурентов       ~/reels-monitor/bloggers.txt    (на Railway — /data/bloggers.txt)
Голос                    раздел «06 Мой стиль» на странице (файл voice.txt)

Запуск на маке (веб)     cd ~/reels-monitor && source venv/bin/activate && python -m uvicorn web:app --port 8123
                         → http://localhost:8123
Запуск на маке (бот+веб) cd ~/reels-monitor && source venv/bin/activate && python bot.py
Остановить               Ctrl+C

Railway: обновить        cd ~/reels-monitor && railway up --detach
Railway: логи            railway logs
Railway: переменные      railway.com → проект → сервис → Variables
Railway: обязательно     DATA_DIR=/data + Volume с mount path /data

Ритм                     раз в неделю: Анализ Reels → Анализ постов → галочки → Взять в работу
                         → транскрибация → /reels-expert режим 1 → свой сценарий
Лимиты                   Apify $5/мес (Billing) · OpenAI баланс (Billing) · Railway $5/мес (Usage)
```
