Привязать (или ПЕРЕпривязать) WhatsApp к этой машине — единственный шаг, который нельзя сделать за Антона, потому что… Триггеры «/whatsapp-pair», «/wa-pair», «подключи ватсап», «привяжи ватсап», «спарь ватсап», «ватсап отвалился», «ватсап не спарен», «перепривяжи whatsapp», «покажи QR ватсапа», «второй ватсап», «два ватсапа», «ватсап 2 аккаунта», «pair whatsapp», «relink whatsapp»
Installs into .claude/skills of the current project.
Are you the author of Whatsapp Pair?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/tonydzi-whatsapp-pair)
---
name: whatsapp-pair
description: "Привязать (или ПЕРЕпривязать) WhatsApp к этой машине — единственный шаг, который нельзя сделать за Антона, потому что… Триггеры «/whatsapp-pair», «/wa-pair», «подключи ватсап», «привяжи ватсап», «спарь ватсап», «ватсап отвалился», «ватсап не спарен», «перепривяжи whatsapp», «покажи QR ватсапа», «второй ватсап», «два ватсапа», «ватсап 2 аккаунта», «pair whatsapp», «relink whatsapp»"
version: 1.0.0
---
OBJECTIVE: за один заход вернуть WhatsApp из RED в GREEN. Мою часть (мост, QR, страница,
детект, проверка) делаю сам; от Антона нужен ровно один физический жест — поднести телефон
к экрану. Финал = не «страница открылась», а зелёный вердикт независимого пробника.
## Почему скилл вообще есть (замеры, не теория)
- ⚠️ **21.09.2026, замер хаба: `read-only mode` — это НЕ «ватсап отвалился», и перепривязка тут не лечит.** Оба MCP (`mcp__whatsapp__*` и `mcp__whatsapp2__*`) вернули «another process holds the WhatsApp connection» с PID 47960 и 44656 — то есть рельса ЗАНЯТА чужой живой сессией, мост при этом здоров. Чужие PID НЕ убиваем. Прежде чем звать Антона с телефоном, отличи одно от другого: `python ~/.claude/scripts/wa_broker.py --status`.
- ⚠️ **Порт owner-брокера = 8791, а не 8768.** Документированный в старых сидах `127.0.0.1:8768` на хабе закрыт (`Test-NetConnection` → False), а owner слушает на **8791** и отвечает `{"error":"Unauthorized"}` на голый GET; токена в открытых конфигах (`~/.claude/*.json`, `scripts/*.py`) нет, значит HTTP-дверь без токена бесполезна и «порт закрыт» про 8768 — не доказательство смерти рельсы. Проверять надо ОБА порта и называть в отчёте именно поверхность.
- ⚠️ **LEGACY stdio инстансы = лок-война, а не один занявший.** 20.09 их было 2, 21.09 — **34**. Растущий список в `--status` означает, что процессы-сироты плодятся и отбирают лок друг у друга; это отдельный класс поломки (кандидат в reaper), а не повод перепривязывать аккаунт.
- 01.07 → 05.08.2026 мост стоял мёртвым **35 суток**: `auth_info/creds.json` пуст, входящие не
доходили (возможны потерянные лиды). Рецепт починки каждый раз добывался заново — по кускам
из трёх заметок и двух скриптов. Теперь он один и исполняемый.
- Терминальный ASCII-QR на Windows = мозаика, телефон её не берёт (видно в `server.log` живьём).
- QR живёт ~20с. Антон сканировал протухший и получал «check your connection and try again
later» — это НЕ проблема сети, это старый код. Отсюда страница, которая сама берёт свежий.
- Антон не работает в терминале: ему нужно окно, куда просто смотришь.
## Движок (вся логика там, скилл — тонкая обёртка)
`python "$USERPROFILE\.claude\scripts\wa_qr_live.py"` · паспорт: `~/.claude/scripts/docs/wa_qr_live.md`
| команда | что делает |
|---|---|
| `--check` | диагноз без побочек: привязан? среда цела? сколько живых клиентов? |
| (без флагов) | боевой заход: мост + QR + живая страница `http://127.0.0.1:8799` |
| `--selftest` | проверка детали без телефона (гоняется в регресс-сетке) |
| `--heal-patch` | вернуть вендору печать сырого QR (её сносит любой `npm update`) |
| `--force` | погасить чужих whatsapp-клиентов и стартовать всё равно |
| `--account wa2` | работать со ВТОРЫМ аккаунтом (комбинируется с любой командой выше) |
Коды выхода: `0` привязан · `1` таймаут/QR не пришёл · `2` уже привязан · `3` среда не готова
· `4` крэш. Дефолтный таймаут 900с; `--port` если дефолтный занят.
## Два аккаунта на одной машине (с 03.09.2026)
Вендор кладёт ВСЁ состояние (auth_info, store, lock) под `$XDG_DATA_HOME/whatsapp-mcp`,
поэтому второй аккаунт = тот же вендор с другим XDG. Изоляция полная: свой линк, свой лок,
AUTH_KEY_DUPLICATED МЕЖДУ аккаунтами невозможен — блокирует только второй клиент ТОГО ЖЕ
аккаунта (движок различает их по argv-маркеру `--wa-account=<имя>`).
| | main | wa2 |
|---|---|---|
| auth/store | `~\.local\share\whatsapp-mcp\` | `~\.local\share\wa-wa2\whatsapp-mcp\` |
| страница QR | порт 8799, `~\.claude\whatsapp-mcp\` | порт 8809, `~\.claude\whatsapp-mcp-wa2\` |
| MCP-сервер | `whatsapp` | `whatsapp2` (env XDG_DATA_HOME зашит в `.claude.json`) |
| пробник | `wa_probe.py --json` | `XDG_DATA_HOME=$USERPROFILE/.local/share/wa-wa2 python wa_probe.py --json` |
Спаривать оба можно ПАРАЛЛЕЛЬНО: две страницы на двух портах, Антон сканирует каждую
своим телефоном/аккаунтом. Патч QR_RAW один на двоих (общий dist вендора).
## Ход работы
**Шаг 0. Диагноз — до всякой стройки.**
```bash
python "$USERPROFILE\.claude\scripts\wa_qr_live.py" --check
```
- `привязан : ДА` → скан НЕ нужен. Молчание канала при живых кредах — это другая болезнь
(демон/лок/вендор), иди в `wa_probe.py --json` и `wa_broker.py --status`, не гоняй Антона за телефоном.
- `среда : ...патч...` → сперва `--heal-patch`, потом заново. Без патча QR виден только кашей.
- `живых клиентов : N>0` → второй клиент на одном линке даёт **AUTH_KEY_DUPLICATED** и рвёт
привязку у всех. Гаси их (или `--force`), но сперва пойми, кто это: node с живым
родителем-`claude.exe` — легальная сессионная копия, а не зомби.
**Шаг 1. Спроси, телефон в руках?** Коды сгорают по одному каждые 20с, окно 15 минут. Запускать
«на всякий случай» = жечь цикл впустую. Одна строка: «телефон рядом? запускаю».
**Шаг 2. Подними страницу.**
```bash
python "$USERPROFILE\.claude\scripts\wa_qr_live.py"
```
Запускать **в фоне** (`run_in_background`), иначе блокирует сессию на весь скан. Скрипт печатает
адрес страницы. Дальше — обязательно доведи картинку до глаз Антона, а не просто дай URL:
- открой `http://127.0.0.1:8799` в браузере (preview) и **дай скриншот** — канон §2.5 «убедись,
что он видит»;
- назови вслух путь `%USERPROFILE%\.claude\whatsapp-mcp\index.html` — ссылки у Антона не кликаются;
- инструкция на самой странице уже написана (Настройки → Связанные устройства → Привязка устройства).
**Шаг 3. Жди и следи.** Страница сама показывает поколение кода и переключается на «готово».
Со стороны сессии смотри `status.json`: `state=QR` + растущий `generation` = живой цикл;
`generation` не растёт больше минуты = мост встал, смотри `server.log`.
**Шаг 4. Проверь ЧУЖИМ прибором (обязательно).** Свой же скрипт не считается доказательством —
сторож не живёт в том, что сторожит:
```bash
python "$USERPROFILE\.claude\scripts\wa_probe.py" --json
```
`status:"GREEN"` = готово. `RED` с «МОЛЧИТ N суток» сразу после привязки — нормально: креды есть,
а свежих сообщений ещё нет; перепроверь после первого входящего, не объявляй победу заранее.
**Шаг 5. Прибери верстак.** Фоновый процесс сам гасит мост и не оставляет клиентов. Проверь
`--check` → `живых клиентов : 0`. Если привязка удалась — сними задачу
`10-Tasks/task-2026-08-05-wa-qr-relink.md` и пни `connector-health-daily`, чтобы табло позеленело.
## Границы
- **Скан = руки Антона.** Обойти нечем: не пароль из store и не OTP. Если он НЕ у экрана хаба —
это не «жди», а другая рельса: `node "$USERPROFILE\.claude\scripts\wa_pair.mjs" <телефон без +>`
просит у WhatsApp 8-значный код (телефон → Связанные устройства → «Связать по номеру телефона»).
Код доезжает текстом в Telegram, QR — нет. Страница для этой рельсы не нужна.
- **Ничего наружу.** Скилл не шлёт ни одного сообщения в WhatsApp; привязка устройства обратима
(телефон → Связанные устройства → выйти) и не Tier-2.
- **Не чинит доставку.** Спаренный мост ≠ работающая рассылка: тем занимается `wa_broker.py`
(один владелец линка на машину) и связка демонов MCP.
## Грабли, за которые уже платили
1. `npm update` сносит патч `QR_RAW_BEGIN` → QR исчезает молча. `--check` это ловит.
2. `terminate()`/`kill()` на Windows не валит node надёжно → накапливаются клиенты → следующий
заход ловит AUTH_KEY_DUPLICATED. Движок гасит через `taskkill /F /T`.
3. stdio-сервер гасит сам себя, как только закрыт stdin. Движок держит трубу открытой, поэтому
отдельный `keepalive.js` больше не нужен.
4. «Профиль отвечает, чаты видны» ≠ мост жив: это локальный кэш, он врал нам 26 дней.
Доказательство живости = свежесть данных + наличие кредов, и только оно.
Канон: память [[whatsapp-mcp-integration]] (стек, пути, патчи), [[whatsapp-dead-since-july-and-watchdog-lied]]
(почему сторож молчал), [[hub-connectors]]; CLAUDE.md §2.5 (покажи экран), §5.5 (сторож), §5.8 (тест+док+счётчик).
<!--kit-footer-->
---
**Like this skill?** It is one of 100 in [second-brain-starter-kit](https://github.com/tonydzi/second-brain-starter-kit): the second brain we built for ourselves and run every day at Palo Alto AI Research Lab. Install the whole set with `npx skills add tonydzi/second-brain-starter-kit`. Everything is open source and free, so take what you need.
Flagships worth a look on their own: [secondop-panel](https://github.com/tonydzi/secondop-panel) (a second opinion from a panel of external models), [claude-memory-tidy](https://github.com/tonydzi/claude-memory-tidy) (stop your agent's memory from rotting), [telegram-mcp-kit](https://github.com/tonydzi/telegram-mcp-kit) (your own Telegram over MCP in about 15 minutes).
Author: **Anton Dziatkovskii**, Palo Alto AI Research Lab. Telegram [@tonydzi](https://t.me/tonydzi) - WhatsApp [+1 341 222 9178](https://wa.me/13412229178) - X [@Tony_Stef_](https://x.com/Tony_Stef_)
**Engineers: want to test-drive this setup?** Message me. I hand out free starter seeds to engineers who test and report back, and custom skill requests are welcome.