Files
portal/docs/superpowers/2026-07-07-spark-ad-scan-RUNBOOK.md
T
Дмитрий 78115ead64 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

8.0 KiB

Рунбук: «Кто из фирм платит за рекламу» из выгрузки Спарка

Что это. Регулярная задача: заказчик даёт выгрузку из Спарка (юрлица с сайтами/телефонами) — робот по каждой фирме определяет, платит ли она за рекламу и где (Яндекс.Директ, коллтрекинг, соцпиксели), с вилкой бюджета и всеми реквизитами. Заказчик делает приёмку и работает с готовым файлом.

Робот: моя/ad-scan/run_spark.py. Код в git; данные, результаты и токен — вне git.


Как запускать (одна команда)

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)

Обогащает рекламодателей в готовом файле. Всё бесплатно (сайты + Россвязь).

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 Директ.