Синтаксис хаоса
о канале

Ну что, продолжаем неделю разбором чужих библиотек с гитхаба на прочность.

14.08.2026, 12:06 · ⏱ 4 мин

Ну что, продолжаем неделю разбором чужих библиотек с гитхаба на прочность.

SEO-спец у меня сидит в десктопном Клоде. Доступ к Вордстату уже был, но жил внутри Варенбурга, а туда чужому носу с боевым ключом лезть нельзя. Либо копипаст из вебморды руками, либо отдельный MCP-сервер. Взял чужой опенсорс, askads/mcp-yandex-wordstat версии 2.2.2 (между прочим авторства DevOps из Яндекса), чтобы не писать с нуля. Дальше три дня (как считает клод) ушли не на подключение, а на то, чтобы понять, что мне подсунули.

Молчаливый исходящий канал. При каждом вызове инструмента библиотека пуляла пинг на сервер автора: id, имя инструмента, версии. Ключ и аргументы не улетали, но похуй, вырезал целиком. У автора был выключатель через переменную окружения, я его не взял принципиально: флаг живёт в файле настроек, а файлы настроек копируют с образца при переносе на новый сервер. Один раз не доложил строчку — и канал молча снова открыт. Поставил тест-сторож, который git grep'ом ищет следы телеметрии по всему исполняемому коду. Он сначала ловил сам себя, потом поймал README. Сузил до исполняемых файлов, подбросил файл-приманку с тем самым адресом — покраснел, значит работает.

Дыра посерьёзнее. В библиотеке был инструмент raw_request — дёрни любой путь API. Апстрим проверял только хост запроса. А на этом же хосте у Яндекса кроме Вордстата висит платный веб-поиск по другому тарифу — инструмент с проверкой только хоста спокойно пустил бы модель туда моим ключом. Плюс путь вида //evil.example/x при разборе адреса теряет первую косую черту и превращается в обычный путь на легитимном хосте, проверка хоста это пропускает. Сузил до жёсткого префикса /v2/wordstat/, остальное режется до сетевого вызова.

Ключ ещё умеет утекать не там, где его ищут: текст ошибки от чужого API летит в исключение, в ответ модели и в журнал одновременно, и никто не гарантирует, что прокси не вернёт присланный заголовок обратно в сообщении об ошибке. Перетащил из Варенбурга функцию, которая вырезает секреты из любого текста, включил её до первого сетевого вызова — иначе первая же ошибка ушла бы незачищенной.

А потом главное. 113 тестов зелёные, типы чистые, пошёл на живую приёмку за настоящие деньги — и инструмент dynamics (сезонность спроса по месяцам) не работал вообще. Яндекс сразу: from_date обязательное поле. В документации библиотеки оно было объявлено необязательным, а мои тесты гоняли инструмент на поддельном клиенте, который про реальные требования Яндекса знать не может в принципе. Он покорно соглашался с ошибкой апстрима 113 раз подряд. Живая разведка за девять копеек нашла и вторую ложь в доке: дата конца при месячном шаге обязана быть строго последним днём месяца, а не любой границей периода. Обе проверки перетащил к себе в код: свой отказ бесплатный, отказ Яндекса стоит 0,03 ₽.

Доказал, что всё работает, так: задал один и тот же вопрос новому серверу и старому Варенбургу, разными ключами. iphone 17 pro max, регион Москва. 71483 и построчно одинаковый список. Вот это доказательство, а не зелёные тесты, которые сверяют код с тем, что автор кода думал о мире.

Вся приёмка стоила 0,33 ₽.

За ночь передачи сеошник уже погонял всерьёз: 14 запросов за четыре минуты на 0,42 ₽. iphone 17 pro max, транслит айфон 17 про макс, запрос с операторами, конкурент сяоми, локальный спрос айфон купить балашиха, есим. Живая работа, не тест.

Мелочи для настроения: PM2 не читает .env, хоть тресни, нужен явный --env-file с абсолютным путём. Конфиг PM2 обязан называться .cjs при "type": "module", иначе malformated без объяснений. Токен обязан быть латиницей и цифрами, кириллица роняет заголовок Authorization. И nginx -t говорит syntax is ok даже когда пропущена зона ограничения запросов, пришлось грепать конфиг руками до выкладки.

Осталась одна дыра, записал в отчёт честно: лимитер в nginx при срабатывании отвечает 503 вместо 429, а это разные вещи для клиента. Не тронул: живой трафик пока укладывается в разрешённый всплеск.

Полсотни копеек за то, на что руками ушёл бы час. Кто там у себя брал чужой опенсорс и не проверял его на живых деньгах?

✍️ Синтаксис хаоса
Подпишись: TG / DZEN / VK
3
Оригинал в Telegram: @syntax_of_chaos
📚 Читать дальше