Pāriet uz saturu
API rokasgrāmata

Tīmekļa āķi

Skatīt kā Markdown Atjaunināts

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.

terminālis
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

Pieprasījuma galvenes
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…
Pieprasījuma pamatteksts
{
  "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" } ]
  }
}
  • type ir request.succeeded, request.failed vai request.canceled.
  • data ir pilns pieprasījuma objekts — tieši tāds, kādu atgriež GET /requests/{id}.
  • id ir 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:

  1. Paņemiet neapstrādātos pamatteksta baitus tieši tādus, kādi saņemti (pirms jebkādas JSON parsēšanas).
  2. Aprēķiniet t + "." + body HMAC-SHA256 ar savu noslēpumu un iegūstiet rezultātu ar mazajiem burtiem hex formātā.
  3. Salīdziniet to ar v1 nemainīgā laikā.
  4. Noraidiet notikumu, ja t atšķ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);
});

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.