API دبیر کلود
با چند درخواست HTTP، مقالهی کامل و سئوشده (با تصویر، FAQ و اسکیمای آن) بسازید و مستقیم در سایتتان منتشر کنید. همهی پاسخها JSON هستند.
https://cloud.ali-programmer.ir/api/v1شروع سریع
- در پنل پروژه بسازید (یا با API) و توکن پروژه را بردارید.
- مقاله سفارش بدهید؛ پاسخ فوری است و نوشتن در صف انجام میشود (۱ تا ۴ دقیقه).
- نتیجه را با Webhook دریافت کنید، یا وضعیت را بخوانید، یا با رابط دبیر مستقیم در سایت منتشر کنید.
curl -X POST {{BASE}}/articles \
-H "Authorization: Bearer dbc_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"گاندولا چیست و چه کاربردی دارد؟","keyword":"گاندولا","with_images":true}'
curl {{BASE}}/articles/42 -H "Authorization: Bearer dbc_YOUR_TOKEN"
احراز هویت و محدودیتها
همهی درخواستها (جز ساخت پروژه) هدر زیر را لازم دارند. توکن با dbc_ شروع میشود و فقط یک
بار، هنگام ساخت پروژه یا «ساخت توکن جدید»، نمایش داده میشود.
Authorization: Bearer dbc_YOUR_TOKEN Accept: application/json
| محدودیت | مقدار |
|---|---|
| درخواستهای API | ۶۰ در دقیقه برای هر IP |
| پیشنهاد موضوع | ۱۰ در دقیقه |
| ساخت پروژه | ۵ در دقیقه |
| توکن نامعتبر | ۲۰ تلاش ناموفق = ۱۵ دقیقه مسدود (پاسخ 429) |
| نوشتن مقاله | به اندازهی «حداکثر مقاله در دقیقه» در تنظیمات پروژه |
خطاها
| کد | یعنی |
|---|---|
401 |
توکن نیست یا نامعتبر است (code: unauthorized). |
403 |
پروژه معلق است (code: suspended). |
404 |
مقاله پیدا نشد (یا مال پروژهی شما نیست). |
422 |
ورودی نامعتبر؛ جزئیات در errors. یا عملیات در این وضعیت مجاز نیست (پیام در message).
|
429 |
درخواست بیش از حد؛ کمی بعد دوباره تلاش کنید. |
{
"message": "The title field is required.",
"errors": { "title": ["The title field is required."] }
}
ساخت پروژه
/projectsPOSTبدون توکن. هر لایسنس دبیر کلود فقط برای یک پروژه (یک دامنه) است و پیش از ساخت، روی سرور لایسنس بررسی میشود. دامنه بعداً قابل تغییر نیست.
| فیلد | توضیح |
|---|---|
name الزامی |
نام پروژه |
domain الزامی |
دامنهی سایت، مثل example.com |
license_key الزامی |
لایسنس دبیر کلود |
liara_api_key الزامی |
کلید API هوش مصنوعی لیارا |
liara_workspace_id الزامی |
شناسهی Workspace لیارا |
text_model، image_model اختیاری |
مدلهای لیارا |
output_mode اختیاری |
rich (حرفهای دبیر) ،
theme (پیروی از قالب سایت) ،
sample (مطابق مقالهی نمونهی سایت) |
webhook_url اختیاری |
فقط روی دامنهی خود پروژه |
{
"success": true,
"project_id": 7,
"api_token": "dbc_…",
"webhook_secret": "whsec_…"
}
api_token و webhook_secret فقط همین یک بار برگردانده
میشوند.
اطلاعات پروژه
/projectGETنام، دامنه، مدل متن، قالب خروجی، webhook و خطای لایسنس (اگر باشد).
سفارش مقاله
/articlesPOSTپاسخ 202 و شیء مقاله با وضعیت queued است. سه نوع
کار دارید:
type |
کار | نیاز |
|---|---|---|
article (پیشفرض) |
مقالهی جدید از صفر | — |
rewrite |
نسخهی تازه و یونیک از یک مقالهی دیگر | source_url |
refresh_light / refresh_full |
بهروزرسانی سبک یا بازنویسی کامل مقالهی قدیمی | current_content یا source_url یا remote_post_id |
فیلدها
| فیلد | توضیح |
|---|---|
title الزامی |
عنوان (حداکثر ۲۵۵) |
keyword الزامی |
کلیدواژهی اصلی |
keywords_secondary |
کلیدواژههای فرعی، جداشده با کاما |
tone |
formal (رسمی و آکادمیک) ،
professional (حرفهای و تخصصی) ،
conversational (محاورهای و ساده) ،
friendly (دوستانه و صمیمی) |
word_count |
۳۰۰ تا ۴۰۰۰ (پیشفرض ۱۰۰۰) |
meta_description |
متای دلخواه (خالی = دبیر مینویسد) |
instructions |
توضیح برای نویسنده (حداکثر ۲۰۰۰) |
internal_links / external_links |
هر خط یک لینک. اگر internal_links خالی باشد، دبیر از مطالب خود سایت لینک میدهد.
|
with_images |
true = ساخت تصویر (اولی تصویر شاخص است) |
image_count |
۱ تا ۴ (خالی = خودکار بر اساس طول) |
image_style |
flat_illustration ،
editorial_photo ،
product_photo ،
industrial ،
isometric ،
3d_render ،
line_art ،
watercolor |
image_size |
1024x1024 ،
1536x1024 ،
1024x1536 |
output_mode |
rich ،
theme ،
sample |
publish_at |
زمان تحویل، ISO 8601 با منطقهی زمانی، مثل 2026-10-25T09:00:00+03:30. مقاله زودتر
نوشته میشود و سر همین زمان به webhook/سایت میرسد.
|
source_url |
برای rewrite و refresh. آدرسهای داخلی شبکه پذیرفته نمیشوند. |
current_content |
HTML یا متن مقالهی قدیمی (refresh) |
remote_post_id |
شناسهی پست در سایت شما (refresh از طریق رابط دبیر) |
{
"type": "article",
"title": "راهنمای کامل خرید قفسهی فروشگاهی",
"keyword": "قفسه فروشگاهی",
"tone": "professional",
"word_count": 1500,
"with_images": true,
"image_style": "product_photo",
"image_size": "1536x1024",
"publish_at": "2026-10-25T09:00:00+03:30"
}
شیء مقاله
status |
یعنی |
|---|---|
queued |
در صف |
processing |
در حال نوشتن |
review |
نوشته شده، منتظر تأیید (اگر «تأیید دستی» روشن باشد) |
done |
آماده |
failed |
ناموفق؛ علت در error |
article فقط در وضعیت review و done پر است:
{
"data": {
"id": 42,
"type": "article",
"status": "done",
"title": "…",
"keyword": "…",
"source_url": null,
"error": null,
"tokens": 2913,
"generated_at": "2026-10-19T08:21:00+00:00",
"publish_at": null,
"delivered_at": "2026-10-19T08:21:05+00:00",
"remote_post_id": "131",
"remote_url": "https://example.com/blog/…",
"created_at": "…",
"article": {
"content": "<h2>…</h2>… (with visible FAQ)",
"content_without_faq": "… (if your theme renders faq itself)",
"css": "… (rich output only)",
"html": "<style>…</style> + content — ready to paste",
"output_mode": "rich",
"faq_schema": "<script type=\"application/ld+json\">…</script>",
"meta_description": "…",
"slug": "…",
"category": "…",
"faq": [{ "question": "…", "answer": "…" }],
"featured_image": { "url": "https://…/media/…webp", "alt": "…" },
"images": [{ "url": "…", "alt": "…" }]
}
}
}
faq_schema را در <head> صفحهی مقاله بگذارید. تصاویر روی
سرور دبیر کلود هستند؛ بهتر است آنها را در سایت خودتان کپی کنید (رابط دبیر این کار را خودکار انجام
میدهد).
فهرست و دریافت مقاله
/articles?status=done&since=2026-10-18T00:00:00Z&per_page=20GETصفحهبندیشده، جدیدترین اول. status یکی از وضعیتها؛ since = تغییرکرده از این
زمان؛ per_page تا ۵۰.
/articles/{id}GETیک مقاله. اگر Webhook ندارید، هر ۳۰ ثانیه تا چند دقیقه وضعیت را بخوانید.
تأیید، تلاش دوباره، حذف
/articles/{id}/approvePOSTفقط برای review؛ مقاله done میشود و تحویل (webhook / سایت) انجام میشود.
/articles/{id}/retryPOSTفقط برای failed؛ دوباره در صف میرود.
/articles/{id}DELETEمقاله و تصاویرش حذف میشوند. مقالهی در حال نوشتن قابل حذف نیست.
آمار مصرف
/usageGET
{ "success": true, "usage": { "total": 24, "done": 15, "review": 3, "pending": 2, "failed": 4,
"tokens": 70210, "tokens_this_month": 21900 } }
پیشنهاد موضوع
/suggestionsPOSTهمزمان است (۱۰ تا ۴۰ ثانیه). ورودی: {"topic": "قفسه فروشگاهی"}
{ "success": true, "titles": ["…", "…", "…"] }
Webhook
اگر آدرس Webhook در تنظیمات پروژه باشد (فقط روی دامنهی خود پروژه)، دبیر کلود یک POST با
بدنهی JSON میفرستد:
| رویداد | کی |
|---|---|
article.completed |
مقاله آماده شد (بعد از تأیید دستی، و در صورت زمانبندی، سر زمان publish_at) |
article.failed |
نوشتن ناموفق شد |
POST /your-webhook
Content-Type: application/json
X-Dabir-Event: article.completed
X-Dabir-Timestamp: 1760862000
X-Dabir-Signature: sha256=5f1c…
{"event":"article.completed","data":{ …article object… }}
امضا: HMAC-SHA256("{timestamp}.{body}", webhook_secret). همیشه امضا و تازگی (حداکثر ۵ دقیقه)
را بررسی کنید. پاسخ غیر 2xx تا ۵ بار با فاصلهی ۱، ۵، ۱۵ و ۶۰ دقیقه تکرار میشود؛ پس دریافت
را idempotent بنویسید (بر اساس data.id).
PHP
$secret = getenv('DABIR_WEBHOOK_SECRET');
$body = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_DABIR_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_DABIR_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
if (!ctype_digit($ts) || abs(time() - (int)$ts) > 300 || !hash_equals($expected, $sig)) {
http_response_code(401);
exit;
}
$payload = json_decode($body, true);
if ($payload['event'] === 'article.completed') {
$article = $payload['data']['article'];
// save $payload['data']['title'], $article['content'], $article['meta_description'] …
}
http_response_code(200);
Node.js
import crypto from 'node:crypto';
// use the RAW body (express.raw({ type: 'application/json' }))
function verify(rawBody, ts, sig, secret) {
const expected = 'sha256=' + crypto.createHmac('sha256',
secret).update(`${ts}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) <= 300;
return fresh && sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}
رابط دبیر (انتشار مستقیم در سایت)
به جای نوشتن کد Webhook، رابط دبیر را روی سایت نصب کنید تا دبیر کلود خودش مقاله را (با تصویر شاخص، دسته، متا و FAQ) در بلاگ ثبت کند، پستها و دستههای واقعی سایت را برای لینکسازی و جلوگیری از مقالهی تکراری بخواند و پستهای قدیمی را بهروز کند.
DabirBlog مینویسید.
فایل تکی PHP
برای هر سایت PHP 7.4+ با MySQL؛ فقط بخش CONFIG را پر میکنید.
راهاندازی
- پنل ← تنظیمات ← «انتشار مستقیم در سایت» ← روشن ← ذخیره؛ کلید رابط ساخته میشود.
- کلید را روی سایت بگذارید (
DABIR_CONNECTOR_SECRETدر.env، یا CONFIG فایل PHP). - آدرس رابط: لاراول
https://your-site.com/dabir-connector/ فایل PHPhttps://your-site.com/dabir-connector.php - «تست اتصال» را بزنید.
پروتکل
| درخواست | کار |
|---|---|
GET /ping |
سلامت و نسخه |
GET /site |
نام سایت، دستهها، ۳۰۰ پست آخر |
POST /posts |
ساخت پست (پاسخ 201 با id، url، status) |
GET /posts/{id} |
متن یک پست (برای بهروزرسانی) |
PUT /posts/{id} |
جایگزینی متن، متا و FAQ پست |
هر درخواست امضا دارد: X-Dabir-Signature: sha256=HMAC("{timestamp}.{METHOD}.{path}.{body}",
secret) و X-Dabir-Timestamp. رابط درخواستِ بدون امضای درست یا قدیمیتر از ۵
دقیقه را با 401 رد میکند، تصاویر را فقط با HTTPS از دامنهی دبیر کلود دانلود و بررسی
میکند، و تا کلید تنظیم نشده اصلاً فعال نیست.
نکات امنیتی
- توکن API مثل رمز است: فقط سمت سرور نگه دارید، هرگز در جاوااسکریپت مرورگر یا مخزن کد. اگر لو رفت، از پنل «ساخت توکن جدید» بزنید.
- امضای Webhook و زمان آن را همیشه بررسی کنید؛ بدون بررسی، هر کسی میتواند به آدرس شما مقالهی جعلی بفرستد.
- Webhook، رابط، نقشهی سایت و مقالهی نمونه فقط روی دامنهی خود پروژه پذیرفته میشوند و آدرسهایی که به شبکهی داخلی اشاره کنند رد میشوند.
- ورودها، تغییر تنظیمات و ساخت توکن در «فعالیتهای اخیر» پنل ثبت میشوند؛ اگر موردی را نمیشناسید، فوراً توکن را عوض کنید.