أتمتة IndexNow: بلّغ محركات البحث بعد النشر
مستوى القارئ: متوسط
لو بتنشر صفحة جديدة ومش عايز تنتظر الزحف العشوائي، الأوتوميشن هنا يخلي إشعار محركات البحث خطوة ثابتة بعد النشر.
المشكلة باختصار
الطريقة الشائعة إنك تنشر المقال أو صفحة المنتج وتسيب محركات البحث تكتشفها وقت ما تزحف على الموقع. الطريقة دي بتفشل لما عندك محتوى سريع التغير: أسعار، صفحات هبوط، توثيق منتج، أو مقالات يومية. ممكن الصفحة تبقى منشورة، لكن الاكتشاف يتأخر ساعات أو أيام حسب قوة الموقع ونمط الزحف.
ركز: IndexNow مش وعد بالترتيب، ومش بديل عن جودة المحتوى. هو مجرد إشعار إن URL اتضاف أو اتعدل أو اتحذف. المكسب إنك تقلل زمن الإبلاغ من مراجعة يدوية أسبوعية حوالي 35 دقيقة إلى تشغيل تلقائي بعد النشر في 2 إلى 3 دقائق. الافتراض إن عندك موقع static أو CMS يقدر يشغّل GitHub Actions بعد كل push أو publish event.
مثال بسيط قبل الشرح العلمي
لنفترض إن عندك متجر صغير. أضفت صفحة منتج جديدة: https://example.com/products/desk-lamp. بدل ما تدخل Search Console أو تنتظر الزحف، السكربت يعمل 3 حاجات: يتأكد إن الرابط كامل وموجود في sitemap، يرسل الرابط إلى IndexNow، ثم يحفظ log بالنتيجة. لو حصل فشل 429 أو 5xx، يعيد المحاولة لاحقًا بدل ما يضيع الإشعار.
بالظبط زي إنك تغيّر عنوان مكتبك وتبعت إخطار رسمي للبريد. الإخطار لا يضمن إن كل شخص هيزورك النهارده، لكنه يقلل فرصة إن الناس تفضل رايحة للعنوان القديم.
علميًا، sitemap هو ملف يعرّف محركات البحث بالروابط المهمة عندك، وIndexNow بروتوكول HTTP بسيط لإرسال URLs تغيرت. Google توضح إن sitemap مجرد hint وليس ضمانًا للزحف، وIndexNow يطلب مفتاحًا منشورًا على موقعك للتحقق من ملكية الإرسال.
الخطوات العملية
- اعمل مفتاح IndexNow عشوائيًا من 8 إلى 128 حرفًا، مثل
2f4a9c21-index-key. - انشر ملف المفتاح على جذر الموقع:
https://example.com/2f4a9c21-index-key.txt، ومحتواه نفس قيمة المفتاح. - تأكد إن
sitemap.xmlيستخدم روابط مطلقة، مش/pageفقط. - بعد النشر، استخرج الروابط التي تغيرت من ملف أو من آخر commit.
- أرسلها إلى endpoint يدعم IndexNow، واحفظ status code في log.
name: notify-indexnow
on:
push:
branches: [main]
paths:
- "content/**"
- "public/sitemap.xml"
workflow_dispatch:
jobs:
notify:
runs-on: ubuntu-latest
env:
SITE_HOST: example.com
INDEXNOW_KEY: ${{ secrets.INDEXNOW_KEY }}
steps:
- uses: actions/checkout@v4
- name: Pick changed URLs
id: urls
run: |
git fetch --depth=2 origin main
git diff --name-only HEAD~1 HEAD | awk '/^content\// {print}' > changed.txt
node scripts/changed-urls.js changed.txt > urls.json
cat urls.json
- name: Submit to IndexNow
run: |
curl -sS -X POST "https://api.indexnow.org/indexnow" \
-H "Content-Type: application/json" \
-d @- <