Блог разработчика 1С-Битрикс

API модуля sendev.inozapret: возможности и интеграция с 1С-Битрикс

После установки модуля sendev.inozapret на сайт 1С-Битрикс вы получаете не только интерфейс проверки контента в админке, но и полноценный программный слой для создания собственного сервиса.

API модуля sendev.inozapret: возможности и интеграция с 1С-Битрикс
Функционал будет доступен в релизе 0.9.00 после 8 марта. Подробная документация будет доступна в самом модуле в разделе "Документация API"

Это особенно полезно, если вы хотите:

  • проверять тексты перед публикацией;
  • анализировать загружаемые документы;
  • проверять страницы сайтов по URL;
  • выдавать результат в личном кабинете клиента;
  • продавать проверки по модели подписки, кредитов или пакетных тарифов.

Такой подход подходит для редакций, агентств, корпоративных порталов, образовательных платформ и сервисов контент-контроля, где важно автоматизировать внутренние регламенты и процессы проверки в логике требований 168-ФЗ, 53-ФЗ, 38-ФЗ и внутренних правил компании.

Что даёт собственное API модуля sendev.inozapret

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

  • публичную форму проверки текста;
  • загрузку файлов с отчётом;
  • проверку страниц по ссылке;
  • интеграцию с личным кабинетом;
  • платный доступ по API-ключу;
  • внутренний инструмент для редакторов, контент-менеджеров или юристов.

Главное преимущество в том, что логика проверки остаётся единой. Один и тот же механизм работает и в административной части, и в публичных сценариях, и в API-интеграциях.

Какие задачи решает API

Собственное API модуля покрывает четыре базовых сценария:

1. Проверка текста

Подходит для статей, карточек товаров, описаний услуг, лендингов, email-рассылок и любых материалов, которые нужно быстро проверить до публикации.

2. Проверка URL

Подходит для анализа готовой страницы: лендинга, статьи, новости, раздела сайта, страницы клиента или партнёра.

3. Проверка файла

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

4. Информационный метод

Позволяет узнать состояние словаря, версию API и доступные действия. Это полезно для интеграций, диагностики и мониторинга.

Где находится API endpoint

Путь зависит от того, куда установлен модуль.

Если модуль установлен вручную для тестирования, endpoint обычно находится по пути:

/local/modules/sendev.inozapret/api/v1/index.php

Если модуль установлен через маркетплейс 1С-Битрикс, endpoint может находиться по пути:

/bitrix/modules/sendev.inozapret/api/v1/index.php

Именно поэтому в рабочем проекте лучше либо определять путь автоматически, либо хранить его в настройках.

Пример вызова с параметром действия:

https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=check_text

или

https://example.com/bitrix/modules/sendev.inozapret/api/v1/index.php?action=check_text

Как работает аутентификация

API требует ключ доступа. Передать его можно несколькими способами, но основной вариант — через заголовок X-Api-Key.

Поддерживаются варианты:

  • HTTP-заголовок X-Api-Key
  • параметр api_key в теле POST-запроса
  • параметр api_key в query string
  • api_key в JSON body

Рекомендуемый способ:

curl -X POST 'https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=info' \
  -H 'X-Api-Key: ВАШ_КЛЮЧ'

Важно: API принимает только POST

Это ключевой момент, который нужно понимать сразу.

Параметр action можно передавать в URL, например:

?action=check_text

Но сам запрос должен быть именно POST.

Если просто открыть endpoint в браузере, будет отправлен GET, и API вернёт ошибку METHOD_NOT_ALLOWED.

Если сервер перенаправляет http на https, часть клиентов может повторять такой запрос уже как GET. Поэтому в продакшене всегда лучше сразу отправлять запрос на итоговый адрес и на нужном протоколе.

Какие методы доступны в API

На момент обновления доступны четыре действия:

check_text

Проверка текста.

Основные параметры:

  • action=check_text
  • text — текст для анализа
  • skip_whitelist=Y — опционально, если нужно отключить белый список

Пример:

curl -X POST 'https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=check_text' \
  -H 'X-Api-Key: ВАШ_КЛЮЧ' \
  --data-urlencode 'text=Для максимальной конверсии используйте AI-дриблинг и стратегический апроач'

check_url

Проверка страницы по ссылке.

Основные параметры:

  • action=check_url
  • url — полный URL страницы
  • skip_whitelist=Y — опционально

Пример:

curl -X POST 'https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=check_url' \
  -H 'X-Api-Key: ВАШ_КЛЮЧ' \
  --data-urlencode 'url=https://example.com/article'

check_file

Проверка файла.

Поддерживаемые форматы в текущей реализации API:

  • txt
  • html
  • htm
  • docx

Пример:

curl -X POST 'https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=check_file' \
  -H 'X-Api-Key: ВАШ_КЛЮЧ' \
  -F 'file=@/path/to/document.docx'

info

Информация о состоянии сервиса.

Пример:

curl -X POST 'https://example.com/local/modules/sendev.inozapret/api/v1/index.php?action=info' \
  -H 'X-Api-Key: ВАШ_КЛЮЧ'

Как выглядит ответ API

Успешный ответ возвращается в JSON.

Пример для check_text:

{
  "ok": true,
  "data": {
    "violations_count": 2,
    "violations": [
      {
        "word": "конверсии",
        "type": "missing_in_normative_dicts",
        "context": "Для максимальной конверсии используйте"
      }
    ],
    "settings": {
      "storage": "db",
      "normative_mask": 31,
      "whitelist_enabled": true
    }
  }
}

Пример ошибки:

{
  "ok": false,
  "error": {
    "code": "AUTH_FAILED",
    "message": "Неверный или отсутствующий API-ключ."
  }
}

Пример использования API в PHP

Ниже — простой PHP-клиент, который можно использовать в сервисном коде, в компоненте или в кастомной странице на 1С-Битрикс.

<?php

class InozapretClient
{
    private string $endpoint;
    private string $apiKey;

    public function __construct(string $endpoint, string $apiKey)
    {
        $this->endpoint = rtrim($endpoint, '/');
        $this->apiKey = $apiKey;
    }

    public function checkText(string $text, bool $skipWhitelist = false): array
    {
        return $this->request('check_text', [
            'text' => $text,
            'skip_whitelist' => $skipWhitelist ? 'Y' : 'N',
        ]);
    }

    public function checkUrl(string $url, bool $skipWhitelist = false): array
    {
        return $this->request('check_url', [
            'url' => $url,
            'skip_whitelist' => $skipWhitelist ? 'Y' : 'N',
        ]);
    }

    public function request(string $action, array $data = []): array
    {
        $ch = curl_init($this->endpoint . '?action=' . $action);

        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                'X-Api-Key: ' . $this->apiKey,
            ],
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_TIMEOUT => 30,
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        $decoded = json_decode((string)$response, true);
        return is_array($decoded) ? $decoded : [];
    }
}

Использование:

<?php

$client = new InozapretClient(
    'https://example.com/local/modules/sendev.inozapret/api/v1/index.php',
    'ВАШ_API_КЛЮЧ'
);

$result = $client->checkText('Текст для проверки');
print_r($result);

Пример кода прямо на странице 1С-Битрикс

Один из самых частых сценариев — сделать страницу /tools/text-check/, где пользователь вставляет текст, а сайт отправляет запрос во внутренний API от имени сервера. Это правильно, потому что API-ключ не должен уходить в браузер.

Ниже пример упрощённой страницы index.php для Bitrix.

<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');

use Bitrix\Main\Config\Option;

$APPLICATION->SetTitle('Проверка текста');

$moduleId = 'sendev.inozapret';
$text = '';
$result = null;
$error = '';

$apiKey = Option::get($moduleId, 'api_key', '');

$possiblePaths = [
    '/local/modules/' . $moduleId . '/api/v1/index.php',
    '/bitrix/modules/' . $moduleId . '/api/v1/index.php',
];

$apiPath = '';
foreach ($possiblePaths as $path) {
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . $path)) {
        $apiPath = $path;
        break;
    }
}

$scheme = (!empty($_SERVER['HTTPS']) && strtolower((string)$_SERVER['HTTPS']) !== 'off') ? 'https' : 'http';
$apiUrl = $apiPath !== '' ? $scheme . '://' . $_SERVER['HTTP_HOST'] . $apiPath : '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && check_bitrix_sessid()) {
    $text = trim((string)($_POST['text'] ?? ''));

    if ($apiKey === '') {
        $error = 'API-ключ не настроен.';
    } elseif ($apiUrl === '') {
        $error = 'Не удалось определить путь к API.';
    } elseif ($text === '') {
        $error = 'Введите текст для проверки.';
    } else {
        $ch = curl_init($apiUrl . '?action=check_text');
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                'X-Api-Key: ' . $apiKey,
            ],
            CURLOPT_POSTFIELDS => [
                'text' => $text,
            ],
            CURLOPT_TIMEOUT => 30,
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        $result = json_decode((string)$response, true);
        if (!is_array($result)) {
            $error = 'Не удалось разобрать ответ API.';
        }
    }
}
?>

<form method="post">
    <?= bitrix_sessid_post() ?>
    <textarea name="text" rows="10" style="width:100%;"><?= htmlspecialcharsbx($text) ?></textarea>
    <div style="margin-top:10px;">
        <button type="submit">Проверить</button>
    </div>
</form>

<?php if ($error !== ''): ?>
    <div style="margin-top:15px; color:#b94a48;"><?= htmlspecialcharsbx($error) ?></div>
<?php endif; ?>

<?php if (is_array($result) && !empty($result['ok'])): ?>
    <div style="margin-top:20px;">
        <h3>Результат проверки</h3>
        <p>Найдено нарушений: <?= (int)($result['data']['violations_count'] ?? 0) ?></p>

        <?php if (!empty($result['data']['violations']) && is_array($result['data']['violations'])): ?>
            <table style="width:100%; border-collapse:collapse;">
                <tr>
                    <th style="text-align:left; border-bottom:1px solid #ddd; padding:8px;">Слово</th>
                    <th style="text-align:left; border-bottom:1px solid #ddd; padding:8px;">Тип</th>
                    <th style="text-align:left; border-bottom:1px solid #ddd; padding:8px;">Контекст</th>
                </tr>
                <?php foreach ($result['data']['violations'] as $item): ?>
                    <tr>
                        <td style="padding:8px; border-bottom:1px solid #eee;"><?= htmlspecialcharsbx((string)($item['word'] ?? '')) ?></td>
                        <td style="padding:8px; border-bottom:1px solid #eee;"><?= htmlspecialcharsbx((string)($item['type'] ?? '')) ?></td>
                        <td style="padding:8px; border-bottom:1px solid #eee;"><?= htmlspecialcharsbx((string)($item['context'] ?? '')) ?></td>
                    </tr>
                <?php endforeach; ?>
            </table>
        <?php endif; ?>
    </div>
<?php endif; ?>

<?php require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php'); ?>

Этот пример хорош тем, что:

  • API-ключ хранится на сервере;
  • страница подходит для быстрого MVP;
  • путь к API определяется автоматически;
  • решение одинаково подходит и для local/modules, и для bitrix/modules.

Как использовать API в коммерческом сервисе

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

Типовая архитектура выглядит так:

Публичные страницы

  • /tools/text-check/
  • /tools/file-check/
  • /tools/link-check/

Личный кабинет

  • история проверок;
  • баланс или тариф;
  • экспорт отчётов;
  • API-ключ для PRO-тарифа.

Монетизация

  • кредиты за символы;
  • подписки;
  • пакетные тарифы;
  • корпоративный доступ.

Дополнительная обвязка

  • троттлинг;
  • лимиты по IP и пользователю;
  • журналирование;
  • сохранение истории;
  • интеграция с оплатой.

Практические сценарии использования

Сценарий 1. Проверка текста перед публикацией

Контент-менеджер вставляет текст, сайт отправляет POST-запрос в check_text, результат выводится в интерфейсе и при необходимости сохраняется в историю.

Сценарий 2. Проверка документа

Пользователь загружает docx, сервис вызывает check_file, получает нарушения и показывает отчёт в личном кабинете.

Сценарий 3. Проверка лендинга или статьи по URL

Клиент вставляет ссылку, сервис вызывает check_url, скачивает страницу, извлекает текст и показывает результат.

Сценарий 4. Интеграция по API для партнёров

Партнёрская система или внешний кабинет получает свой ключ и вызывает API напрямую по тарифу с ограничениями.

Что важно учесть в продакшене

При запуске собственного сервиса поверх API есть несколько обязательных моментов.

Во-первых, не отдавайте API-ключ в браузер. Все вызовы с ключом лучше делать сервер-сервер.

Во-вторых, если вы делаете публичную проверку URL, добавляйте ограничения по доменам, адресам, редиректам и объёму ответа. Это особенно важно для защиты от SSRF-сценариев.

В-третьих, для публичных форм обязательно нужны лимиты и троттлинг. Даже простой лимит по IP уже сильно снижает риск злоупотреблений.

В-четвёртых, если вы продаёте проверки, почти всегда лучше считать их в кредитах. Так проще делать демо, тарифы, подписки и корпоративные пакеты.

Кому особенно полезно собственное API sendev.inozapret

Такой подход хорошо подходит:

  • редакциям и медиапроектам;
  • маркетинговым агентствам;
  • корпоративным порталам;
  • образовательным платформам;
  • внутренним юридическим и контентным отделам;
  • SaaS-сервисам, которые хотят продавать проверку как отдельный продукт.

Итог

Собственное API в модуле sendev.inozapret — это важное расширение, которое переводит модуль из формата "инструмент в админке" в формат "платформа для сервиса".

На практике это означает, что на базе одного модуля можно построить:

  • публичную проверку текстов;
  • загрузку и анализ файлов;
  • проверку страниц по URL;
  • личный кабинет клиента;
  • платную модель доступа;
  • партнёрский API.

Если вам нужен быстрый запуск на 1С-Битрикс, то самый практичный путь такой: сначала поднять проверку текста через внутренний API, затем добавить файлы и ссылки, а уже после — историю, тарифы, биллинг и кабинет пользователя.

SenDev: Инозапрет 168-ФЗ (контроль иностранных слов)

Автоматический сканер контента для соблюдения 168-ФЗ. Находит иностранные слова и потенциальные нарушения в инфоблоках, статических файлах и Highload-блоках. Встроенная морфология, белый список и пошаговое сканирование без таймаутов.

Теги: sendev.inozapret, API, 1С-Битрикс, проверка текстов, проверка файлов, проверка ссылок, контент-контроль, 168-ФЗ, 53-ФЗ, 38-ФЗ


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Техническая поддержка

сайтов на CMS 1C-Битрикс

от 20 000 рублей/месяц
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.