Tīmekļa āķi
Tā vietā, lai periodiski pārbaudītu statusu, piešķiriet izpildei webhook_url. Kad pieprasījums sasniedz gala statusu (succeeded, failed vai
canceled), mēs uz šo URL nosūtām parakstītu POST pieprasījumu.
curl -X POST "https://api.doitong.ru/v1/run/{model_id}?webhook_url=https://example.com/hooks/doitong" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "..."}'
Notikums
POST /hooks/doitong HTTP/1.1
Content-Type: application/json
User-Agent: Doitong-Webhooks/1
Doitong-Request-Id: req_8k2m4q7x1z9c3v5b6n0p2r4t
Doitong-Signature: t=1760961609,v1=5f1c0d6e2b…
{
"id": "evt_8k2m4q7x1z9c3v5b6n0p2r4t_succeeded",
"object": "event",
"type": "request.succeeded",
"created_at": "2026-10-20T12:00:09Z",
"data": {
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"status": "succeeded",
"outputs": [ { "type": "video", "url": "https://content.doitong.com/dev-api/…/0-output.mp4" } ]
}
}
typeirrequest.succeeded,request.failedvairequest.canceled.datair pilns pieprasījuma objekts — tieši tāds, kādu atgriežGET /requests/{id}.idir stabils vienam pieprasījumam un tā gala statusam. Izmantojiet to, lai ignorētu piegādi, ko jau esat apstrādājis.
Piegādes un atkārtoti mēģinājumi
10 sekunžu laikā atbildiet ar jebkuru 2xx statusu. Viss pārējais (vai taimauts) tiek mēģināts atkārtoti: kopā līdz 6 mēģinājumiem
pēc 30 sekundēm, 2 minūtēm, 10 minūtēm, 1 stundas un 6 stundām. Lēnos darbus veiciet pēc atbildes nosūtīšanas, nevis pirms tās.
Paraksta pārbaude
Katrai atslēgai ir savs parakstīšanas noslēpums. Vienreiz nolasiet to no GET https://api.doitong.ru/v1/account (webhook_signing_secret,
tas sākas ar whsec_) un glabājiet kopā ar atslēgu.
Galvene Doitong-Signature ir t=<unix time>,v1=<signature>, kur paraksts ir hex formātā izteikts
HMAC-SHA256 no "<t>.<raw request body>", izmantojot jūsu noslēpumu kā atslēgu. Lai pārbaudītu:
- Paņemiet neapstrādātos pamatteksta baitus tieši tādus, kādi saņemti (pirms jebkādas JSON parsēšanas).
- Aprēķiniet
t + "." + bodyHMAC-SHA256 ar savu noslēpumu un iegūstiet rezultātu ar mazajiem burtiem hex formātā. - Salīdziniet to ar
v1nemainīgā laikā. - Noraidiet notikumu, ja
tatšķiras no jūsu pulksteņa par vairāk nekā 5 minūtēm (atkārtošanas aizsardzība).
Pilns saņēmēja piemērs Node.js (Express) un Python (Flask):
import crypto from "node:crypto";
import express from "express";
const SECRET = process.env.DOITONG_WEBHOOK_SECRET; // whsec_...
const app = express();
app.post("/hooks/doitong", express.raw({ type: "application/json" }), (req, res) => {
const header = req.get("Doitong-Signature") || "";
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
const t = Number(parts.t);
const expected = crypto.createHmac("sha256", SECRET).update(t + "." + req.body).digest("hex");
const given = Buffer.from(parts.v1 || "", "utf8");
const valid =
given.length === expected.length &&
crypto.timingSafeEqual(given, Buffer.from(expected, "utf8")) &&
Math.abs(Date.now() / 1000 - t) < 300;
if (!valid) return res.status(400).send("bad signature");
const event = JSON.parse(req.body);
if (event.type === "request.succeeded") {
console.log(event.data.id, event.data.outputs.map((o) => o.url));
}
res.sendStatus(204);
});
import hashlib
import hmac
import json
import os
import time
from flask import Flask, abort, request
SECRET = os.environ["DOITONG_WEBHOOK_SECRET"].encode() # whsec_...
app = Flask(__name__)
@app.post("/hooks/doitong")
def doitong_hook():
body = request.get_data() # raw bytes
parts = dict(p.split("=", 1) for p in request.headers.get("Doitong-Signature", "").split(",") if "=" in p)
t = parts.get("t", "0")
expected = hmac.new(SECRET, t.encode() + b"." + body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, parts.get("v1", "")) or abs(time.time() - int(t)) > 300:
abort(400)
event = json.loads(body)
if event["type"] == "request.succeeded":
print(event["data"]["id"], [o["url"] for o in event["data"]["outputs"]])
return "", 204
Padomi
- Atbildiet ātri un ievietojiet savus apstrādes darbus rindā.
- Noslēpums pieder API atslēgai, ar kuru tika sākta izpilde. Dažādos pakalpojumos izmantotām atslēgām ir atšķirīgi noslēpumi.