Files
portal/docs/superpowers/2026-07-07-spark-ad-scan-RUNBOOK.md
T
Дмитрий a877785247 feat(ad-scan): волна 3 «лист обзвона» + классификатор телефонов Россвязи
- rossvyaz.py: тип/оператор/регион/часовой пояс по реестру Россвязи (бесплатно, офлайн);
  детект «виртуальный (переадресация)» — городской на мобильном операторе/вирт.АТС.
- wave3.py: зацепка, приоритет, личные почты и мессенджеры с сайта, лист «Памятка менеджеру».
- phones_rossvyaz.py: разбор телефонов рекламодателей, «есть прямой канал».
Файлы реестра Россвязи и локальный тест — вне git. Рунбук обновлён.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 05:11:19 +03:00

111 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Рунбук: «Кто из фирм платит за рекламу» из выгрузки Спарка
**Что это.** Регулярная задача: заказчик даёт выгрузку из Спарка (юрлица с
сайтами/телефонами) — робот по каждой фирме определяет, **платит ли она за
рекламу и где** (Яндекс.Директ, коллтрекинг, соцпиксели), с **вилкой бюджета** и
всеми реквизитами. Заказчик делает приёмку и работает с готовым файлом.
**Робот:** `моя/ad-scan/run_spark.py`. Код в git; данные, результаты и токен — вне git.
---
## Как запускать (одна команда)
```bash
cd "c:/моя/проекты/портал crm/Документация/моя/ad-scan"
python -u run_spark.py "<путь к спарк.xlsx>" "<тег>"
# пример:
python -u run_spark.py "../СПАРК_клиники_МСК.xlsx" "клиники-мск"
```
- `<тег>` — короткое имя для файлов результата.
- Прогон длинный (сотни фирм = 15–40 мин): запускать **в фоне**, прогресс
печатается каждые 50 фирм, файл сохраняется чекпоинтами каждые 200 (потерь нет).
**Результат**`моя/результат/`):
- `<тег>-реклама-ФИНАЛ.xlsx` — таблица, рекламодатели сверху.
- `<тег>-реклама-СВОДКА.txt` — цифры для приёмки.
---
## Что нужно на входе
1. **Спарк-выгрузка** `.xlsx` со стандартными колонками (заголовки в строке 4):
№ · Наименование · Рег.номер(ОГРН) · Адрес · Руководство · Должность ·
Руководство-ИНН · Телефон · Email · Сайт · Совладельцы · Вид деятельности.
Если структура другая — сначала поправить индексы в `adscan/extract.py`.
2. **Токен Keys.so** в `моя/ad-scan/secrets/keyso_token.txt` (тариф с API —
«Профессиональный», ~9 300 ₽/мес). Токен НЕ коммитить (в `.gitignore`).
---
## Колонки результата
№ · Наименование · Домен · Телефон · **Рекламируется платно** · Коллтрекинг ·
Пиксели · **Директ** · Ключей Директ · База(город) · **Бюджет от** · **Бюджет до** ·
Доказательства · ОГРН · ФИО директора · ИНН директора · Адрес · Email · Совладельцы.
---
## Как это считается (чтобы принимать осознанно)
- **Рекламируется платно = да**, если нашли Директ **или** коллтрекинг
(Calltouch/Comagic/Callibri/Roistat/Mango) **или** рекламный пиксель
(VK-myTarget/Google Ads/Meta) на сайте.
- **Директ** берётся из Keys.so по **двум базам сразу — Москва и родной город**
фирмы (город из адреса), объединением: «да», если крутит хоть в одной.
- **Бюджет — вилка «от–до»**: от средней оценки Keys.so до максимума. Это
**оценка модели, не факт из кассы**; годится для ранжирования, не для рубля.
- **Дубли** по домену и **агрегаторы** (vk.com, yell.ru, prodoctorov, 2gis,
banki.ru и т.п.) — исключаются.
## Приёмка — на что смотреть
- `СВОДКА.txt`: доля «рекламируется», число Директ, вилка бюджета, **медиана**
(реальный масштаб) и **ТОП-4 выброса** (несколько крупных сетей раздувают сумму).
- «Не проверено» — у фирм, чей сайт не открылся; их реклама не оценена.
## Известные ограничения
- Keys.so нет базы «вся Россия» — города вне ~20 поддерживаемых уходят в `msk`
(список баз в `adscan/regions.py`). Такие фирмы могут быть недосчитаны.
- Первый запрос к региону Keys.so «прогревается» (HTTP 202) — отсюда время.
- «ИНН фирмы» в выгрузке Спарка нет — есть ОГРН (по нему при желании ИНН
тянется через DaData отдельным шагом).
- Коллтрекинг/пиксели, подгружаемые через диспетчер тегов, скан не видит —
число «рекламируется» это занижает (нижняя граница, не потолок).
## Волна 3 — «лист обзвона» для менеджера (после run_spark)
Обогащает **рекламодателей** в готовом файле. Всё бесплатно (сайты + Россвязь).
```bash
python wave3.py "../результат/<тег>-реклама-ФИНАЛ.xlsx" # почты+мессенджеры+зацепка+приоритет+лист «Памятка менеджеру»
python phones_rossvyaz.py "../результат/<тег>-реклама-ФИНАЛ.xlsx" # разбор телефонов
```
Добавляет колонки: Зацепка для звонка · Приоритет (A/B/C) · Личные почты (сайт) ·
Мессенджеры (сайт) · **Телефоны (разбор)** · **Есть прямой канал** · Часовой пояс.
Плюс лист **«Памятка менеджеру»** — что за сервисы использует клиент + ссылки.
**Телефоны — классификатор Россвязи** (`adscan/rossvyaz.py`, бесплатно, офлайн):
- по каждому номеру — тип, оператор, регион, часовой пояс;
- **«виртуальный (переадресация)»** — городской номер на мобильном операторе
(МТС/Билайн/МегаФон/Т2) или на виртуальной АТС (Манго/CoMagic/Задарма/МТТ):
это подменный номер, дозвон дойдёт до человека, а не до ресепшена;
- «Есть прямой канал» = есть мобильный ИЛИ виртуальный городской.
**Зависимость:** файлы реестра Россвязи в **корне репозитория** (Документация):
`DEF-9xx.csv`, `ABC-3xx.csv`, `ABC-4xx part1.csv`, `ABC-4xx part2.csv`, `ABC-8xx.csv`
(скачиваются с opendata Россвязи; ~40 МБ, в git НЕ хранятся — держать рядом).
Обновлять раз в несколько месяцев с сайта Россвязи.
**DaData для телефонов НЕ нужна** — Россвязь даёт то же (тип/оператор/регион/пояс)
бесплатно. DaData пригодилась бы только для MNP-точности (портированные номера) —
на классификацию моб/город и регион это почти не влияет.
## Уже прогнано (примеры)
- Стоматологии: 1 854 → 456 рекламируется, 238 Директ; волна 3: 268 с прямым каналом.
- Ломбарды/МФО: 638 → 124 рекламируется, 74 Директ.