
Язык 🇷🇺 Русский
Обзор
Реализация
За кулисами
Вебхуки
С FastComments можно вызывать конечную точку API всякий раз, когда комментарий добавляется, обновляется или удаляется в нашей системе.
Мы реализуем это с помощью асинхронных вебхуков по протоколам HTTP/HTTPS.
Что такое вебхуки 
Вебхук — это механизм, или интеграция, между двумя системами, где "производитель" (FastComments) генерирует событие которое "потребитель" (Вы) получает посредством вызова API.
Поддерживаемые события и ресурсы 
FastComments поддерживает вебхуки только для ресурса Comment.
Мы поддерживаем вебхуки для создания, удаления и обновления комментариев.
Каждое из них в нашей системе считается отдельным событием и, соответственно, имеет различную семантику и структуру для событий вебхука.
Настройка локальной разработки 
Для локальной разработки используйте инструмент, такой как ngrok.
Чтобы упростить поддержание безопасности системы, локальная разработка следует тому же процессу, что и настройка и защита других окружений.
Шаг 1: Добавьте "localhost" в домены в вашем аккаунте.
Добавьте "localhost" в качестве домена здесь.
Шаг 2: Выберите API‑ключ
Мы собираемся добавить конфигурацию вебхука для вашего домена, поэтому нам понадобится API‑ключ. Вы можете сделать это здесь.
В разделе «Associate with domain» — выберите ваш домен «localhost».
ПРИМЕЧАНИЕ: Вместо этого вы можете использовать один API‑секрет для всей тестовой активности и сред предварительного развертывания. Просто добавьте API‑секрет для «All Domains» и дайте ему имя, например, «test».
Убедитесь, что у вас определён API‑секрет для ваших производственных доменов. События для всех остальных доменов будут использовать wildcard‑секрет (тестовый).
Шаг 3: Добавьте ваш вебхук
Во время работы ngrok или аналогичного инструмента задайте значение для "localhost" здесь.
При нажатии Send Test Payload мы отправим два тестовых события, чтобы проверить, что вы валидируете API‑ключ.
После успешной проверки нажмите Save.
Шаг 4: Добавьте комментарий
Теперь вы можете добавлять, редактировать или удалять комментарии и должны увидеть, как мы вызываем вашу локальную машину разработки с событиями, используя ваш тестовый API‑ключ. Может быть задержка до 30 секунд, пока события не достигнут вашей машины.
Настройка 
Follow the same steps for localhost as you would production. Ensure you have production domains and API Secrets setup.
First, navigate to the администрирование вебхуков. This is accessible via Управление данными -> Вебхуки.
The configuration page appears as follows:
In this page you can specify endpoints for each type of comment event.
For each type of event, be sure to click Send Test Payload to ensure you've set up your integration correctly. See the next section, "Testing", for details.
Тестирование 
В админке Webhooks есть кнопки Send Test Payload для каждого типа события (Create, Update, Delete). События Create и Update отправляют тестовый объект WebhookComment, а при тестировании Delete отправляется тестовое тело запроса, содержащее только ID.
Проверка полезной нагрузки
При тестировании интеграции вебхуков убедитесь, что входящие запросы содержат следующие заголовки:
token- Ваш секрет APIX-FastComments-Timestamp- Unix-метка времени (в секундах)X-FastComments-Signature- подпись HMAC-SHA256
Используйте проверку подписи HMAC, чтобы убедиться в подлинности полезной нагрузки.
Инструменты тестирования
Вы можете использовать такие инструменты, как webhook.site или ngrok, чтобы просматривать входящие полезные нагрузки вебхуков во время разработки.
Типы событий
- Create Event: Вызывается при создании нового комментария. Метод по умолчанию: PUT
- Update Event: Вызывается при редактировании комментария. Метод по умолчанию: PUT
- Delete Event: Вызывается при удалении комментария. Метод по умолчанию: DELETE
Каждое событие включает полные данные комментария в теле запроса (см. Структуры данных для формата полезной нагрузки).
Структуры данных 
Единственная структура, отправляемая через вебхуки, — объект WebhookComment, описанный ниже на TypeScript.
Структура объекта WebhookComment
Структура события "create"
Тело запроса события "create" — объект WebhookComment.
Структура события "update"
Тело запроса события "update" — объект WebhookComment.
Структура события "delete"
Тело запроса события "delete" — объект WebhookComment.
Изменение от 14 ноября 2023 г.
Ранее тело запроса события "delete" содержало только идентификатор комментария. Теперь оно содержит полный комментарий на момент удаления.
Run 
Когда пользователи отмечаются в комментарии, информация хранится в списке mentions. Каждый объект в этом списке имеет следующую структуру.
Run 
HTTP-методы
Вы можете настроить HTTP-метод для каждого типа события вебхука в панели администратора:
- Событие «create»: POST или PUT (по умолчанию: PUT)
- Событие «update»: POST или PUT (по умолчанию: PUT)
- Событие «delete»: DELETE, POST или PUT (по умолчанию: DELETE)
Поскольку все запросы содержат ID, операции create и update по умолчанию идемпотентны (PUT). Повторение того же запроса create или update не должно создавать дубликаты объектов на вашей стороне.
Заголовки запроса
Каждый запрос вебхука включает следующие заголовки:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Ваш API Secret |
X-FastComments-Timestamp | Unix-метка времени (в секундах), когда запрос был подписан |
X-FastComments-Signature | HMAC-SHA256 подпись (sha256=<hex>) |
См. Безопасность и API-токены для информации о проверке HMAC-подписи.
Безопасность и API-токены 
Запросы вебхуков FastComments включают несколько механизмов аутентификации для безопасности.
Headers Sent
| Header | Description |
|---|---|
token | Ваш API Secret (для обратной совместимости) |
X-FastComments-Timestamp | Unix-временная метка (в секундах), когда запрос был подписан |
X-FastComments-Signature | HMAC-SHA256 подпись полезной нагрузки |
HMAC Signature Verification (Recommended)
Мы настоятельно рекомендуем проверять HMAC-подпись, чтобы убедиться, что полезные данные вебхука подлинны и не были изменены.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Проверяет, что метка времени свежая (в пределах 5 минут)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Защита от повторного воспроизведения (replay-атаки)
}
// Проверка подписи
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Проверяет, что метка времени свежая
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Проверка подписи
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Example Verification (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Проверяет, что метка времени свежая (в пределах 5 минут)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Проверка подписи
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Legacy Authentication
The token header containing your API Secret is still sent for backwards compatibility. However, we recommend migrating to HMAC verification for improved security as it protects against replay attacks.
Как это работает и обработка повторных попыток 
Все изменения объекта Comment в системе вызывают событие, которое попадает в очередь.
Изначальное событие вебхука обычно отправляется в течение шести секунд после возникновения источника события.
Вы можете отслеживать эту очередь в админ-панели Webhooks на случай, если ваш API выйдет из строя.
Если запрос к вашему API не удаётся, мы повторно поставим его в очередь по расписанию.
Это расписание — 1 Minute * the retry count. Если вызов не удастся один раз, запрос будет повторён через минуту. Если он не сработает дважды, повторная попытка будет через две минуты, и так далее. Это делается, чтобы не перегружать ваш API, если он выходит из строя по причинам, связанным с нагрузкой.
Webhooks можно отменить на странице журналов.
В заключение
На этом завершается наша документация по Webhooks.
Мы надеемся, что интеграция FastComments Webhook окажется понятной и быстрой в настройке.
Если вы считаете, что обнаружили какие-либо пробелы в нашей документации, сообщите нам об этом ниже.