درخواستهای ترکیبی با چند بررسی
برای هر بررسی به یک فراخوانی API جداگانه نیاز ندارید. یک POST /api/v2/check میتواند بررسیهای متن، تصویر، واژههای نامناسب و آنتیویروس را بهصورت همزمان روی محتوای ترکیبی اجرا کند و یک پاسخ واحد با نتیجهای جداگانه برای هرکدام برگرداند. این کار کارآمدترین روش برای مدیریت و پالایش پستی است که همزمان کپشن، تصویر و پیوست دارد.
چرا همهچیز را در یک فراخوانی بررسی کنیم؟
ارسال کاربر معمولاً یک بسته است: متن بههمراه رسانه و لینکها. فراخوانی جداگانه API برای هر بخش یعنی رفتوبرگشت بیشتر، تأخیر بیشتر و مصرف سهمیه بیشتر. یک درخواست ترکیبی، بررسیهای فعالشده را بهصورت موازی اجرا میکند و یک حکم واحد در اختیار شما میگذارد تا بر اساس آن عمل کنید.
چطور چند بررسی را همزمان اجرا کنم؟
هر نوع محتوا را در content قرار دهید، بررسیهای موردنظر را در settings فعال کنید و نتایج هر بررسی را جداگانه بخوانید. هر بررسی فعالشده روی محتوای متناظر خودش اجرا میشود.
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"text": "Great deal, check my profile!",
"image_urls": ["https://example.com/post-image.jpg"],
"document_urls": ["https://example.com/attachment.pdf"]
},
"settings": {
"check_spam": true,
"check_sentiment": true,
"check_images": true,
"check_antivirus": true
}
}'
پاسخ
{
"has_violations": true,
"cached": false,
"results": {
"hits": true,
"spamfinder": { "label": "spam", "confidence": 0.91, "is_spam": true, "hit": true },
"sentiment": { "is_negative": false, "is_toxic": false, "score": 0.1, "hit": false },
"images": { "status": "OK", "porn": 0.02, "sexual": 0.05, "neutral": 0.93, "hit": false },
"antivirus": { "status": "OK", "hit": false, "details": [] }
},
"usage": {
"api_requests_used": 530,
"api_requests_limit": 10000,
"api_requests_remaining": 9470
}
}
نتیجه ترکیبی را چطور بخوانم؟
برای تصمیم کلی از has_violations استفاده کنید، سپس به هر results.<check>.hit نگاه کنید تا ببینید کدام بررسی فعال شده و چرا:
| فیلد | معنی |
|---|---|
has_violations |
اگر هر بررسی فعالشدهای محتوا را علامتگذاری کرده باشد True است — حکم یکخطی شما |
results.hits |
همان سیگنال کلی داخل شیء نتایج |
results.spamfinder.hit |
اسپم فعال شده است؛ وابسته به آستانه است، پس بر اساس hit تصمیم بگیرید نه مقدار خام is_spam |
results.sentiment.hit |
احساسات سمی/منفی بالاتر از آستانههای شماست |
results.images.hit |
یک تصویر از آستانه NSFW شما عبور کرده است |
results.antivirus.hit |
بدافزار در یک سند پیدا شده است |
results.badwords.hit |
یکی از واژههای نامناسب پیکربندیشده مطابقت داشته است |
results.skipped_features |
بررسیهایی که درخواست شدهاند اما اجرا نشدهاند؛ مثلاً قابلیتی که سهمیهاش تمام شده است |
فقط بررسیهایی که فعال کردهاید و محتوای متناظر داشتهاند در results ظاهر میشوند. بررسیای که محتوایی برای اجرا روی آن ندارد — مثل check_images بدون image_urls — بهسادگی اجرا نمیشود.
کدام محتوا با کدام بررسی جفت میشود؟
| بررسی | محتوایی که میخواند |
|---|---|
check_sentiment, check_spam, check_badwords, check_language |
content.text |
check_images |
content.image_urls |
check_antivirus |
content.document_urls |
یک درخواست واحد میتواند تا ۱۰ URL تصویر، ۵ URL سند و متنی تا ۱۰٬۰۰۰ نویسه را حمل کند. بخشهای یک ارسال را با هم بفرستید، نه اینکه آنها را بین چند فراخوانی تقسیم کنید.
درباره خطاهای جزئی چه باید کرد؟
اگر یکی از بررسیها خطا بدهد (مثلاً URL تصویر در دسترس نباشد)، بقیه همچنان پاسخ میدهند — نتایجی را که موفق بودهاند دریافت میکنید و بررسی ناموفق بهجای اینکه کل درخواست را شکست دهد، خطا یا نتیجه خالی خودش را گزارش میکند. برای هر بررسی جداگانه تصمیم بگیرید: بر اساس یک hit تأییدشده مسدود کنید، و مشخص کنید که بررسی خطاداده باید باز بماند یا برای بازبینی در صف قرار بگیرد.
بهترین روشها
فقط آنچه را نیاز دارید فعال کنید
هر بررسی فعالشده کار بیشتری اضافه میکند. بررسیهایی را روشن کنید که با محتوایی که واقعاً دریافت میکنید مطابقت دارند — اجرای check_antivirus روی پیامهای صرفاً متنی هیچ مزیتی ندارد.
اول یک حکم کلی، بعد بررسی جزئیات
برای مسیر سریع، ابتدا بر اساس has_violations شاخهبندی کنید، سپس فقط وقتی لازم است بدانید کدام بررسی فعال شده است، results را بررسی کنید (برای ثبت لاگ، اعتراضها یا ارجاع به بازبین مناسب).
const res = await check(content, settings);
if (!res.has_violations) return allow();
const r = res.results;
if (r.antivirus?.hit) return quarantine(); // most severe first
if (r.images?.hit) return blockMedia();
if (r.spamfinder?.hit || r.badwords?.hit) return shadowban();
return queueForReview(r);
مرتبط
- تحلیل متن — احساسات، اسپم و فیلدهای نتیجه متن
- تشخیص NSFW در تصویر — امتیازدهی تصویر و آستانهها
- اسکن آنتیویروس فایل — بررسیهای بدافزار در سند
- کدهای خطا و پاسخ — پوشش پاسخ و مدیریت سهمیه