[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MJSZX2GC3NCFD1AG6H5FY5":3,"skill-same:01M6MJSZX2GC3NCFD1AG6H5FY5":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":41,"ownerHtmlUrl":42,"ownerBlogUrl":43,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M6MJSZX2GC3NCFD1AG6H5FY5","xmlriver-serp-research",null,"Сбор органической и рекламной выдачи Яндекса и Google и частотностей Wordstat через XMLRiver — альтернатива Yandex Cloud (Search API и Wordstat v2), когда облака нет или нужен второй путь. Платно: потолок стоимости, журнал, сырые ответы с SHA-256, повтор без повторной оплаты.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1559,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[24,25,26,27,28,29,30],"research","xmlriver serp research","google","search","cloud","sha-256","api","2026-11-10 10:12:30",false,"---\nname: xmlriver-serp-research\ndescription: \"Сбор органической и рекламной выдачи Яндекса и Google и частотностей Wordstat через XMLRiver — альтернатива Yandex Cloud (Search API и Wordstat v2), когда облака нет или нужен второй путь. Платно: потолок стоимости, журнал, сырые ответы с SHA-256, повтор без повторной оплаты.\"\n---\n\n# XMLRiver: выдача поиска и Wordstat\n\nНавык собирает исходные данные. Он не выбирает ключи, не оценивает коммерческий смысл, не меняет кампании и не заменяет рекламный кабинет. Порядок работы с Директом задаёт [единый навык](..\u002Fyandex-direct-unified\u002FSKILL.md); методы официального Wordstat описаны в [справочнике Wordstat](..\u002Fyandex-wordstat\u002FSKILL.md).\n\n## Когда использовать\n\nXMLRiver — равноправная альтернатива Yandex Cloud, а не его замена. Выбирайте:\n\n- **Yandex Cloud** (Search API, Wordstat v2) — если у вас есть ключ и каталог облака: это официальные интерфейсы Яндекса;\n- **XMLRiver** — если облака нет, квоты официального Wordstat (10 запросов в секунду, 100 в час) не хватает на объём задачи или нужна выдача Google.\n\nXMLRiver — сторонний платный сервис. Он разбирает живую выдачу и интерфейс Wordstat, это не официальный API Яндекса и не Google. Условия использования у вас свои; решение о платном расходе принимает пользователь.\n\nСборщики модуля выбирают путь сами: `--provider yandex-cloud`, `--provider xmlriver` или `auto` (по умолчанию). В режиме `auto` путь выбирается по переменным окружения: берётся тот, для которого задан доступ (облако — `YANDEX_SEARCH_API_KEY`, `YANDEX_SEARCH_IAM_TOKEN` или `YANDEX_WORDSTAT_API_KEY`, XMLRiver — `XMLRIVER_USER` и `XMLRIVER_KEY`). Если заданы оба, не задан ни один или передан файл доступа (`--credentials-file`, `--config`), скрипт остановится и попросит указать `--provider` явно: молча переключаться между платными путями нельзя.\n\n## Что нужно заранее\n\n1. Свой аккаунт XMLRiver с положительным балансом. В личном кабинете, раздел «Настройки сбора», задайте параметры сбора: без этого ссылка сбора может быть недоступна. Если в кабинете включён доступ по IP, добавьте свой адрес, иначе будет ошибка 45.\n2. Доступ в переменных окружения процесса: `XMLRIVER_USER` и `XMLRIVER_KEY` (допустим старый синоним `XMLRIVER_USER_ID`) либо закрытый файл с правами `0600` через `--credentials-file`. Ключ не передавать аргументом, не печатать, не сохранять в журналах, отчётах, таблицах и выгрузках.\n3. Папка запуска вне репозитория. В ней появятся журнал, сырые ответы и таблицы.\n\nДля первого знакомства в наборе есть общий демо-доступ: флаг `--use-demo-key`. Его баланс общий для всех пользователей и ограничен, скрипт ставит с ним потолок 2 руб. за запуск. Для работы заведите свой аккаунт: демо может закончиться в любой момент.\n\n## До платных запросов\n\n1. Выполните `info`: баланс, цена за 1000 запросов, число потоков, доступность систем. Не считайте старые цены и лимиты действующими.\n2. Подготовьте задания: запрос × регион × система × страница. Выдача Яндекса — регион Яндекса (`region_id`, справочник «Регионы для загрузки фидов» в документации Яндекса); Google — страна, при необходимости местоположение и код языка из справочников XMLRiver (`geo.csv`, `countries.xlsx`, `langs.xlsx`, `domains.xlsx`).\n3. Выполните `plan` (без сети): число заданий, оценка стоимости, SHA-256 плана. Новый крупный платный пакет покажите пользователю, если разрешение на расход не дано.\n4. Не добавляйте платные опции (`--ai`) без необходимости: надбавку `get_info` не показывает. Для `collect --ai` обязательно `--ai-price-per-1000` — надбавка по вашему тарифу, она входит в оценку и потолок; с демо-доступом `--ai` запрещён.\n\n## Сбор\n\nКоманды выполняются из каталога навыка (рядом с этим файлом лежит `scripts\u002Fxmlriver_collect.py`).\n\n    python3 scripts\u002Fxmlriver_collect.py info\n    python3 scripts\u002Fxmlriver_collect.py plan    --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on\n    python3 scripts\u002Fxmlriver_collect.py collect --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on \\\n        --approve-plan-sha256 \u003CSHA из plan> --max-cost-rub \u003Cпотолок> --probe 3\n    python3 scripts\u002Fxmlriver_collect.py export  --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on\n\nФайл заданий выдачи — TSV в формате `serp-job-template.tsv` единого порядка: `job_id`, `search_query`, `region_id`, необязательные `page`, `engine`, `device`, `enabled`, `layer`, `purpose`, `search_region`, `notes`, `google_country`, `google_lang`, `google_loc`, `google_domain`. Один и тот же файл подходит и сборщику Yandex Cloud: лишние колонки не мешают.\n\n- Перед сетевым вызовом задание записывается в журнал. Каждый ответ сохраняется отдельным файлом с SHA-256 и квитанцией; значения доступа в сохранённом ответе заменяются на `[REDACTED]`.\n- Повторный запуск того же плана не отправляет успешные задания снова. Код 15 («результатов нет») — состояние `empty`, не ошибка и не повторяется.\n- Временные ошибки `101`, `110`, `111`, `500` повторяются отдельным запуском `--retry-errors` (по умолчанию только эти коды; `--only-codes` сужает список). Прежние попытки сохраняются.\n- Задание с неизвестным исходом (`inflight`: обрыв, таймаут) автоматически не отправляется повторно — запрос мог быть оплачен. Посмотрите команду `inflight`; снять задание можно только с `--acknowledge-possible-charge`.\n- `31`, `42`, `45` (доступ), `115` (слишком много параллельных запросов, блокировка на 10 минут), `200` (нет денег) и HTTP 429 останавливают пакет. Параллельность держите ниже лимита потоков из `info`. Два `collect` в одном каталоге одновременно запустить нельзя: второй останавливается до сети, а каждое задание захватывается атомарно, поэтому один запрос не оплачивается дважды. `new_requests` в итоге — число фактически отправленных запросов.\n\n## Особенности систем\n\n- **Яндекс**: страницы с нуля, `groupby=10`, регион числом, `domain=ru`, `lang=ru`. Позиция считается только среди результатов `contenttype=organic`. Для второй и следующих страниц абсолютная позиция (`abs_rank_state=verified`) ставится лишь при непрерывной цепочке успешных страниц от нулевой, 10 органических результатов на каждой предыдущей, без пересечений адресов и без смены исправленного запроса. Иначе позиция «не доказана»: номер страницы × 10 ранг не доказывает.\n- **Google**: страницы с единицы (скрипт принимает номер с нуля и сам прибавляет единицу), страна и язык из справочников. Местоположение `loc` для крупных городов бывало источником устойчивой ошибки 500 — проверьте пробой, при ошибке работайте на уровне страны.\n- Одинаково названные параметры различаются: `lr` у Яндекса — регион числом, у Google — язык кодом; `domain` у Яндекса — строка, у Google — числовой идентификатор.\n\n## Реклама\n\n- Яндекс: `--ads on` добавляет рекламные блоки (`y_topads`, `y_bottomads`; правый блок — `--yandex-right-ads`).\n- Google: документация XMLRiver обещает рекламные блоки, но в проверках автора набора (сентябрь–октябрь 2026, в том числе проба 23.10.2026) Google рекламу не возвращал. Перед пакетом сделайте одиночную пробу на заведомо коммерческом запросе; пустой результат не доказывает отсутствие рекламы конкурентов.\n- Число объявлений в снимке — не охват рынка. Ноль объявлений в ответе не означает, что рекламы нет в другом месте и в другой момент. Пустые поля сначала проверьте на разборе, потом делайте выводы.\n- Сохраняются исходные поля объявления: `url` (отображаемый адрес), `adsurl` (рекламный переход Google), заголовок, текст, быстрые ссылки. Конечная страница не подменяется догадкой: `landing-unresolved`, пока она не подтверждена отдельной проверкой. По рекламным ссылкам скрипт не переходит.\n- Заголовок или текст может содержать процентно кодированные теги выделения (`%3Cb%3E`). В сырых полях они сохраняются; для чтения есть отдельные колонки `title_clean` и `snippet_clean`.\n\n## Wordstat через XMLRiver\n\n    python3 scripts\u002Fxmlriver_collect.py plan    --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history\n    python3 scripts\u002Fxmlriver_collect.py collect --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history \\\n        --approve-plan-sha256 \u003CSHA> --max-cost-rub \u003Cпотолок>\n    python3 scripts\u002Fxmlriver_collect.py export  --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history\n\n- Лимита «100 запросов в час» нет; лимит — число потоков аккаунта и ошибки `110`\u002F`115`. Лимиты официального API на XMLRiver не переносятся, и наоборот.\n- Каждая маска стоит два платных запроса: `words` (популярные и похожие запросы) и `history` (динамика и общее число). В пробе 23.10.2026 страница `words` вернула до 759 строк на маску.\n- Схема ответа другая: `popular` и `associations` (числа строками, в тексте операторы `+`). Общее число по маске даёт только `history` (`totalValue`, за предыдущий месяц). `export` пишет в `RUN\u002Fraw_bundle\u002F` файлы `top_requests_*.json` и `dynamics_*.json` и `_manifest.json` в формате облачного сборщика; отчёты волны, спроса и сезонности находят файлы через манифест. При нескольких регионах у каждого свой каталог `raw_bundle\u002Fregion_\u003Cномер>\u002F`, чтобы отчёт волны не смешивал регионы. Повторный `export` пересобирает каталог целиком. Строка с неверной частотностью не теряется молча: файл помечается `partial` в манифесте, строка уходит в `wordstat_row_errors.tsv`, а команда завершается кодом 2. Даты динамики — по московскому времени. Ответ без ожидаемых полей (`popular` или `graph`) считается ошибкой, а не успехом. Если `history` не собирали, `totalCount` в файле отсутствует, а не равен нулю.\n- Нет аналога дерева регионов и распределения по регионам: регион передаётся одним числом, для нескольких регионов создаются отдельные задания.\n- Числа XMLRiver и официального Wordstat не складывать и не сравнивать без пометки источника: это разные продукты (`provider` в каждом файле).\n- Интервалы динамики: `month` — не менее 3 полных месяцев, `week` — не менее 3 недель с понедельника по воскресенье, `day` — не менее 3 дней, конечный день не сегодня. Скрипт проверяет это до запроса; по умолчанию берёт 6 последних завершённых месяцев.\n\n## Разбор и выводы\n\n- Органика (`serp_results.tsv`, колонки как у сборщика Yandex Cloud), колдунщики (`feature_rows.tsv`) и реклама (`ad_rows.tsv`) выгружаются отдельно. Если в плане обе системы, таблицы пишутся по одной на систему (`serp_results_yandex.tsv`, `serp_results_google.tsv` и т. д.): прежние отчёты группируют только по запросу и региону и смешали бы Яндекс с Google. Регион в таблице — фактически использованный (для Яндекса по умолчанию 225). В каждой строке: исходный запрос и задание, регион, система, устройство, время ответа, положение, путь к сырому файлу и его SHA-256.\n- Различайте «блока нет в ответе», «поля нет», «ответ с ошибкой» и «задание не выполнено». Статистику покрытия считайте по успешным заданиям и показывайте пропуски, ошибки, период и географию.\n- Выводы вида «конкурентов в рекламе нет» по разовому снимку запрещены.\n- Смысловая обработка частотностей и ключей — дальше по [единому навыку](..\u002Fyandex-direct-unified\u002FSKILL.md); здесь автоматический отбор не выполняется.\n\n## Проверка перед сдачей\n\n1. Повторный `collect` по тому же плану даёт ноль новых запросов.\n2. `export` строит таблицы только из сохранённых ответов, без сети; контрольные суммы совпадают.\n3. Число заданий по состояниям (`success`, `empty`, `error`, `inflight`, `pending`) сходится с планом; расход и баланс до и после записаны (разница общего баланса может включать чужие запросы на том же аккаунте).\n4. В отчёте нет ключей, полных адресов запросов и клиентских данных.\n5. Расход на XMLRiver указан отдельно от расходов Yandex Cloud ([контроль расходов облака](..\u002Fyandex-cloud-search-cost-control\u002FSKILL.md) относится только к Yandex Cloud).\n","# XMLRiver: выдача поиска и Wordstat\n\nНавык собирает исходные данные. Он не выбирает ключи, не оценивает коммерческий смысл, не меняет кампании и не заменяет рекламный кабинет. Порядок работы с Директом задаёт [единый навык](..\u002Fyandex-direct-unified\u002FSKILL.md); методы официального Wordstat описаны в [справочнике Wordstat](..\u002Fyandex-wordstat\u002FSKILL.md).\n\n## Когда использовать\n\nXMLRiver — равноправная альтернатива Yandex Cloud, а не его замена. Выбирайте:\n\n- **Yandex Cloud** (Search API, Wordstat v2) — если у вас есть ключ и каталог облака: это официальные интерфейсы Яндекса;\n- **XMLRiver** — если облака нет, квоты официального Wordstat (10 запросов в секунду, 100 в час) не хватает на объём задачи или нужна выдача Google.\n\nXMLRiver — сторонний платный сервис. Он разбирает живую выдачу и интерфейс Wordstat, это не официальный API Яндекса и не Google. Условия использования у вас свои; решение о платном расходе принимает пользователь.\n\nСборщики модуля выбирают путь сами: `--provider yandex-cloud`, `--provider xmlriver` или `auto` (по умолчанию). В режиме `auto` путь выбирается по переменным окружения: берётся тот, для которого задан доступ (облако — `YANDEX_SEARCH_API_KEY`, `YANDEX_SEARCH_IAM_TOKEN` или `YANDEX_WORDSTAT_API_KEY`, XMLRiver — `XMLRIVER_USER` и `XMLRIVER_KEY`). Если заданы оба, не задан ни один или передан файл доступа (`--credentials-file`, `--config`), скрипт остановится и попросит указать `--provider` явно: молча переключаться между платными путями нельзя.\n\n## Что нужно заранее\n\n1. Свой аккаунт XMLRiver с положительным балансом. В личном кабинете, раздел «Настройки сбора», задайте параметры сбора: без этого ссылка сбора может быть недоступна. Если в кабинете включён доступ по IP, добавьте свой адрес, иначе будет ошибка 45.\n2. Доступ в переменных окружения процесса: `XMLRIVER_USER` и `XMLRIVER_KEY` (допустим старый синоним `XMLRIVER_USER_ID`) либо закрытый файл с правами `0600` через `--credentials-file`. Ключ не передавать аргументом, не печатать, не сохранять в журналах, отчётах, таблицах и выгрузках.\n3. Папка запуска вне репозитория. В ней появятся журнал, сырые ответы и таблицы.\n\nДля первого знакомства в наборе есть общий демо-доступ: флаг `--use-demo-key`. Его баланс общий для всех пользователей и ограничен, скрипт ставит с ним потолок 2 руб. за запуск. Для работы заведите свой аккаунт: демо может закончиться в любой момент.\n\n## До платных запросов\n\n1. Выполните `info`: баланс, цена за 1000 запросов, число потоков, доступность систем. Не считайте старые цены и лимиты действующими.\n2. Подготовьте задания: запрос × регион × система × страница. Выдача Яндекса — регион Яндекса (`region_id`, справочник «Регионы для загрузки фидов» в документации Яндекса); Google — страна, при необходимости местоположение и код языка из справочников XMLRiver (`geo.csv`, `countries.xlsx`, `langs.xlsx`, `domains.xlsx`).\n3. Выполните `plan` (без сети): число заданий, оценка стоимости, SHA-256 плана. Новый крупный платный пакет покажите пользователю, если разрешение на расход не дано.\n4. Не добавляйте платные опции (`--ai`) без необходимости: надбавку `get_info` не показывает. Для `collect --ai` обязательно `--ai-price-per-1000` — надбавка по вашему тарифу, она входит в оценку и потолок; с демо-доступом `--ai` запрещён.\n\n## Сбор\n\nКоманды выполняются из каталога навыка (рядом с этим файлом лежит `scripts\u002Fxmlriver_collect.py`).\n\n    python3 scripts\u002Fxmlriver_collect.py info\n    python3 scripts\u002Fxmlriver_collect.py plan    --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on\n    python3 scripts\u002Fxmlriver_collect.py collect --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on \\\n        --approve-plan-sha256 \u003CSHA из plan> --max-cost-rub \u003Cпотолок> --probe 3\n    python3 scripts\u002Fxmlriver_collect.py export  --kind serp --jobs-file jobs.tsv --output-dir RUN --engine yandex --ads on\n\nФайл заданий выдачи — TSV в формате `serp-job-template.tsv` единого порядка: `job_id`, `search_query`, `region_id`, необязательные `page`, `engine`, `device`, `enabled`, `layer`, `purpose`, `search_region`, `notes`, `google_country`, `google_lang`, `google_loc`, `google_domain`. Один и тот же файл подходит и сборщику Yandex Cloud: лишние колонки не мешают.\n\n- Перед сетевым вызовом задание записывается в журнал. Каждый ответ сохраняется отдельным файлом с SHA-256 и квитанцией; значения доступа в сохранённом ответе заменяются на `[REDACTED]`.\n- Повторный запуск того же плана не отправляет успешные задания снова. Код 15 («результатов нет») — состояние `empty`, не ошибка и не повторяется.\n- Временные ошибки `101`, `110`, `111`, `500` повторяются отдельным запуском `--retry-errors` (по умолчанию только эти коды; `--only-codes` сужает список). Прежние попытки сохраняются.\n- Задание с неизвестным исходом (`inflight`: обрыв, таймаут) автоматически не отправляется повторно — запрос мог быть оплачен. Посмотрите команду `inflight`; снять задание можно только с `--acknowledge-possible-charge`.\n- `31`, `42`, `45` (доступ), `115` (слишком много параллельных запросов, блокировка на 10 минут), `200` (нет денег) и HTTP 429 останавливают пакет. Параллельность держите ниже лимита потоков из `info`. Два `collect` в одном каталоге одновременно запустить нельзя: второй останавливается до сети, а каждое задание захватывается атомарно, поэтому один запрос не оплачивается дважды. `new_requests` в итоге — число фактически отправленных запросов.\n\n## Особенности систем\n\n- **Яндекс**: страницы с нуля, `groupby=10`, регион числом, `domain=ru`, `lang=ru`. Позиция считается только среди результатов `contenttype=organic`. Для второй и следующих страниц абсолютная позиция (`abs_rank_state=verified`) ставится лишь при непрерывной цепочке успешных страниц от нулевой, 10 органических результатов на каждой предыдущей, без пересечений адресов и без смены исправленного запроса. Иначе позиция «не доказана»: номер страницы × 10 ранг не доказывает.\n- **Google**: страницы с единицы (скрипт принимает номер с нуля и сам прибавляет единицу), страна и язык из справочников. Местоположение `loc` для крупных городов бывало источником устойчивой ошибки 500 — проверьте пробой, при ошибке работайте на уровне страны.\n- Одинаково названные параметры различаются: `lr` у Яндекса — регион числом, у Google — язык кодом; `domain` у Яндекса — строка, у Google — числовой идентификатор.\n\n## Реклама\n\n- Яндекс: `--ads on` добавляет рекламные блоки (`y_topads`, `y_bottomads`; правый блок — `--yandex-right-ads`).\n- Google: документация XMLRiver обещает рекламные блоки, но в проверках автора набора (сентябрь–октябрь 2026, в том числе проба 23.10.2026) Google рекламу не возвращал. Перед пакетом сделайте одиночную пробу на заведомо коммерческом запросе; пустой результат не доказывает отсутствие рекламы конкурентов.\n- Число объявлений в снимке — не охват рынка. Ноль объявлений в ответе не означает, что рекламы нет в другом месте и в другой момент. Пустые поля сначала проверьте на разборе, потом делайте выводы.\n- Сохраняются исходные поля объявления: `url` (отображаемый адрес), `adsurl` (рекламный переход Google), заголовок, текст, быстрые ссылки. Конечная страница не подменяется догадкой: `landing-unresolved`, пока она не подтверждена отдельной проверкой. По рекламным ссылкам скрипт не переходит.\n- Заголовок или текст может содержать процентно кодированные теги выделения (`%3Cb%3E`). В сырых полях они сохраняются; для чтения есть отдельные колонки `title_clean` и `snippet_clean`.\n\n## Wordstat через XMLRiver\n\n    python3 scripts\u002Fxmlriver_collect.py plan    --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history\n    python3 scripts\u002Fxmlriver_collect.py collect --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history \\\n        --approve-plan-sha256 \u003CSHA> --max-cost-rub \u003Cпотолок>\n    python3 scripts\u002Fxmlriver_collect.py export  --kind wordstat --masks-file masks.tsv --output-dir RUN --regions 225 --pagetypes words,history\n\n- Лимита «100 запросов в час» нет; лимит — число потоков аккаунта и ошибки `110`\u002F`115`. Лимиты официального API на XMLRiver не переносятся, и наоборот.\n- Каждая маска стоит два платных запроса: `words` (популярные и похожие запросы) и `history` (динамика и общее число). В пробе 23.10.2026 страница `words` вернула до 759 строк на маску.\n- Схема ответа другая: `popular` и `associations` (числа строками, в тексте операторы `+`). Общее число по маске даёт только `history` (`totalValue`, за предыдущий месяц). `export` пишет в `RUN\u002Fraw_bundle\u002F` файлы `top_requests_*.json` и `dynamics_*.json` и `_manifest.json` в формате облачного сборщика; отчёты волны, спроса и сезонности находят файлы через манифест. При нескольких регионах у каждого свой каталог `raw_bundle\u002Fregion_\u003Cномер>\u002F`, чтобы отчёт волны не смешивал регионы. Повторный `export` пересобирает каталог целиком. Строка с неверной частотностью не теряется молча: файл помечается `partial` в манифесте, строка уходит в `wordstat_row_errors.tsv`, а команда завершается кодом 2. Даты динамики — по московскому времени. Ответ без ожидаемых полей (`popular` или `graph`) считается ошибкой, а не успехом. Если `history` не собирали, `totalCount` в файле отсутствует, а не равен нулю.\n- Нет аналога дерева регионов и распределения по регионам: регион передаётся одним числом, для нескольких регионов создаются отдельные задания.\n- Числа XMLRiver и официального Wordstat не складывать и не сравнивать без пометки источника: это разные продукты (`provider` в каждом файле).\n- Интервалы динамики: `month` — не менее 3 полных месяцев, `week` — не менее 3 недель с понедельника по воскресенье, `day` — не менее 3 дней, конечный день не сегодня. Скрипт проверяет это до запроса; по умолчанию берёт 6 последних завершённых месяцев.\n\n## Разбор и выводы\n\n- Органика (`serp_results.tsv`, колонки как у сборщика Yandex Cloud), колдунщики (`feature_rows.tsv`) и реклама (`ad_rows.tsv`) выгружаются отдельно. Если в плане обе системы, таблицы пишутся по одной на систему (`serp_results_yandex.tsv`, `serp_results_google.tsv` и т. д.): прежние отчёты группируют только по запросу и региону и смешали бы Яндекс с Google. Регион в таблице — фактически использованный (для Яндекса по умолчанию 225). В каждой строке: исходный запрос и задание, регион, система, устройство, время ответа, положение, путь к сырому файлу и его SHA-256.\n- Различайте «блока нет в ответе», «поля нет», «ответ с ошибкой» и «задание не выполнено». Статистику покрытия считайте по успешным заданиям и показывайте пропуски, ошибки, период и географию.\n- Выводы вида «конкурентов в рекламе нет» по разовому снимку запрещены.\n- Смысловая обработка частотностей и ключей — дальше по [единому навыку](..\u002Fyandex-direct-unified\u002FSKILL.md); здесь автоматический отбор не выполняется.\n\n## Проверка перед сдачей\n\n1. Повторный `collect` по тому же плану даёт ноль новых запросов.\n2. `export` строит таблицы только из сохранённых ответов, без сети; контрольные суммы совпадают.\n3. Число заданий по состояниям (`success`, `empty`, `error`, `inflight`, `pending`) сходится с планом; расход и баланс до и после записаны (разница общего баланса может включать чужие запросы на том же аккаунте).\n4. В отчёте нет ключей, полных адресов запросов и клиентских данных.\n5. Расход на XMLRiver указан отдельно от расходов Yandex Cloud ([контроль расходов облака](..\u002Fyandex-cloud-search-cost-control\u002FSKILL.md) относится только к Yandex Cloud).\n",{"name":5,"description":7},"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research",474,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-11 14:40:14",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill xmlriver-serp-research",{"tool":52,"command":53},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill xmlriver-serp-research",{"tool":55,"command":56},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill xmlriver-serp-research","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research\u002FSKILL.md",true,[60,66,70],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"agents\u002Fopenai.yaml","REFERENCE","参考文档",475,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research\u002Fagents\u002Fopenai.yaml",{"path":67,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":68,"sourceHtmlUrl":69},"config\u002Fxmlriver_demo_access.json",425,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research\u002Fconfig\u002Fxmlriver_demo_access.json",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"scripts\u002Fxmlriver_collect.py","SCRIPT","脚本",51424,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fxmlriver-serp-research\u002Fscripts\u002Fxmlriver_collect.py",[77,85,92,99,125,150],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":84},"01M746ZWACVKMZ1BJXJZHYJSSX","migrate-to-e2e","Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for \u002Fmigrate-to-e2e, \"migrate our tests to e2e\", \"port these Maestro flows\", \"move our TesterArmy tests\", or when a project has an e2e config and an older suite still running.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fmigrate-to-e2e\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":84},"01M746ZPTAX1Q0FBKAB1CYND7E","e2e","Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fe2e\u002FSKILL.md",[],[],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":84},"01M746ZJN784HVHMDP9MQGCSGG","create-verification-skill","Generate a project-local verify-\u003Capp> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for \u002Fcreate-verification-skill, \"make a verification skill for this repo\", or when a project has no scripted way to prove UI behavior.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fcreate-verification-skill\u002FSKILL.md",[],[],{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":31},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[27,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124],"deja search","never","error","ready","memory","re","decide","fix","design","debugging","when","you","done","reviewer","io","change","cli","merge","past",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":31},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[132,133,134,120,135,136,137,138,139,140,141,142,143,144,110,145,146,147,148,149],"deja reflect","reflect","review","with","record","github","next","https","node","Rules","decisions","brew","remember","project rules","project","session","end","reflection",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":165,"publishedAt":31},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[156,159,162],{"categoryNo":157,"categoryName":158,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":160,"categoryName":161,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":163,"categoryName":164,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[152,166,167,168,169,170,171,146,172,111,173,174,175,176,116,177,178,179,30,180],"URL","Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","image","mcp server","schedule","publish"]