வெப்ஹுக்குகள்
Polling செய்வதற்குப் பதிலாக, ஒரு run-க்கு webhook_url வழங்குங்கள். கோரிக்கை இறுதி நிலையை (succeeded, failed அல்லது
canceled) அடைந்ததும், அந்த URL-க்கு கையொப்பமிடப்பட்ட POST கோரிக்கையை அனுப்புகிறோம்.
curl -X POST "https://api.doitong.com/v1/run/{model_id}?webhook_url=https://example.com/hooks/doitong" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "..."}'
நிகழ்வு
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" } ]
}
}
typeஎன்பதுrequest.succeeded,request.failedஅல்லதுrequest.canceledஆகும்.dataஎன்பது முழு கோரிக்கைப் பொருள்;GET /requests/{id}திருப்பி வழங்குவது துல்லியமாக அதுவே.idஎன்பது ஒரு கோரிக்கைக்கும் அதன் இறுதி நிலைக்கும் நிலையானதாகும். ஏற்கனவே செயலாக்கிய விநியோகத்தைப் புறக்கணிக்க இதைப் பயன்படுத்துங்கள்.
விநியோகங்களும் மீண்டும் முயற்சிகளும்
10 வினாடிகளுக்குள் ஏதேனும் 2xx நிலைக்குறியீட்டுடன் பதிலளியுங்கள். வேறு எதுவாக இருந்தாலும் (அல்லது காலக்கெடு முடிந்தாலும்) மீண்டும் முயற்சிக்கப்படும்: மொத்தம் 6 முயற்சிகள் வரை,
30 வினாடிகள், 2 நிமிடங்கள், 10 நிமிடங்கள், 1 மணி மற்றும் 6 மணிநேரத்திற்குப் பிறகு. மெதுவான பணிகளைப் பதிலளித்த பிறகு செய்யுங்கள்; அதற்கு முன் செய்ய வேண்டாம்.
கையொப்பத்தைச் சரிபார்த்தல்
ஒவ்வொரு விசைக்கும் தனிப்பட்ட கையொப்ப ரகசியம் உள்ளது. அதை GET https://api.doitong.com/v1/account இலிருந்து (webhook_signing_secret,
whsec_ என்று தொடங்கும்) ஒருமுறை படித்து, விசைக்கு அருகில் சேமிக்கவும்.
Doitong-Signature தலைப்பு t=<unix time>,v1=<signature> வடிவில் இருக்கும்; இதில் கையொப்பம் உங்கள் ரகசியத்தை விசையாகப் பயன்படுத்தி
"<t>.<raw request body>"-ன் hex HMAC-SHA256 ஆகும். சரிபார்க்க:
- பெறப்பட்ட மூல உடல் பைட்டுகளை, எந்த JSON பாகுபடுத்தலுக்கும் முன், அப்படியே எடுத்துக்கொள்ளுங்கள்.
- உங்கள் ரகசியத்தைக் கொண்டு
t + "." + body-ன் HMAC-SHA256-ஐ சிற்றெழுத்து hex ஆகக் கணக்கிடுங்கள். - அதை
v1உடன் constant time முறையில் ஒப்பிடுங்கள். tஉங்கள் கடிகார நேரத்திலிருந்து 5 நிமிடங்களுக்கு மேல் விலகியிருந்தால் நிகழ்வை நிராகரிக்கவும் (மீண்டும் இயக்குதல் பாதுகாப்பு).
Node.js (Express) மற்றும் 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
குறிப்புகள்
- விரைவாகப் பதிலளித்து, உங்கள் சொந்த செயலாக்கத்தை வரிசைப்படுத்துங்கள்.
- run-ஐ தொடங்கிய API விசைக்கே ரகசியம் சொந்தமானது. வெவ்வேறு சேவைகளில் உள்ள விசைகளுக்கு வெவ்வேறு ரகசியங்கள் இருக்கும்.