Формула ИИ для разработчиков Справочник API Каталог ошибок OpenAPI
Разделы

#Модули для сайтов

Статус: Доступно — Bitrix sapport.connector 1.2.1 и WordPress sapport-connector-wp 1.1.1. Бета — FastAPI sapport-connector 1.0.0 и Nuxt @sapport/nuxt-connector 1.0.0: пакеты готовы, но в кабинете помечены «скоро» (не опубликованы).

Назначение: подключить сайт на CMS или фреймворке к Формула ИИ одним модулем: счётчик посещений, серверный маячок (виден роботам и ИИ-краулерам), чат, сбор поведения и публикация статей из Формула ИИ.

#Содержание

  1. Когда использовать
  2. Общее для всех модулей
  3. Bitrix
  4. WordPress
  5. FastAPI
  6. Nuxt
  7. Протокол коннектора для собственных модулей
  8. Открытые вопросы

#Когда использовать

СитуацияРешение
Сайт на Bitrix (не облачный Битрикс24)модуль Bitrix
Сайт на WordPressмодуль WordPress
Сайт на FastAPI + PostgreSQLмодуль FastAPI (+ Nuxt для фронта) — Бета
Другая платформа, нужен только счётчикJS-трекер по токену
Другая платформа, нужны чат и поведениеЗагрузчик
Собственный модуль для нестандартной платформыраздел Протокол коннектора

#Общее для всех модулей

#Доступ

Кто привязываетпользователь кабинета с доступом к разделу «Продвижение → Система → Сайты (модуль)»; ключ трекера выдаёт право seo.manage
Платнонет, отдельной платы за модуль нет
Персональные данныехеши IP и User-Agent, страна (в режиме full); см. Обзор

#Что делает модуль

ВозможностьОписание
Серверный маячокпосле ответа страницы модуль отправляет на облако подписанный хит (путь, реферер, User-Agent, IP). Видит роботов, которые JS не исполняют
Загрузчикв <head> выводится тег loader.js (счётчик, поведение, чат)
Heartbeatраз в час модуль сообщает о состоянии и получает конфигурацию
Публикаторзабирает у облака задания на публикацию статей и применяет их (по умолчанию — черновиками)
Выключательотключение сайта в кабинете останавливает все части

#Как привязать сайт: код привязки

  1. В кабинете: «Продвижение → Система → Сайты (модуль)» → добавьте домен → получите код привязки.
  2. Код имеет префикс ячейки: RU-…, EN-… или ID-…. Он живёт 15 минут и одноразовый. Код чужой ячейки даёт ошибку «код не найден».
  3. Введите код в модуле. Модуль обменивает его на site_id, публичный ключ, секрет и ключ маячка (секрет отдаётся один раз).
  4. Если код истёк или использован, нажмите «Новый код». «Отключить» отвязывает сайт на стороне облака.

Состояния сайта в кабинете: pending (код выдан, привязки нет), bound (привязан), disabled (выключен).

Привязка допускает только зарегистрированный домен. Алиас домена или другой хост даёт ошибку domain_mismatch (при привязке) или 400 (на серверном маячке); www. поддерживается, если модуль его учитывает.

#Скачивание

Архивы и контрольные суммы SHA-256 — в кабинете: «Настройки → Интеграции → Модули для сайтов». Сверяйте сумму перед установкой.

МодульВерсияФайлСтатус
Bitrix1.2.1/connector/sapport.connector-1.2.1.zipДоступно
WordPress1.1.1/connector/sapport-connector-wp-1.1.1.zipДоступно
FastAPI1.0.0sapport_connector-1.0.0-py3-none-any.whl + архив документацииБета, не опубликован
Nuxt1.0.0sapport-nuxt-connector-1.0.0.tgzБета, не опубликован

Файлы берутся с домена своей ячейки (RU https://formula-cream.pro, EN https://wfacademy.org, ID https://wfacademy.id).

#Режимы серверного маячка

server_beaconЧто отправляетсяДля кого по умолчанию
fullпуть, реферер, User-Agent, IP, странаRU
anonymousто же, но облако не хранит хеши IP/UA, образец UA и странуEN, ID
offничего—

#Bitrix: sapport.connector 1.2.1

Статус: Доступно.

#Требования

Редакциялюбая, начиная с «Старт» (не облачный Битрикс24)
PHP7.4–8.3 с расширением curl
Сетьисходящий HTTPS к домену вашей ячейки
Для публикаторамодуль iblock, расширение sodium, право CREATE TABLE

#Установка

  1. Распакуйте архив в /local/modules/.
  2. В административной части откройте «Marketplace → Установленные решения» (/bitrix/admin/partner_modules.php) и нажмите «Установить» у «Sapport: коннектор».
  3. Получите в кабинете Формула ИИ код привязки (см. выше).
  4. «Настройки → Настройки продукта → Настройки модулей → Sapport: коннектор» → введите код → «Привязать».
  5. Нажмите «Проверить связь».

Рекомендации:

#Что делает модуль

ФункцияОписание
Маячокна init.php-цикле отправляет подписанный хит; пропускает CLI, /bitrix, upload, local/templates, статику, ajax, не-GET и запросы без text/html в Accept
Загрузчиквыводит тег loader.js
Контекст страницы\Sapport\Connector\Loader::setPage('iblock_element', $id); сообщает чату, о какой странице речь
Публикаторсоздаёт материалы в инфоблоках из заданий облака. По умолчанию — режим черновика; служебные свойства SAPPORT_SOURCE_ID, SAPPORT_SOURCE_HASH, SAPPORT_VERSION, SAPPORT_JOB; журнал в таблице b_sapport_connector_ledger
Разделыразрешённые разделы инфоблока (до 500)
IndexNowуведомляет поисковики о новых страницах (до 100 за запуск)
Карта сайта/sapport-sitemap.xml (до 50 000 адресов); отдаёт 404, если модуль SEO обновляет карту автоматически

#Настройки

ПараметрНазначение
Код привязкиодноразовый, из кабинета
Сайт работает за проксидоверять X-Forwarded-For
Режим публикаторачерновик (по умолчанию) или публикация, если разрешено потолком
Разрешённые разделыкуда публикатор вправе создавать материалы
ИндексацияIndexNow, карта сайта

Включённость частей (tracker, behaviour, chat, режим согласия, режим маячка) задаётся в кабинете.

#Проверка

  1. Кнопка «Проверить связь» → успех.
  2. В кабинете состояние сайта — bound.
  3. После визита с обычного браузера в «Обзоре» растёт счётчик; бот-хит можно проверить curl -A "Googlebot" https://ваш-сайт/.
  4. Страница отдаёт тег loader.js?k=… в <head>.

#Обновление и удаление

#Частые проблемы

СимптомПричина и решение
Нет хитов от роботовкомпозитный кэш Bitrix отдаёт страницы, не вызывая PHP; маячок их не видит
Состояние «ошибка ключа»облако отклонило подпись 3 раза подряд. Секрет повреждён или сайт переиздан: отвяжите и привяжите заново
code_not_foundкод истёк, использован или от другой ячейки (чужой префикс)
IP посетителей одинаковвключите «Сайт работает за прокси»

#Безопасность

Секрет привязки хранится в таблице b_option в открытом виде, поэтому резервные копии базы содержат его. Перевыпуск секрета — только отвязкой и новой привязкой.

#WordPress: sapport-connector-wp 1.1.1

Статус: Доступно.

#Требования

WordPress6.0 и выше
PHP7.4 и выше (в кабинете указано 7.4–8.3)
CronWP-Cron должен работать: heartbeat раз в час, публикатор раз в 10 минут
Сетьисходящий HTTPS к домену ячейки

#Установка

  1. «Плагины → Добавить новый → Загрузить плагин», выберите zip, нажмите «Установить» и «Активировать».
  2. «Настройки → Формула ИИ».
  3. Вставьте код привязки → «Подключить».
  4. Нажмите «Проверить связь».

#Что делает плагин

ФункцияОписание
Маячокхук template_redirect
Загрузчиктег в wp_head
Контекст страницыwindow.sapportPage заполняется автоматически; изменить можно фильтром sapport_connector_page_context
Публикаторсоздаёт записи из заданий облака; назначается автор (Author/Editor), тип записи, разрешённые рубрики, предел режима; подпись заданий (Ed25519) проверяется
Индексациякарты сайта WordPress Core, Yoast, Rank Math, AIOSEO; IndexNow (файл ключа требует «красивых» ссылок)

#Особенности

ТемаЧто учесть
Режим anonymousплагин отправляет путь и реферер без query-строки, поэтому UTM из серверного маячка теряются; UTM придут только от JS-счётчика
Мультисайтработает по сайту; мультисайт с подкаталогами не поддерживается
Автообновлениене выполняется, обновляйте вручную
Внешние сервисыIndexNow отправляет адреса на api.indexnow.org

#Проверка, обновление, удаление

#Частые проблемы

СимптомПричина и решение
Heartbeat не приходитWP-Cron отключён или сайт без трафика: настройте системный cron на wp-cron.php
Нет UTM в режиме anonymousожидаемо, см. выше
IndexNow не работаетотключены «красивые» ссылки

#FastAPI: sapport-connector 1.0.0 (Бета)

Статус: Бета. Пакет собран и описан, но в кабинете помечен «скоро / Пакет готовится»; файлов на странице скачивания пока нет.

#Требования

Python 3.11 и новее, PostgreSQL (та же база, где лежат статьи сайта), исходящий HTTPS к домену ячейки. Модуль не открывает входящих адресов для облака.

#Установка и привязка

# 1. Проверьте контрольную сумму файла из кабинета
sha256sum sapport_connector-1.0.0-py3-none-any.whl

# 2. Установите
pip install "./sapport_connector-1.0.0-py3-none-any.whl[postgres]"

# 3. Создайте таблицы модуля
sapport-connector migrate

# 4. Привяжите домен кодом из кабинета
SAPPORT_SITE__RU_MAIN__HOST=example.ru \
sapport-connector bind --site ru_main --code RU-XXXXXXXXXX \
  --secret-file /run/secrets/sapport_ru_main --env-file /etc/sapport/sapport.env

# 5. Самопроверка: все строки [OK]
sapport-connector selftest

# 6. Запустите worker (systemd/supervisor) или cron: sapport-connector run-once
sapport-connector worker

Команды CLI: bind, migrate, selftest, run-once, status, worker, unbind (необратима). Имя на PyPI занято заглушкой — ставьте только архив из кабинета.

#Переменные окружения

ПеременнаяОбязательнаСмысл
SAPPORT_SITESдаключи привязок через запятую, например ru_main
SAPPORT_SITE__<KEY>__HOSTдадомен без схемы и порта
SAPPORT_SITE__<KEY>__CELLдаru | en | id
SAPPORT_SITE__<KEY>__IDпосле bindsite_id
SAPPORT_SITE__<KEY>__SECRET_FILEда (worker)путь к файлу секрета с правами 0600
SAPPORT_SITE__<KEY>__PUBLISHERнетon включает публикатор (по умолчанию off)
SAPPORT_SITE__<KEY>__CEILINGнетпотолок режима: draft (по умолчанию) или publish
SAPPORT_DATABASE_URLдастрока подключения PostgreSQL
SAPPORT_ADAPTERдля публикаторамодуль:фабрика, возвращающая адаптер ваших статей

Секрет записывается в файл, а не в переменную окружения. Полный перечень и контракт адаптера статей — в документации пакета (README, INTEGRATION, ADAPTER, PROTOCOL, ERRORS, ACCEPTANCE, SECURITY, CSP, OPERATIONS, COMPATIBILITY, TROUBLESHOOTING).

#Что нужно написать вам

Публикатор требует адаптер под вашу таблицу статей (контракт — ADAPTER), а обложки — класс медиахранилища на общем для реплик хранилище. Без медиахранилища статьи публикуются без обложки. Пока публикатор выключен, модуль только поддерживает связь и heartbeat.

#Проверка

sapport-connector status и selftest; в кабинете сайт bound. Для подробной диагностики веб-процесса подключите healthz_router() и закройте адрес на обратном прокси.

#Nuxt: @sapport/nuxt-connector 1.0.0 (Бета)

Статус: Бета. Пакет не опубликован.

Nuxt-часть работает вместе с Python-worker: привязывает сайт worker, а Nuxt получает только производный ключ маячка. Им нельзя забрать задания или отвязать сайт.

#Требования

Nuxt 3.13+ или 4.x в режиме Node-сервера (Nitro 2, Node 18.17+; для Nuxt 4 — Node 20+). Nuxt 5 не поддерживается.

#Установка

sha256sum sapport-nuxt-connector-1.0.0.tgz
npm install ./sapport-nuxt-connector-1.0.0.tgz
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@sapport/nuxt-connector'],
  sapport: {
    exclude: ['/admin'],
    trustedProxies: ['127.0.0.1'],
  },
});

Ключ не пишется в nuxt.config. Переменные окружения сервера Nuxt:

SAPPORT_SITES=ru_main
SAPPORT_SITE__RU_MAIN__HOST=example.ru
SAPPORT_SITE__RU_MAIN__CELL=ru
SAPPORT_SITE__RU_MAIN__ID=<site_id>
SAPPORT_SITE__RU_MAIN__BEACON_KEY_FILE=/run/secrets/beacon/sapport_ru_main.beacon
NUXT_SAPPORT_DIAGNOSTICS_TOKEN=<случайная строка не короче 16 знаков>

Worker и Nuxt запускайте под разными пользователями ОС: файл корневого секрета не должен читаться процессом Nuxt.

#Использование в страницах

<script setup lang="ts">
useSapportPage({ type: 'article', id: article.id });
const consent = useSapportConsent();
</script>
<template>
  <button @click="consent.grant()">Принять</button>
  <button @click="consent.deny()">Отклонить</button>
</template>

#Диагностика

curl -s -H "Authorization: Bearer $NUXT_SAPPORT_DIAGNOSTICS_TOKEN" https://ваш-сайт/_sapport/health

Ожидается "ok": true, у привязки config.state: "valid", после первого просмотра beacon.sent ≥ 1.

#Ограничения

ОграничениеСледствие
SPA-переходы (NuxtLink) не делают запроса к серверусерверный маячок их не видит; видит первую загрузку и перезагрузки
Prerender/SSG, ISR/SWR, кэш CDN и nginxзаходы из кэша не видны
Статический хостинг без Nodeмаячка нет, остаётся JS-счётчик загрузчика
Нет подписанной конфигурациивсё выключено (отказ закрыто); первая отрисовка ждёт облако до 1 с
Выключатель в кабинетедействует до 1 часа (срок снимка конфигурации)
Предел облака1200 хитов в минуту с адреса сервера; модуль ограничивает себя ~1000 в минуту на процесс
Очередь200 хитов, лишнее отбрасывается; повторов нет

#Протокол коннектора для собственных модулей

Статус: Доступно для модулей, которые вы пишете сами. Протокол используют четыре готовых модуля; его перечень может расширяться совместимо.

Адрес: https://<домен ячейки>/api/v1/connector/…. Все запросы, кроме bind, подписываются HMAC.

#Подпись запроса

Заголовки:

ЗаголовокЗначение
X-Sapport-Sitesite_id
X-Sapport-Tsunix-время в секундах
X-Sapport-Nonce16–32 символа [A-Za-z0-9], одноразовый
X-Sapport-Sighex HMAC-SHA256 от строки подписи

Строка подписи (пять строк через \n):

<ts>
<nonce>
<METHOD>
<path без query-строки>
<sha256hex(тело запроса)>
beacon_key = hex(HMAC-SHA256(secret, "sapport-beacon-v1:" + site_id))

Тестовые векторы подписи и заданий лежат в поставке модулей (tests/_vectors/, файлы signing-vectors.json, job-vectors.json). Не копируйте секреты из примеров документации в рабочие системы.

#Методы

Метод и путьПодписьНазначениеЧастота и лимиты
POST /connector/bindнетобмен кода привязки на реквизиты сайта10 в минуту с адреса; тело ≤ 4096 байт
POST /connector/heartbeatдасостояние, получение конфигурациираз в час; 120 в минуту; тело ≤ 512 КиБ
GET /connector/jobsдазадания публикации120 в минуту; не идемпотентен
POST /connector/resultдаитог задания120 в минуту
POST /connector/unbindдаотвязка ({"reason":"manual"|"uninstall"})120 в минуту
GET /connector/beacon-configда (допустим ключ маячка)настройки маячка и загрузчика120 в минуту; Cache-Control: no-store
POST /track/visitда (допустим ключ маячка)серверный хит1200 в минуту с адреса
GET /connector/loader.js?k=нетзагрузчиккэш 5 минут

#bind

POST /api/v1/connector/bind
Content-Type: application/json

{
  "code": "RU-XXXXXXXXXX",
  "site_url": "https://example.ru",
  "cms": "fastapi_nuxt",
  "module_version": "1.0.0"
}
ПолеТипОбязательноОграниченияПример
codestringдакод привязки; чужой префикс ячейки даёт 404 code_not_foundRU-XXXXXXXXXX
site_urlstringдаадрес сайта; из него берётся хостhttps://example.ru
cmsstringдаbitrix | wordpress | fastapi_nuxtbitrix
module_versionstringнетверсия модуля1.2.1
cms_version, php_version, charsetstringнетсведения об окружении, короткие строки8.2.0

Ответ 200:

{
  "site_id": "00000000-0000-4000-8000-000000000000",
  "public_key": "0123456789abcdef0123456789abcdef",
  "secret": "EXAMPLE_SECRET_SHOWN_ONCE",
  "beacon_key": "0000000000000000000000000000000000000000000000000000000000000000",
  "api_base": "https://formula-cream.pro/api/v1",
  "loader_url": "https://formula-cream.pro/api/v1/connector/loader.js?k=0123456789abcdef0123456789abcdef",
  "config": { "tracker": true, "behaviour": false, "chat": false, "consent_mode": "wait", "server_beacon": "full" },
  "disabled": false
}

secret возвращается один раз. Ошибки: 400/413 bad_request, 404 code_not_found (код неизвестен, истёк, использован или принадлежит другой ячейке), 409 domain_mismatch, 429 rate_limited, 500 internal.

#heartbeat

Ответ 200: { "config": {…}, "min_module_version": "1.2.1", "disabled": false, "pending_jobs": 0 }. Ответ 403 с { "disabled": true } означает, что сайт выключен.

#beacon-config

{
  "tracker": true,
  "server_beacon": "full",
  "disabled": false,
  "consent_mode": "wait",
  "loader_url": "https://formula-cream.pro/api/v1/connector/loader.js?k=0123456789abcdef0123456789abcdef",
  "public_key": "0123456789abcdef0123456789abcdef",
  "ttl_seconds": 3600
}

Кэшируйте снимок на ttl_seconds.

#track/visit (серверный хит)

Поля тела описаны на странице JS/PHP-трекер. Особенности подписанного вызова:

#jobs и result

Задания подписываются Ed25519 (поле kid с префиксом ячейки ru-/en-/id-, канонический JSON с сортировкой ключей в порядке UTF-16). Ответ на GET /jobs не идемпотентен: выданное, но не подтверждённое задание выдаётся повторно через 15 минут. Ошибка 503 signing_unavailable означает временную недоступность подписи заданий.

result принимает статус applied, skipped, conflict, failed. Первый присланный итог окончателен.

ПределЗначение
HTML статьи2 000 000 байт
Полезная нагрузка задания3 000 000 байт
Ответ /jobs4 МиБ
Обложка5 МиБ, до 12 000 px, до 50 Мп
Возраст подписидо 7 дней; issued_at из будущего более чем на 5 минут отклоняется

Пределы статьи едины для облака и модулей: HTML не более 2 000 000 байт, полезная нагрузка задания не более 3 000 000 байт. Подробнее — Статьи.

#Рекомендации для собственного модуля

#Открытые вопросы

  1. Техническое. FastAPI и Nuxt: реальное наличие файлов в каталоге раздачи не проверялось; в кабинете модуль помечен «скоро». До публикации пакетов страницы остаются Бета.
  2. Техническое. Модуль Bitrix, режим anonymous: WordPress обнуляет query-строку на своей стороне, а облако в режиме full читает UTM из query. Нужно решить единое правило для всех модулей.
  3. К владельцу. Значение cms для собственных модулей: допустимы только bitrix, wordpress, fastapi_nuxt. Как регистрировать модуль на другой платформе, не определено.
  4. Техническое. Путь к настройкам в Bitrix: README модуля называет раздел кабинета «подключение сайтов» без пути; здесь использован путь из интерфейса «Продвижение → Система → Сайты (модуль)».