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

#Загрузчик loader.js

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

Назначение: один тег <script> подключает к сайту счётчик посещений, сбор поведения и чат Формула ИИ и управляет ими через согласие посетителя.

#Содержание

  1. Когда использовать
  2. Доступ
  3. Что входит в загрузчик
  4. Установка вручную
  5. Согласие посетителя
  6. Интеграция с баннером cookie
  7. Как проверить установку
  8. Ответ сервера и кэширование
  9. Заметки
  10. Открытые вопросы

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

Если нужен только счётчик посещений без привязки сайта, используйте JS-трекер по токену.

#Доступ

Аутентификацияпубличный ключ сайта в параметре k (это не секрет)
Платнонет
Персональные данныехеши IP и User-Agent, страница, источник (см. Обзор)
Откуда ключвыдаётся при привязке сайта (ответ bind, поле public_key); равен токену трекера этого сайта

#Что входит в загрузчик

Загрузчик собирается на облаке по настройкам сайта и подключает только включённые части.

ЧастьНастройка сайтаЧто делает
Трекерtrackerодно посещение на загрузку страницы (тот же механизм, что в JS-трекере)
Поведениеbehaviourскрипт сбора поведения посетителя; запускается только с согласием
Чатchat и chat_channel_idпузырь чата; включается, только если заданы оба значения

Настройки сайта целиком:

ПолеТипЗначенияСмысл
trackerbooleantrue/falseсчётчик посещений; выключатель действует и на серверный маячок модуля
behaviourbooleantrue/falseсбор поведения
chatbooleantrue/falseчат на сайте
chat_channel_idstringидентификатор каналакакой канал отвечает на сайте
consent_modestringwait | immediateкогда запускать части загрузчика
server_beaconstringfull | anonymous | offрежим серверного маячка модуля

Настройки меняет персонал в кабинете: «Продвижение → Система → Сайты (модуль)».

#Установка вручную

Публичный ключ показывает ответ bind (протокол коннектора); в интерфейсе кабинета он сейчас не выводится (см. открытые вопросы).

Шаг 1. Перед основным тегом добавьте заглушку очереди согласия. Она нужна, чтобы вызов consent до загрузки скрипта не потерялся.

<script>
  window.sapport = window.sapport || {
    q: [],
    consent: function (v) { this.q.push(['consent', !!v]); }
  };
</script>

Шаг 2. Добавьте загрузчик ячейки вашего сайта (пример для RU; EN — https://wfacademy.org, ID — https://wfacademy.id):

<script async src="https://formula-cream.pro/api/v1/connector/loader.js?k=0123456789abcdef0123456789abcdef"></script>

Параметры запроса:

ПараметрТипОбязателенОграниченияПример
kstringда32 hex-символа, публичный ключ сайта0123456789abcdef0123456789abcdef

Шаг 3. Разместите тег на всех страницах, которые нужно учитывать (обычно — в общем шаблоне, в <head> перед </head>).

#Согласие посетителя

Режим задаётся настройкой consent_mode.

РежимПоведение
immediateчасти загрузчика стартуют сразу после загрузки
waitчасти ждут вызова window.sapport.consent(true) или события sapport:consent

#API на странице

// согласие дано
window.sapport.consent(true);

// согласие отозвано: остановит сбор поведения
window.sapport.consent(false);

// то же событием
window.dispatchEvent(new CustomEvent('sapport:consent', { detail: true }));
// допустима и форма { granted: true }
window.dispatchEvent(new CustomEvent('sapport:consent', { detail: { granted: true } }));
ЭлементОписание
window.sapport.qочередь вызовов до загрузки скрипта; загрузчик разбирает её по порядку
window.sapport.consent(bool)выдать или отозвать согласие
событие sapport:consentdetail === true либо detail.granted === true — согласие дано

#Что именно зависит от согласия

ЧастьБез согласия (режим wait)После consent(false)
Счётчик посещенийстартует по правилам режимауже отправленный хит вернуть нельзя
Сбор поведенияне запускаетсяостанавливается
Чатпузырь загружается сразу, независимо от согласия—
Данные чатавиджет не записывает первое касание (first-touch) и не передаёт во фрейм query-строку, заголовок и реферер—

Подключите вызов к кнопкам вашего баннера согласия:

document.querySelector('#cookie-accept').addEventListener('click', function () {
  window.sapport.consent(true);
});
document.querySelector('#cookie-reject').addEventListener('click', function () {
  window.sapport.consent(false);
});

// сохранённый выбор при следующем визите
if (localStorage.getItem('cookie-consent') === 'granted') {
  window.sapport.consent(true);
}

Если баннер даёт выбор по категориям, привязывайте consent(true) к категории «аналитика» (статистика), а не к «маркетингу».

#Как проверить установку

  1. Откройте страницу сайта с инструментами разработчика → вкладка «Сеть». Должен быть запрос loader.js?k=… со статусом 200.
  2. Убедитесь, что ответ — не заглушка: тело не равно /* Sapport connector: off */.
  3. В консоли выполните typeof window.sapport.consent — ожидается function.
  4. Проверьте запрос посещения: после загрузки страницы уходит POST /api/v1/track/visit, ответ 204.
  5. В кабинете «Продвижение → Система → Сайты (модуль)» у сайта должно быть состояние «привязан», включены «Счётчик посещений» и нужные части.
  6. Если на странице подключены и модуль, и ручной тег, посещения удвоятся — оставьте один.

#Ответ сервера и кэширование

Метод и адресGET /api/v1/connector/loader.js?k=<ключ>
Успех200, application/javascript
Выключен или неизвестный ключ200 с заглушкой /* Sapport connector: off */
Cache-Controlpublic, max-age=300
ЗаголовкиAccess-Control-Allow-Origin: *, Cross-Origin-Resource-Policy: cross-origin, X-Content-Type-Options: nosniff, HSTS

Выключив сайт или часть в кабинете, учтите кэш: загрузчик опустеет на страницах в пределах 5 минут.

#Заметки

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

  1. К владельцу. Где взять публичный ключ без модуля. Поле public_key есть в ответе привязки, но интерфейс кабинета его не показывает и готовый тег не выдаёт. Ручная установка поэтому поддерживается как сценарий протокола, а не как кнопка в кабинете. Нужно решение: показывать ключ и готовый тег в карточке сайта.
  2. Техническое. Тот же ключ служит токеном трекера: стоит ли предупредить, что он публичен и допускает запись хитов с чужих страниц (защита — лимиты и квота, см. JS-трекер).