فحص تغطية النص البديل للصور
تقيس تغطية النص البديل عدد الصور التي تتضمن سمة alt موجودة وذات وصف مفيد ضمن القائمة المقدمة. تفحص هذه الأداة كل سجل من دون جلب الصورة أو الصفحة، وتحسب نسبة السجلات المقبولة، ثم تعرض كل مخالفة مع موضعها ومصدرها وقيمتها الأصلية عند وجودها وسبب الرفض. وهي مناسبة لفحوص SEO وإتاحة المحتوى القابلة للتكرار أثناء النشر والزحف ونقل المحتوى ومراحل الإصدار.
شغّل الأداة مجانًا
ما الذي توضحه نسبة التغطية
قد يجعل عدّ سمات alt الموجودة فقط مكتبة الصور تبدو أفضل من واقعها. فالسمة التي لا تحتوي إلا على مسافات، أو تحمل تسمية مثل «صورة»، أو تستخدم اسم ملف من الكاميرا لا تنقل موضوعًا مفيدًا. لذلك تعد الأداة الصورة مغطاة فقط عندما تكون قيمة alt غير فارغة ولا تطابق قائمة محافظة من العناصر النائبة العامة. تُحسب النسبة بقسمة عدد الصور المقبولة على العدد الإجمالي مع التقريب إلى منزلتين عشريتين. كما توضح قيمتا covered وtotal طريقة الحساب. تحتفظ مصفوفة offenders بموضع الإدخال ابتداءً من الصفر وبقيمة src المقدمة، لكي تتمكنوا من العثور على السجل في تصدير أداة زحف أو قاعدة محتوى أو قالب. هذه إشارة إلى التغطية وليست حكمًا على جودة الصياغة؛ فقد يمر وصف محدد لكنه غير صحيح لأن الأداة لا تفحص وحدات بكسل الصورة ولا سياق الصفحة المحيط بها.
كيفية تصنيف القيم المفقودة والفارغة والعامة
تحصل كل مخالفة على واحد من ثلاثة أسباب. يشير missing إلى أن السجل لا يتضمن خاصية alt أصلًا، وهو ما يعني غالبًا غياب سمة HTML. ويعني empty أن الخاصية موجودة، لكن لا تبقى فيها أحرف بعد إزالة المسافات المحيطة. وهذا الفرق مهم، لأن alt الفارغ عمدًا قد يكون صحيحًا لصورة زخرفية، مع أنه لا يدخل في مقياس التغطية الوصفية. أما generic فيشير إلى مطابقة قاعدة ضيقة للعناصر النائبة، مثل «صورة» أو «صورة مصغرة» أو «صورة 2» أو IMG_2048.jpg. تتجاهل المطابقة حالة الأحرف والمسافات المتكررة والواصلات والشرطات السفلية وعلامات الترقيم النهائية المناسبة. لا ترفض الأداة النص لمجرد قصره ولا تحاول التخمين الدلالي التقريبي. يحافظ هذا النهج المحافظ على نتائج حتمية قابلة للمراجعة وملائمة لحدود الإصدار الآلية من دون رفض أسماء منتجات مشروعة أو أوصاف موجزة للأيقونات.
استخدام قائمة المخالفات في مسار SEO
قدموا سجلات من أداة زحف أو تصدير CMS أو جرد للمكونات أو بيانات اختبار. يحتاج كل سجل إلى معرّف src غير فارغ، ويمكن أن يكون رابطًا كاملًا أو مسارًا نسبيًا أو مفتاحًا داخليًا. حقل alt اختياري كي يمثل غياب السمة بدقة. بعد الفحص، رتّبوا الإصلاحات بحسب السبب: يشير missing عادة إلى الترميز أو القيم الافتراضية، ويتطلب generic تحريرًا، بينما يحتاج empty إلى مراجعة بشرية للتمييز بين الصور الزخرفية والمحتوى المنسي. أعيدوا تشغيل القائمة بعد التصحيح، وقارنوا covered وtotal وpercentage في تقرير البناء أو سجل التدقيق. لا تستخدم الخوارزمية الشبكة أو تحليل الصور أو العشوائية أو الوقت الحالي، لذلك تنتج المدخلات المتطابقة مخرجات متطابقة دائمًا. تُرفض قائمة الصور الفارغة لأن النسبة من دون مشاهدات ستكون مضللة، وقد تجعل تعطل أداة الزحف يبدو وكأنه تدقيق صالح.
حالات الاستخدام
تدقيق تصدير أداة الزحف
حوّلوا مصادر الصور وسمات alt المستخرجة إلى نسبة تغطية وقائمة إصلاح دقيقة.
ضبط إصدار موقع إلكتروني
أوقفوا النشر عندما تنخفض التغطية الوصفية عن الحد الذي يعتمده فريقكم.
مراجعة نقل محتوى CMS
اكتشفوا السمات التي اختفت أو أصبحت فارغة أو تحولت إلى عناصر نائبة أثناء النقل.
الأسئلة الشائعة
متى تُعد الصورة مغطاة؟
تُعد مغطاة عندما تحتوي alt على نص غير المسافات ولا تطابق قواعد الأداة المحافظة للقيم العامة.
هل تُحتسب سمة alt الفارغة عمدًا؟
لا. تظهر بالسبب empty. قد تكون صحيحة للصور الزخرفية، لكن هذا المقياس يتطلب وصفًا غير فارغ.
هل تفحص الأداة الصور نفسها؟
لا. فهي تقيّم معرّفات src وسمات alt المقدمة فقط، ولذلك لا تؤكد أن الوصف يطابق الصورة.
لماذا تؤدي قائمة الصور الفارغة إلى خطأ؟
لا توجد نسبة ذات معنى من دون مشاهدات، كما يكشف الرفض فشل استخراج الصور أو سوء إعداده.
ما تكلفة طلب API؟
تكلفة كل طلب API هي $0.002. ويمكن تشغيل المنطق الحتمي نفسه مجانًا في المتصفح.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/seo/alt-text-coverage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}'const res = await fetch("https://api.kit.forhosting.com/seo/alt-text-coverage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/alt-text-coverage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/alt-text-coverage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"images":[{"src":"/team/alex.jpg","alt":"Alex presenting the quarterly roadmap"},{"src":"/products/blue-mug.jpg","alt":"image"},{"src":"/icons/search.svg","alt":""},{"src":"/charts/revenue.png","alt":"Monthly recurring revenue rose from January to June"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/alt-text-coverage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"images": [
{
"src": "/team/alex.jpg",
"alt": "Alex presenting the quarterly roadmap"
},
{
"src": "/products/blue-mug.jpg",
"alt": "image"
},
{
"src": "/icons/search.svg",
"alt": ""
},
{
"src": "/charts/revenue.png",
"alt": "Monthly recurring revenue rose from January to June"
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.alt_text_coverage",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |