أداة فحص الروابط الخلفية للموقع: برامج نصية قابلة للجدولة
كل استدعاء هنا يعمل باستخدام curl أو أي عميل HTTP. استبدل المفتاح، واحتفظ بالنمط: الاستدعاء، الحفظ، المقارنة.
فريق أبحاث ArchiLinks ·

القواعد الأساسية
استدعاء واحد، فاتورة واحدة. يتم احتساب كل طلب مرة واحدة بغض النظر عن عدد الصفوف، ويعيد الاستدعاء الواحد ما يصل إلى 1,000 صف. يتوقف التصفح المتدرج العميق عند 50,000 صف، وتقبل المعلمة per قيمًا تتراوح بين 10 و 5,000.
هذا يغير طريقة كتابة البرامج النصية. اطلب per=1000 وصفّح فقط عند الحاجة إلى المزيد، لأن أداة فحص الروابط الخلفية للموقع المبنية على صفحات صغيرة تضاعف تكلفتك عشرة أضعاف دون أي فائدة. الأخطاء واضحة: HTTP 401 لمفتاح مفقود، و 402 عند نفاد الرصيد، ويحمل كل كائن JSON حقل ok.
قم بتشغيل كل برنامج نصي مرة واحدة يدويًا على نطاق صغير واقرأ ملف JSON. يجب أن تأتي أسماء الحقول، وحامل الصفوف، ومجالات التصفح المتدرج من استجابة حقيقية، وليس من أمثلة لدينا، لذا تأكد منها قبل أن يعتمد عليها جدول cron.
Python: حفظ لقطة تاريخية
يتم عرض أسماء الحقول في الاستجابة كمثال. اطبع استجابة واحدة قبل الاعتماد على مفتاح معين.
import json, sys, datetime, requests
BASE = "https://archilinks.com/api.php"
KEY = "sk_live_..."
def snapshot(domain, action="refdomains"):
r = requests.get(BASE, params={"action": action, "q": domain, "per": 1000, "key": KEY}, timeout=30)
if r.status_code in (401, 402):
sys.exit(f"API said {r.status_code}: check key or balance")
r.raise_for_status()
body = r.json()
assert body.get("ok"), body
name = f"{domain}-{action}-{datetime.date.today()}.json"
json.dump(body, open(name, "w"), indent=1)
print(name, body.get("_credits"))
snapshot(sys.argv[1])Node: تقييم DR جماعي لقائمة
تأخذ الدالة bulk_dr ما يصل إلى 2,000 نطاق مقابل 1 رصيد لكل استدعاء، عبر GET بمعامل domains أو عبر جسم الطلب POST. الفاصلة المنقوطة أدناه هي مجرد مثال؛ اختبرها بنطاقين أولاً. تدعم Node 18 أو أحدث دالة fetch مدمجة.
const domains = ["example.com", "example.org"];
const url = new URL("https://archilinks.com/api.php");
url.search = new URLSearchParams({
action: "bulk_dr",
domains: domains.join(","),
key: "sk_live_...",
});
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(JSON.stringify(await res.json(), null, 2));Bash و jq: مقارنة التغييرات الأسبوعية
احفظ لقطة مع التاريخ، ثم قارن بين ملفين. اجعل جدول cron أسبوعيًا أو شهريًا؛ حيث يتم تحديث الفهرس تقريبًا شهريًا.
# crontab: 0 6 1 * * /opt/seo/pull.sh old-shop.com
curl -s "https://archilinks.com/api.php?action=refdomains&q=$1&per=1000&key=$KEY" \
| jq -S . > "snap-$1-$(date +%F).json"
# compare two dated files
diff <(jq -S . snap-old-shop.com-2026-09-01.json) <(jq -S . snap-old-shop.com-2026-10-01.json) | head -50الإجراء المناسب لكل برنامج نصي
| البرنامج النصي | الإجراء | التكلفة لكل تشغيل | المخرجات |
|---|---|---|---|
| خط أساس للهجرة | toppages, refdomains | 4 أرصدة | ملفان بصيغة JSON |
| تنظيف حمل outreach | bulk_dr | 1 رصيد لكل استدعاء، حتى 2,000 نطاق | DR لكل هدف |
| تداخل المنافسين | intersect | 2 رصيد | مواقع تربط بـ 2–10 نطاقات |
| مراقبة النصوص الوصفية للروابط | anchors | 2 رصيد | قائمة النصوص الوصفية للروابط |
| فحص المحفظة | compare | 1 رصيد لكل استدعاء، حتى 20 نطاق | مقارنة المقاييس جنبًا إلى جنب |

معالجة الحالات الحدية
تفشل البرامج النصية في الحالات الحدية. خطط لها.
لف كل استدعاء في آلية إعادة المحاولة التي تنتظر وتتوقف بعد ثلاث محاولات، باستثناء 401 و 402، حيث لن تحل إعادة المحاولة أيًا منهما. سجل كائن _credits من كل استجابة موثقة، بحيث يظهر الارتفاع في الإنفاق في السجلات قبل أن يظهر في الرصيد، وحد الحلقات بحد أقصى صارم لعدد الصفحات.
احتفظ بلقطات في git أو تخزين كائنات مع التاريخ في اسم الملف. بسيط، ممل، وفعال. للهجرات، اربط هذه البرامج النصية بـ وصفة خريطة التوجيه و قائمة التحقق من الهجرة. يمكن لمستخدمي Google Sheets استدعاء نفس عناوين URL من Apps Script باستخدام UrlFetchApp، والجدول الذي يحتوي على محفز شهري هو مراقب جيد تمامًا.
أسئلة حول البرامج النصية
تظهر ثلاث أسئلة قبل نشر معظم البرامج النصية، ولكل منها إجابة موجزة.
كيف أتحقق من عدد الروابط الخلفية لموقعي، مجانًا؟
استدعاء إجراء النظرة العامة أو الإحصائيات بدون مفتاح. كلاهما مجاني ويعيد الإجماليات من فهرس الروابط الخاص بنا.
بالنسبة للقوائم خلف الإجماليات، تحتاج إلى مفتاح و 2 رصيد لكل استدعاء.
ماذا يحدث عندما ينفد الرصيد؟
تعيد واجهة برمجة التطبيقات HTTP 402. يجب أن يتوقف البرنامج النصي ويصدر تنبيهًا، وليس إعادة المحاولة في حلقة. قم بشحن الرصيد من صفحة الحساب باستخدام USDT (TRC-20) وأعد التشغيل.
هل يمكنني استدعاؤه من المتصفح؟
نعم. CORS مفتوح. ومع ذلك، لا تضع مفتاحًا في كود الواجهة الأمامية العام، حيث يمكن لأي شخص قراءته وإنفاق رصيدك.

التصفح المتدرج دون إهدار الأرصدة
التصفح المتدرج هو المكان الذي تتكبد فيه البرامج النصية تكاليف أعلى مما ينبغي. كل طلب صفحة هو استدعاء منفصل له شحنه الخاصة، لذا فإن الحلقة التي تطلب صفحة إضافية واحدة تدفع مقابل شيء لا فائدة منه.
اقرأ حقول التصفح المتدرج من استجابة حقيقية واحدة قبل كتابة الحلقة. تظهر الأمثلة على هذا الموقع الشكل، لكن الأسماء وإشارة التوقف تأتي من ملف JSON المباشر.
توقف عندما تعود الصفحة بصفوف أقل
الصفحة التي تحتوي على عدد أقل من الصفوف التي طلبتها هي عادةً الصفحة الأخيرة. دع الحلقة تتوقف هناك بدلاً من طلب صفحة إضافية للتأكد.
إذا حملت الاستجابة حقل total أو next-page، فاستخدمه كإشارة توقف. احسب الصفوف التي قمت بحفظها مقابل ذلك، بحيث يظهر أي عدم تطابق في السجل.
حدد حدًا لكل حلقة
حدد حدًا أقصى صارمًا لعدد الصفحات في كل حلقة. يحمي الحد رصيدك إذا تغير اسم حقل ما واستمر البرنامج النصي في طلب نفس الصفحة.
اختر الحد من الحجم المتوقع، ثم ارفعه عمدًا عندما يحتاج نطاق حقيقي إلى المزيد من الصفحات.
اكتب كل صفحة فور وصولها
احفظ كل صفحة على القرص بمجرد عودتها، مع رقم الصفحة في اسم الملف. البرنامج النصي الذي يتوقف عند الصفحة الأربعين يمكنه استئناف العمل من آخر ملف تم حفظه بدلاً من البدء من جديد ودفع التكلفة مرتين.
احتفظ بالملفات في مجلد واحد لكل نطاق وتاريخ، حتى لا تخلط إعادة التشغيل بين سحبتين مختلفتين.
تشغيل البرامج النصية حسب الجدول الزمني
أي مخطط زمني سيعمل. الأهم هو أن كل تشغيل يترك ملفًا خلفه، وأن التشغيل الفاشل يخبر شخصًا بذلك.
اختيار مضيف للعمل
يناسب cron الخادم الذي تتحكم في قرصه. يناسب مهمة CI المستودع الذي يحتفظ بالفعل بلقطات، بحيث يعيش التاريخ بجوار الكود الذي يقرأه.
بغض النظر عن اختيارك، احتفظ بقائمة النطاقات في ملف، بحيث يكون إضافة نطاق تعديلًا بدلاً من تغيير في البرنامج النصي.
إصدار التنبيه عند الفشل، وليس عند كل نجاح
أصدر تنبيهًا عندما يفشل البرنامج النصي، أو عندما ينخفض الرصيد دون مستوى اخترته. رسالة نجاح كل صباح تعتد الناس على تجاهل القناة التي تحمل المشكلة الحقيقية.
سجل كائن _credits من كل تشغيل، كما يفعل المثال في Python، وراجع الاتجاه مرة واحدة شهريًا.
مقارنة التغييرات الأسبوية في خمس خطوات
اختر الإجراءات
اختر الاستدعاءين أو الثلاثة الذين يجيبان على سؤالك. كل منها يكلف أرصدة، لذا اكتب التكلفة بجانبه.
احفظ الاستجابة الخام
احفظ ملف JSON كما وصل، مع اسم النطاق والتاريخ في اسم الملف. يمكن تأخير التنسيق حتى خطوة المقارنة.
رتب المفاتيح قبل المقارنة
استخدم jq -S أو ما يعادله، بحيث لا يظهر ترتيب المفاتيح كتغيير. المثال في bash أعلاه يفعل ذلك.
قارن القوائم، وليس الملفات
ادمج الاستجابتين على URL أو النطاق، ثم أبلغ عما تمت إضافته وإزالته وتغييره. ملف نصي خام طويل صعب العمل عليه.
راجع المقارنة وتصرف
أرسل النطاقات التي أزيلت كروابط إلى من يملك حمل outreach، والصفحات التي أزيلت إلى من يملك التوجيهات.
اختبار البرنامج النصي قبل أن يعتمد عليه جدول cron
البرنامج النصي الذي يعمل دون إشراف يجب أن يثبت نفسه أولاً. استخدم نطاقًا صغيرًا واحدًا، اقرأ ملف JSON الكامل، ثم وسع القائمة.
فحص سريع للسلامة هو مقارنة الإجماليات مع استدعاء النظرة العامة المجاني لنفس النطاق. لا تحتاج الأرقام إلى التطابق تمامًا مع القائمة المدفوعة، لكنها يجب أن تتفق في الحجم.
التشغيل بنطاقين
يختبر نطاقان الحلقة وأسماء الملفات ومسارات الأخطاء. يمكن لنطاق واحد أن ينجح بالصدفة، بينما يظهر نطاقان ما إذا كانت الحلقة تعيد تعيين نفسها بين النطاقات.
استخدم نطاقًا تعرفه جيدًا وآخر لا تعرفه، بحيث يمكنك الحكم على ما إذا كانت المخرجات تبدو صحيحة.
احتفظ بالمفتاح خارج السجلات والتذاكر
غالبًا ما تطبع البرامج النصية عنوان الطلب الكامل، ويوجد المفتاح في ذلك العنوان كعامل. احذف المفتاح من أي سطر يغادر الخادم، أو أرسله في رأس Authorization بدلاً من ذلك، مما يبقيه خارج العنوان.
إذا ظهر مفتاح في تذكرة أو مستودع عام، أوقف المهمة الجدولية التي تستخدمه قبل التشغيل التالي.
احتفظ بملاحظة قصيرة حول مكان وجود المفتاح، والبرامج النصية التي تقرأه، والخوادم التي تستدعيها. تلك الملاحظة هي ما تحتاجه عندما يسأل شخص ما من يمكنه إنفاق الرصيد.
اختيار الإجراء لكل سؤال
ابدأ من السؤال، وليس من قائمة نقاط النهاية. تحتاج الهجرة إلى معرفة أي عناوين URL تحمل روابط، بينما تحتاج قائمة outreach إلى درجات النطاق. مضيف واحد، سؤالان. كل منهما يكلف عددًا مختلفًا من الأرصدة.
اكتب التكلفة بجانب السؤال قبل كتابة أي كود. البرنامج النصي الذي يعمل أسبوعيًا يضاعف سعرًا صغيرًا في 52، وهذا الضرب سهل نسيانه حتى يظهر الرصيد.
إعادة المحاولة التي تتوقف عندما يجب
أعد محاولة الطلب الذي فشل لسبب مؤقت، مثل المهلة أو خطأ الخادم، لعدد صغير من المرات مع زيادة الفاصل الزمني بين المحاولات. لا تعيد محاولة 401 أو 402، لأن الانتظار لن يغير أيًا من الإجابتين.
سجل كل محاولة إعادة مع الإجراء والنطاق، بحيث يظهر نمط من الفشل كنمط وليس كصمت.
حدد عدد إعادة المحاولة في مكان واحد، بحيث تتبع كل استدعاء في البرنامج النصي القاعدة نفسها. تميل حلقات إعادة المحاوية المتفرقة إلى عدم الاتفاق مع بعضها البعض، وعدم الاتفاق هذا صعب العثور عليه في السجل.