Kako vam lahko pomagamo?

Na kratko nam povejte, za kaj gre – odgovorili vam bomo po e-pošti.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Na začetno stran

Webhooky: události na váš server

Podepsané webhooky a REST hooky z reactive.chat: události, hlavičky, tělo, ověření podpisu HMAC-SHA256, opakování, časové limity, deaktivace a příklady ověření v PHP, Node a Pythonu.

Webhooky vašemu serveru hlásí, co se děje v chatu: nová konverzace, nová zpráva, předání týmu, hodnocení. Existují dvě cesty:

Události

Konverzace z vyhledávání na webu (Smart Answer) vyvolávají události až poté, co se stanou viditelnými jako chat.

Nastavení podepsaného webhooku

V účtu pod Nastavení → Integrace → Webhooky (oprávnění: spravovat integrace):

Při uložení se neodesílá testovací volání. Po zapnutí může trvat přibližně 15 sekund, než začnou události proudit; události z doby před zapnutím se zpětně nedoručují.

Doručení

POST /rc-webhook HTTP/1.1
Host: hooks.your-company.com
Content-Type: application/json; charset=utf-8
User-Agent: reactive.chat-webhook/1.0
X-RC-Event: csat.submitted
X-RC-Delivery: 01JAB3C4D5E6F7G8H9JKMNPQRS
X-RC-Timestamp: 1792503600
X-RC-Signature: sha256=3f0a1c...

{"id":"01JAB3C4D5E6F7G8H9JKMNPQRS","event":"csat.submitted","ts":1792503600,"site_key":"ABCDEFGHJKLMNPQRSTUVWX12","conversation_id":"01JAB2...","session_id":"s_...","visitor_id":"v_...","data":{"score":5,"comment":"Very helpful"}}

Hlavičky:

Tělo:

Ověření podpisu

Ověřujte před jakýmkoli zpracováním: časové razítko nejvýše 300 sekund staré, podpis nad surovým tělem, porovnání v konstantním čase.

PHP:

<?php
$geheim = getenv('RC_WEBHOOK_SECRET');
$body   = file_get_contents('php://input');
$ts     = $_SERVER['HTTP_X_RC_TIMESTAMP'] ?? '';
$sig    = $_SERVER['HTTP_X_RC_SIGNATURE'] ?? '';

if (!ctype_digit($ts) || abs(time() - (int) $ts) > 300) { http_response_code(401); exit; }
$soll = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $geheim);
if (!hash_equals($soll, $sig)) { http_response_code(401); exit; }

$ereignis = json_decode($body, true);
// detect duplicates: remember $ereignis['id']
http_response_code(204);

Node.js (Express):

const crypto = require('crypto');
app.post('/rc-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-RC-Timestamp') || '';
  const sig = req.get('X-RC-Signature') || '';
  if (!/^\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(401);
  const soll = 'sha256=' + crypto.createHmac('sha256', process.env.RC_WEBHOOK_SECRET)
    .update(ts + '.' + req.body.toString('utf8')).digest('hex');
  if (sig.length !== soll.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(soll))) {
    return res.sendStatus(401);
  }
  const ereignis = JSON.parse(req.body.toString('utf8'));
  res.sendStatus(204);
  verarbeiteSpaeter(ereignis);   // respond quickly, work afterwards
});

Python (Flask):

import hmac, hashlib, os, time
from flask import request, abort

@app.post("/rc-webhook")
def rc_webhook():
    ts = request.headers.get("X-RC-Timestamp", "")
    sig = request.headers.get("X-RC-Signature", "")
    body = request.get_data()                      # raw bytes
    if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
        abort(401)
    soll = "sha256=" + hmac.new(os.environ["RC_WEBHOOK_SECRET"].encode(),
                                ts.encode() + b"." + body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(soll, sig):
        abort(401)
    return "", 204

Odpovědi, opakování, deaktivace

Odpovězte rychle kódem 2xx a zpracovávejte potom. Časové limity: 4 sekundy pro navázání spojení, celkem 10 sekund. Přesměrování se nenásledují.

Události starší než hodinu se už nedoručují. Pokud se chyby nahromadí (5 za 60 sekund), doručování na cíl se pozastaví na 30 sekund; úlohy se poté zkusí znovu. Chat na webhook nikdy nečeká.

Pořadí doručení není zaručeno. V případě potřeby řaďte podle ts nebo seq zpráv z API.

REST hooky (Zapier, Make, n8n)

Automatizační nástroje přihlašují cíle samy přes serverové API. Můžete to použít i přímo:

curl -X POST https://reactive.chat/v1/hooks \
  -H "Authorization: Bearer rc_live_..." \
  -H "Content-Type: application/json" \
  -d '{"event":"message.created","target_url":"https://hooks.your-company.com/rc","source":"n8n"}'

Doručení REST hooku:

POST https://hooks.your-company.com/rc
Content-Type: application/json
User-Agent: reactive.chat-n8n/1.0
X-RC-Event: message.created
X-RC-Delivery: 01JAB3...

{"event":"message.created","delivery_id":"01JAB3...","data":{"name":"message.created","ts":1792503600123,"site_key":"...","conversation_id":"...","session_id":"...","visitor_id":"...","message":{"id":"...","seq":7,"kind":"text","direction":"in","author_type":"bot","author_name":"Assistant","via":null,"body":"…","redacted":false,"ts":1792503600120}}}

Co neexistuje

Dále: Serverové API

Zadnja posodobitev: