قائمة IP للزواحف الموثَّقة: ابنِ قائمة سماح للبوتات الجيدة من 19 خلاصة رسمية
قائمة IP للزواحف الموثَّقة من 19 ملفاً رسمياً لـ10 مشغّلين: تواريخ الملفات وعدد البادئات وشيفرة قائمة السماح، وبوت موثَّق ما زال يسجّل review.

قاعدة جدار الحماية التي تتحدى حركة شبكات الاستضافة تلتقط أيضاً الزواحف التي تريدها. كل عنوان زاحف موثَّق استعلمنا عنه في 29 أكتوبر 2026 يقع على شبكة استضافة: ClaudeBot على Amazon، وDuckDuckGo على Microsoft، وAhrefsBot على OVH، وGooglebot على شبكة Google نفسها. خفّف القاعدة بحسب User-Agent بدلاً من ذلك، فيدخل كل كاشط يكتب «Googlebot» في ترويسته.
ينشر المشغّلون الدليل مجاناً، لكن في 19 ملفاً على 10 مواقع مختلفة، بتواريخ مختلفة ودون جدول تحديث معلن. وملفان منها هما القائمة نفسها. والحركة حقيقية. عند الإعلان عن تقرير Imperva للبوتات السيئة 2026، كتبت Thales: «تهيمن البوتات الآن على الإنترنت، إذ تمثل أكثر من 53% من كل حركة الويب، ويُصنَّف 40% منها خبيثاً» (ترجمة لنص إنجليزي).
فيما يلي كل ملف بالتاريخ الذي حمله في 29 أكتوبر 2026، وما تعيده واجهة استعلام IP في GeoIPHub لعناوين حقيقية منها، ونص برمجي يبني قائمة السماح، وفحص سياسة لا يخطئ مع الملفات المشتركة، والبوتات التي لا يغطيها أي ملف.

البوتات الجيدة مقابل السيئة: الفرق هو الدليل لا الاسم
البوت الجيد هو بوت قررت السماح له بالدخول، ويمكنك إثبات أن IP الخاص به يعود إلى مشغّله. والبوت السيئ يفشل في أي من الاختبارين، وأشيع أنواعه كاشط يرتدي User-Agent بوت جيد.
تشمل البوتات الجيدة زواحف البحث، وأدوات جلب البحث بالذكاء الاصطناعي وتلك التي يطلقها المستخدمون، وأدوات SEO، ومؤرشفي الويب. وتشمل البوتات السيئة الكاشطات، ومحشّي بيانات الاعتماد، وبوتات النقر، وبوتات البريد المزعج. تقول قواميس كثيرة إن البوتات الجيدة «تعرّف بنفسها». والبوتات السيئة تفعل ذلك أيضاً: تنسخ الهوية، وهذا هو سبب استعارة الكاشطات لأسماء الزواحف أصلاً.
لذا فالسؤال المفيد ليس «هل هذا بوت جيد؟» بل «هل هذا الطلب من المشغّل الذي يسمّيه؟». وهذا السؤال الثاني له جواب آلي، وهو لب كشف البوتات عبر IP: المشغّل يتحكم في نطاقات IP الخاصة به، ولا أحد غيره. أما هل تُدخل بوتاً ثبتت هويته فهي سياستك، وقد تختلف من موقع إلى آخر.
قائمة IP للزواحف الموثَّقة: 19 ملفاً رسمياً من 10 مشغّلين
تعمل كقائمة IP لبوتات محركات البحث وأكثر: فملفات النطاقات الـ19 التي يحمّلها GeoIPHub تأتي من 10 مشغّلين، من محركات البحث وشركات الذكاء الاصطناعي إلى أرشيف وأداة SEO. وفيما يلي كل ملف بعدد بادئاته والتاريخ المكتوب داخله، جُلبت في 29 أكتوبر 2026 بين 04:41 و04:42 UTC. أجابت الملفات الـ19 جميعاً بـHTTP 200 وتشترك في شكل واحد: مصفوفة prefixes من مدخلات ipv4Prefix أو ipv6Prefix.
| المشغّل | البوت (الملف) | رابط الملف | البادئات (IPv4 / IPv6) | التاريخ في الملف | crawler.name في الواجهة |
|---|---|---|---|---|---|
| الزواحف الشائعة، ومنها Googlebot | common-crawlers.json | 170 / 147 | 28 أكتوبر 2026 | Googlebot | |
| زواحف الحالات الخاصة، ومنها AdsBot | special-crawlers.json | 136 / 136 | 28 أكتوبر 2026 | GoogleSpecialCrawler | |
| أدوات الجلب التي يطلقها المستخدمون | user-triggered-fetchers.json | 534 / 534 | 28 أكتوبر 2026 | GoogleUserTriggeredFetcher | |
| أدوات الجلب التي يطلقها المستخدمون (google.com) | user-triggered-fetchers-google.json | 252 / 252 | 28 أكتوبر 2026 | GoogleUserTriggeredFetcherGoogle | |
| الوكلاء التي يطلقها المستخدمون (Google-Agent) | user-triggered-agents.json | 12 / 8 | 28 أكتوبر 2026 | GoogleUserTriggeredAgent | |
| Microsoft | Bingbot | bingbot.json | 28 / 0 | 3 يناير 2024 | Bingbot |
| Apple | Applebot | applebot.json | 24 / 0 | 15 سبتمبر 2026 | Applebot |
| DuckDuckGo | DuckDuckBot | duckduckbot.json | 486 / 0 | 1 سبتمبر 2026 | DuckAssistBot (انظر أدناه) |
| DuckDuckGo | DuckAssistBot | duckassistbot.json | 486 / 0 | 1 سبتمبر 2026 | DuckAssistBot |
| OpenAI | GPTBot | gptbot.json | 18 / 0 | 22 سبتمبر 2026 | GPTBot |
| OpenAI | ChatGPT-User | chatgpt-user.json | 235 / 0 | 27 أكتوبر 2026 | ChatGPTUser |
| OpenAI | OAI-SearchBot | searchbot.json | 39 / 0 | 2 يناير 2026 | OAISearchBot |
| Anthropic | ClaudeBot وClaude-User وClaude-SearchBot | bots.json | 14 / 0 | 20 أكتوبر 2026 | ClaudeBot |
| Perplexity | Perplexity-User | perplexity-user.json | 10 / 0 | 28 أكتوبر 2026 | PerplexityUser |
| Perplexity | PerplexityBot | perplexitybot.json | 13 / 0 | 28 أكتوبر 2026 | PerplexityBot |
| Mistral | MistralAI-User | mistralai-user-ips.json | 4 / 0 | 19 فبراير 2025 | MistralAIUser |
| Mistral | MistralAI-Index | mistralai-index-ips.json | 2 / 0 | 19 أبريل 2026 | MistralAIIndex |
| Common Crawl | CCBot | ccbot.json | 4 / 1 | 11 أغسطس 2026 | CCBot |
| Ahrefs | AhrefsBot | crawler-ip-ranges | 81 / 0 | لا تاريخ في الملف | AhrefsBot |
يعيد ماسح GeoIPHub جلب كل ملف يومياً. وفي 27 أكتوبر 2026 استعلمنا عن عنوان واحد من كل ملف، وعادت الملفات الـ19 كلها موثَّقة؛ وعنوانا Perplexity جاءا من الملفين اللذين استُبدلا في 28 أكتوبر.
هذا يعني 3,626 بادئة إجمالاً، وتحتوي ملفات Google الخمسة 2,181 منها. وهي أيضاً 18 قائمة متمايزة فقط: كان ملفا DuckDuckGo متطابقين بايتاً ببايت عند جلبهما (التجزئة MD5 نفسها). وتغير ملفا Perplexity بين 27 و28 أكتوبر، من 4 و8 بادئات إلى 10 و13، وهذا تحذير مستحق من نسخ جدول أي أحد، ومنه هذا الجدول، إلى ملف إعداد يدوياً.
أربع ملاحظات. مسار Google القديم، developers.google.com/search/apis/ipranges/googlebot.json، يجيب الآن بإعادة توجيه 301 إلى common-crawlers.json، فتظل الأدلة الأقدم التي تربط به تعمل إن كانت شيفرتك تتبع إعادة التوجيه. وملف Microsoft مؤرخ في يناير 2024. وما زالت وثائق Perplexity تربط بعناوين www.perplexity.com، التي تعيد التوجيه إلى ملفات www.perplexity.ai أعلاه. وwww.gstatic.com/ipranges/goog.json يغطي كل عناوين Google، فليس قائمة زواحف. وللاطلاع على كيف تتوزع ملفات Google الخمسة على مجموعات زواحفها، راجع دليلنا عن Googlebot.
ما تعيده المطابقة: أربعة استعلامات حقيقية
تعيد المطابقة في واجهة GeoIPHub القيمة threat.crawler.verified: true والمشغّل وتسمية الملف وverification_method: "ip_range_list". أما عنوان خارج كل الملفات فيعيد verified: false، ومعناها «غير موثَّق»، لا أكثر. وهذا عنوان ClaudeBot، مختصراً من الاستجابة الحية (29 أكتوبر 2026، 04:42:21 UTC):
{
"asn": {
"asn": 16509,
"org": "AMAZON-02 - Amazon.com, Inc."
},
"threat": {
"is_crawler": true,
"crawler": {
"verified": true,
"name": "ClaudeBot",
"operator": "Anthropic",
"category": "ai",
"verification_method": "ip_range_list"
}
},
"scoring": {
"fraud_score": 0,
"recommended_action": "allow",
"detection_methods": ["datacenter_ip", "no_ptr_datacenter", "verified_crawler"]
}
}
لم يُعِد dig -x 216.73.216.10 أي سجل PTR في 29 أكتوبر 2026، فلا يستطيع DNS العكسي أن يزكّي هذا العنوان. ملف Anthropic وحده يستطيع. وثلاثة عناوين أخرى استُعلم عنها بين 04:42:28 و04:42:44 UTC:
| IP | من | verified | operator | name | category | الدرجة، الإجراء |
|---|---|---|---|---|---|---|
| 216.73.216.10 | ملف Anthropic | true | Anthropic | ClaudeBot | ai | 0، allow |
| 107.178.192.1 | ملف أدوات الجلب التي يطلقها المستخدمون لدى Google | true | GoogleUserTriggeredFetcher | fetcher | 0، allow | |
| 104.43.54.127 | ملفا DuckDuckGo كلاهما | true | DuckDuckGo | DuckAssistBot | ai | 0، allow |
| 31.13.64.1 | شبكة Meta، AS32934 | false | Meta | Facebook-Bot | social_preview | 0، allow |
لنتتبع الآن طلباً واحداً. افترض أن طلباً يدّعي DuckDuckBot من 104.43.54.127، وهو عنوان مدرج كـ/32 في ملفي DuckDuckGo كليهما. يقول الاستعلام verified: true وoperator: "DuckDuckGo"، لكن name: "DuckAssistBot" وcategory: "ai". فسياسة مكتوبة بصيغة «اسمح لبوتات البحث وحدّد معدل بوتات الذكاء الاصطناعي» ومبنية على الاسم أو الفئة ستخنق زاحف البحث الحقيقي لدى DuckDuckGo. أما إن بُنيت على البوت المُدّعى ومشغّله فتمرّره. توقعنا اسم DuckDuckBot فحصلنا على DuckAssistBot: أخبرنا حقل الاسم أي ملف حُمّل أخيراً، لا أي بوت طرق الباب.
Meta هي الفخ الآخر. نطابق شبكة Meta (AS32934) عبر ASN، فتكون is_crawler تساوي true لكن verified تساوي false وverification_method تساوي "none". عامله كغير موثَّق. وتسرد وثائقنا حقول الزاحف ومعنى كل منها.
قد يغطي ملف واحد عدة بوتات، فابنِ سياستك على المشغّل
طابِق User-Agent المُدّعى بمشغّل، ثم اشترط verified: true والمشغّل نفسه. لا تستخدم crawler.name أو category كمفتاح تبديل أبداً، لأن ملفاً واحداً قد يمثل عدة بوتات:
- DuckDuckGo: ملفان، قائمة واحدة. يحمّل الماسح لدينا
duckassistbot.jsonثانياً، فيفوز آخر ما كُتب ويحمل كل عنوان DuckDuckGo تسمية DuckAssistBot. - Anthropic: ملف واحد لـClaudeBot وClaude-User وClaude-SearchBot. تقول صفحة مساعدة الزواحف لدى Anthropic: «إذا كان لزاحف عنوان IP مصدر في هذه القائمة، فهذا يعني أن الزاحف قادم من Anthropic» (ترجمة لنص إنجليزي). فالمطابقة تعني موثَّق كـAnthropic؛ ويخبرك User-Agent أي بوت.
- Google: يغطي ملف الزواحف الشائعة عدة زواحف لـGoogle تحت تسمية واحدة هي Googlebot.
كما أن is_crawler وحدها ليست قوية بما يكفي لقائمة سماح، إذ إنها true لمطابقة Meta غير الموثَّقة. والواجهة لا ترى ترويسات طلبك أبداً. إنها تأخذ IP، فجانب الادعاء من الفحص يعمل دائماً في شيفرتك.
كيف تبني قائمة سماح للزواحف في أربع خطوات
ابنِها في أربع خطوات: اربط كل User-Agent تسمح به بمشغّله، وحمّل ملفات ذلك المشغّل، وافحص IP مقابلها، وأرسل كل ادعاء يفشل إلى محدِّد المعدل.
- خريطة الادعاءات. اسرد رموز User-Agent التي تسمح بها (تسميها WAF الأقدم قائمة بيضاء) والمشغّل الذي يجب أن يحتوي ملفه على IP.
- الملفات. إما أن تبني قائمتك المدمجة بالنص البرمجي أدناه، أو تستدعي استعلاماً واحداً لكل IP جديد وتخزّن الحكم مؤقتاً لبضع ساعات، لا أسابيع، لأن النطاقات تتغير.
- المطابقة. افحص IP مقابل بادئات المشغّل المُدّعى فقط.
- مسار غير الموثَّق. لا تجب عليه بـ403. حدّد معدل ما لا تستطيع التحقق منه، ليتباطأ زاحف حقيقي على بادئة جديدة بدلاً من أن يختفي.
لماذا لكل مشغّل لا لكل ملف؟ لأن بعض المشغّلين يجعلون التثبيت لكل ملف مستحيلاً. تتشارك بوتات Anthropic الثلاثة ملفاً واحداً، ويتشارك بوتا DuckDuckGo قائمة واحدة، فالفحص الذي يشترط «ملف Claude-SearchBot الخاص» لا يجد ما يطابقه. والمطابقة على مستوى المشغّل تخسر قليلاً من الدقة في Google وOpenAI وPerplexity وMistral، حيث الملفات منفصلة، وفي المقابل لا تخطئ أبداً مع ملف مشترك.
قاعدتان. طابِق البادئات المنشورة الدقيقة، لا ASN أبداً: ففي استعلاماتنا يحمل AS8075 لدى Microsoft كلاً من Bingbot وGPTBot وChatGPT-User وDuckDuckGo، فالسماح له يُدخل كل عميل Azure. ولا تسمح بالاعتماد على User-Agent وحده أبداً. أما البوتات التي لا ملف لها فاستخدم DNS العكسي المؤكَّد بالتحويل الأمامي حيث يوثّقه المشغّل.
يجلب المُنشئ الملفات الـ19 كلها، ويجمّع البادئات حسب المشغّل، ويكتب allowlist.json بوقت جلب لكل ملف. وإذا فشل تنزيل ملف، أو فشل تحليله، أو عاد فارغاً، أو تقلّص إلى أقل من نصف آخر نسخة سليمة منه، احتفظ ببادئاته السابقة. ويفعل ماسح GeoIPHub الشيء نفسه بحد أدنى ثابت لعدد البادئات لكل ملف.
// build-allowlist.mjs: Node 18+, no dependencies. Run once a day.
import fs from "node:fs";
const FEEDS = {
Google: [
"https://developers.google.com/static/crawling/ipranges/common-crawlers.json",
"https://developers.google.com/static/crawling/ipranges/special-crawlers.json",
"https://developers.google.com/static/crawling/ipranges/user-triggered-fetchers.json",
"https://developers.google.com/static/crawling/ipranges/user-triggered-fetchers-google.json",
"https://developers.google.com/static/crawling/ipranges/user-triggered-agents.json",
],
Microsoft: ["https://www.bing.com/toolbox/bingbot.json"],
Apple: ["https://search.developer.apple.com/applebot.json"],
DuckDuckGo: [
"https://duckduckgo.com/duckduckbot.json",
"https://duckduckgo.com/duckassistbot.json",
],
OpenAI: [
"https://openai.com/gptbot.json",
"https://openai.com/chatgpt-user.json",
"https://openai.com/searchbot.json",
],
Anthropic: ["https://claude.com/crawling/bots.json"],
Perplexity: [
"https://www.perplexity.ai/perplexity-user.json",
"https://www.perplexity.ai/perplexitybot.json",
],
Mistral: [
"https://mistral.ai/mistralai-user-ips.json",
"https://mistral.ai/mistralai-index-ips.json",
],
CommonCrawl: ["https://index.commoncrawl.org/ccbot.json"],
Ahrefs: ["https://api.ahrefs.com/v3/public/crawler-ip-ranges"],
};
const OUT = "allowlist.json";
const previous = fs.existsSync(OUT)
? JSON.parse(fs.readFileSync(OUT, "utf8"))
: { files: {} };
const files = {};
for (const [operator, urls] of Object.entries(FEEDS)) {
for (const url of urls) {
try {
const res = await fetch(url, { signal: AbortSignal.timeout(15000) });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const body = await res.json();
const prefixes = (body.prefixes || [])
.map((p) => p.ipv4Prefix || p.ipv6Prefix)
.filter(Boolean);
if (prefixes.length === 0) throw new Error("no prefixes in file");
const last = previous.files[url];
// A real shrink this large is rare: check it by hand before you trust it.
if (last && prefixes.length < last.prefixes.length / 2) {
throw new Error(`${prefixes.length} prefixes, last good copy had ${last.prefixes.length}`);
}
files[url] = {
operator,
prefixes,
file_date: body.creationTime || null,
fetched_at: new Date().toISOString(),
};
} catch (err) {
// Fail safe: a broken fetch keeps yesterday's prefixes for that file.
if (previous.files[url]) files[url] = previous.files[url];
console.error(`${url}: ${err.message}; ${files[url] ? "kept previous prefixes" : "no previous copy"}`);
}
}
}
fs.writeFileSync(`${OUT}.tmp`, JSON.stringify({ built_at: new Date().toISOString(), files }, null, 1));
fs.renameSync(`${OUT}.tmp`, OUT);
console.log(`${Object.keys(files).length} files written to ${OUT}`);
جدوِله بسطر cron واحد، مثل 20 5 * * * cd /srv/bots && node build-allowlist.mjs. يقرأ فحص السياسة إما ذلك الملف أو استجابة استعلام، ويعتمد المساران على مشغّل البوت المُدّعى:
// check-claim.mjs: decide whether a bot claim is proven.
import net from "node:net";
// Claimed User-Agent token, and the operator whose file must contain the IP.
// Not exhaustive; add the bots you allow.
const CLAIMS = [
["googlebot", "Google"], ["adsbot-google", "Google"], ["google-agent", "Google"],
["bingbot", "Microsoft"], ["applebot", "Apple"],
["duckduckbot", "DuckDuckGo"], ["duckassistbot", "DuckDuckGo"],
["gptbot", "OpenAI"], ["oai-searchbot", "OpenAI"], ["chatgpt-user", "OpenAI"],
["claudebot", "Anthropic"], ["claude-searchbot", "Anthropic"], ["claude-user", "Anthropic"],
["perplexitybot", "Perplexity"], ["perplexity-user", "Perplexity"],
["mistralai-user", "Mistral"], ["mistralai-index", "Mistral"],
["ccbot", "CommonCrawl"], ["ahrefsbot", "Ahrefs"],
];
function findClaim(userAgent) {
const ua = (userAgent || "").toLowerCase();
return CLAIMS.find(([token]) => ua.includes(token)) || null;
}
// Path 1: your own allowlist.json from build-allowlist.mjs.
export function loadLists(allowlist) {
const lists = {};
for (const file of Object.values(allowlist.files)) {
lists[file.operator] ||= new net.BlockList();
for (const cidr of file.prefixes) {
const [addr, len] = cidr.split("/");
lists[file.operator].addSubnet(addr, Number(len), net.isIPv6(addr) ? "ipv6" : "ipv4");
}
}
return lists;
}
export function checkWithLists(userAgent, ip, lists) {
const claim = findClaim(userAgent);
if (!claim) return { claimed: null, verified: false };
const family = net.isIPv6(ip) ? "ipv6" : "ipv4";
return { claimed: claim[0], verified: lists[claim[1]]?.check(ip, family) === true };
}
// Path 2: one lookup per new IP, using the API's crawler fields.
export async function lookup(ip, apiKey) {
try {
const res = await fetch(`https://api.geoiphub.com/v1/lookup/${ip}`, {
headers: { "x-api-key": apiKey },
signal: AbortSignal.timeout(2000),
});
return res.ok ? await res.json() : null;
} catch {
return null; // a failed lookup proves nothing: treat it as unverified
}
}
export function checkClaim(userAgent, result) {
const claim = findClaim(userAgent);
if (!claim) return { claimed: null, verified: false };
const c = result?.threat?.crawler;
return { claimed: claim[0], verified: c?.verified === true && c?.operator === claim[1] };
}
شغّلنا المسارين كليهما على ملفات واستعلامات 29 أكتوبر 2026، إضافةً إلى حالات الفشل. تستخدم حالة GPTBot العنوان 45.33.32.156، مضيف الاختبار العام لـNmap، الذي لم يرسل طلباً كهذا قط. والفحص لكل مشغّل لا لكل بوت: فادعاء Googlebot من عنوان في ملف أدوات الجلب لدى Google يمرّ أيضاً كـGoogle.
PASS ClaudeBot UA, 216.73.216.10 verified (name ClaudeBot)
PASS Claude-SearchBot UA, 216.73.216.10 verified as Anthropic (name ClaudeBot)
PASS DuckDuckBot UA, 104.43.54.127 verified (name DuckAssistBot)
PASS AhrefsBot UA, 5.39.1.230 verified
PASS Googlebot UA, 66.249.66.1 verified
PASS GPTBot UA, 45.33.32.156 not verified (no file match)
PASS ChatGPT-User UA, 66.249.66.1 not verified (operator is Google)
PASS facebookexternalhit UA, 31.13.64.1 no claim in the map
PASS Browser UA, 216.73.216.10 no claim
PASS Lookup error, ClaudeBot UA not verified
10/10 passed, lookup path and allowlist path agree
builder, bots.json forced to fail: kept previous prefixes (14)
builder, bingbot.json returns HTML: kept previous prefixes (28)
builder, applebot.json returns []: kept previous prefixes (24)
builder, chatgpt-user.json shrinks to 1: kept previous prefixes (235)
تلك الشيفرة هي جانب السماح. ولفرض سياسة حظر لكل بوت، راجع إعداد nginx وExpress في دليلنا عن زواحف الذكاء الاصطناعي.
هل يمكن لبوت موثَّق أن يظل بوتاً سيئاً؟ AhrefsBot يقول نعم
نعم. يثبت التحقق من يشغّل العنوان، لا أن العنوان نظيف أو مرحَّب به. يُظهر عنوان AhrefsBot 5.39.1.230 الأمرين معاً (29 أكتوبر 2026، 04:42:51 UTC):
| الحقل | القيمة |
|---|---|
threat.crawler.verified | true |
threat.crawler.operator | Ahrefs |
threat.crawler.category | seo |
threat.is_spammer | true |
threat.dnsbl_sources | zen.spamhaus.org |
scoring.fraud_score | 35 |
scoring.recommended_action | review |
scoring.detection_methods | datacenter_blocklisted, no_ptr_datacenter, verified_crawler, known_spammer |
تطرح إشارة الزاحف الموثَّق 28.5 نقطة (ناقص 30 بثقة 0.95)، لكنها لا تلغي إدراجاً في قائمة حظر؛ ويعرض دليل أسباب درجة المخاطر الحساب. حفظنا قيمتين سابقتين لهذا العنوان: 59، step_up في 19 أكتوبر، حين انطلق أيضاً إدراج إساءة، و35، review منذ 22 أكتوبر. وحين حققنا في هذا العنوان في 19 أكتوبر، أظهر سجل RIPE أن الـ/27 مسجَّلة لـAhrefs داخل كتلة OVH.
قائمة السماح لديك تقرر هل يدخل AhrefsBot. وتخبرك الدرجة أن لنطاقه تاريخاً. كثير من المواقع لا حاجة له بزواحف SEO وكثير منها يحتاجها، فالقرار قرارك.
بوتات جيدة تتجاهل robots.txt بالتصميم
«يلتزم بـrobots.txt» ليس اختباراً للبوت الجيد، لأن المشغّلين أنفسهم يقولون إن أدوات الجلب التي يطلقها المستخدمون قد لا تتبعه:
- Google: «لأن الجلب طُلب من مستخدم، فإن أدوات الجلب هذه تتجاهل عموماً قواعد robots.txt» (ترجمة لنص إنجليزي). (أدوات جلب Google التي يطلقها المستخدمون)
- OpenAI، عن ChatGPT-User: «لأن هذه الإجراءات يبدؤها مستخدم، قد لا تنطبق قواعد robots.txt» (ترجمة لنص إنجليزي). (بوتات OpenAI)
- Perplexity، عن Perplexity-User: «بما أن مستخدماً طلب الجلب، فإن أداة الجلب هذه تتجاهل عموماً قواعد robots.txt» (ترجمة لنص إنجليزي). (زواحف Perplexity)
المنطق واحد في الثلاثة: الجلب يعمل لصالح شخص واحد، فحظره يحظر طلب ذلك الشخص. وأداة جلب موثَّقة تتخطى robots.txt لديك تتصرف كما هو موثق، لا تسيء التصرف.
يطلب robots.txt؛ وقائمة السماح تفرض. إذا أردت إخراج أداة جلب يطلقها المستخدم، فأنت بحاجة إلى قاعدة عند الحافة، لا إلى سطر في ملف نصي. وللاطلاع على ما يفعله كل بوت من OpenAI وكلفة حظر كل منها، راجع مقارنتنا لبوتات OpenAI.
ما مدى حداثة القائمة؟ تواريخ الملفات وجلب يومي وتأخر يومين
القائمة بحداثة آخر تعديل للمشغّل مضافاً إليه جلبك. وفي واجهة GeoIPHub، هذا جلب يومي ويصل إلى نحو يومين قبل أن يصبح التغيير حياً.
وهذه هي الآليات، من شيفرة ماسح GeoIPHub وإعداداته، بعد التحقق في 29 أكتوبر 2026. تجلب خطوة الزاحف كل ملف مرة واحدة يومياً على الأكثر. فإذا فشل جلب، أو أعاد بادئات أقل من الحد الأدنى لذلك الملف، احتفظ الماسح بآخر نطاقات سليمة. والبادئة التي يزيلها المشغّل تتوقف عن التحقق بعد الجلب السليم التالي وإعادة البناء اليومية التي تليه. ثم تُعاد بناء قاعدة بيانات الاستعلام يومياً عند 00:00 UTC وتصبح حية بحلول نحو 04:00 UTC.
القاعدة العملية: خزّن حكماً موثَّقاً لساعات، وأعد جلب الملفات يومياً، وتوقع أن تفشل بادئة مضافة حديثاً في التحقق لنحو يومين. وهذا سبب آخر لتوجيه مسار غير الموثَّق إلى محدِّد معدل لا إلى حظر.
Perplexity هي المشغّل الوحيد في فحوصنا الذي تقول وثائقه شيئاً عن الوتيرة: «تُحدَّث هذه العناوين بانتظام ويجب أن تكون المصدر المرجعي لإعدادات WAF لديك» (ترجمة لنص إنجليزي). ولا تذكر صفحة التحقق لدى Google تواتراً. تراوحت تواريخ الملفات التي جلبناها في 29 أكتوبر 2026 من يناير 2024 (Microsoft) إلى 28 أكتوبر 2026 (Google وPerplexity). والتاريخ الثابت ليس خطأً؛ فبعض الأساطيل لا يتحرك.
ثغرة واحدة من جانبنا: لا تُظهر الواجهة أي ملف طابق ولا متى جلبناه. وإذا كنت تحتاج مسار التدقيق هذا، فشغّل المُنشئ واحتفظ بقيم fetched_at الخاصة به.
بوتات لا قائمة منشورة لها، وما العمل حيالها
بعض البوتات التي قد تريدها لا تنشر ملفاً يحمّله GeoIPHub، فلا تستطيع هذه القائمة التحقق منها:
- OAI-AdsBot: توثّقه OpenAI وتنشر adsbot.json، لكن ماسحنا لا يحمّله بعد. أضفه إلى مُنشئك إن كنت تشغّل إعلانات على ChatGPT.
- Amazonbot: تعرض Amazon نطاقاتها داخل صفحة ويب، دون ملف للتنزيل. لا نحمّله.
- Meta: تقول صفحة الزواحف لدى Meta: «أضف إلى قائمة السماح لديك إما سلاسل User-Agent أو عناوين IP (وهو الأكثر أماناً) التي يستخدمها الزاحف»، لكنها لا تعطي ملف نطاقات (ترجمة لنص إنجليزي). نطابق شبكتها عبر ASN فقط، دون توثيق.
- Yandex وBaidu: DNS عكسي فقط. يصف دليل Yandex الفحص: يجب أن ينتهي اسم DNS العكسي بـyandex.ru أو yandex.net أو yandex.com، وأن يعيد البحث الأمامي لذلك الاسم IP نفسه.
- Bytespider: لم نجد ملف نطاقات من ByteDance.
- مراقبات التوفر وخطافات الدفع: كثير منها ينشر قوائمه الخاصة. تنشر Stripe عناوين خطافات الويب كـJSON، موثقة في صفحة عناوين IP. استخدم قائمة المزوّد؛ فهذه ليست زواحف وليست في خلاصاتنا.
- البوتات التي توقّع الطلبات: يتيح Web Bot Auth للبوت إثبات نفسه بتوقيع تشفيري بدلاً من IP، وهو مغطى في دليلنا للتحقق من الزواحف. ويقبل دليل البوتات الموثَّقة لدى Cloudflare بوتاً يتحقق منه إما Web Bot Auth أو قائمة IP منشورة مع User-Agent ثابت.
ما العمل: استخدم طريقة DNS العكسي لدى المشغّل حيثما وُجدت، وقائمة المزوّد نفسه للخدمات، ومحدِّد المعدل لكل ما عدا ذلك.
شغّل المُنشئ الليلة، أو الصق عنوان IP من سجلاتك في أداة بحث IP وتحقق هل يقرأ صف Crawler فيها «زاحف موثَّق» أو «زاحف غير موثَّق». الاسم في الترويسة ادعاء؛ وملف المشغّل هو الدليل.
الأسئلة الشائعة
ما هي قائمة IP للزواحف الموثَّقة؟
قائمة تُبنى من ملفات نطاقات IP التي ينشرها مشغّلو البوتات لزواحفهم. يحمّل GeoIPHub 19 ملفاً من هذا النوع من 10 مشغّلين، منهم Google وMicrosoft وApple وOpenAI وAnthropic؛ وتنشر OpenAI ملفاً عشرين هو adsbot.json لا نحمّله بعد. يكون الطلب من زاحف موثَّق حين يسمّي User-Agent بوتاً ويقع IP ضمن ملف ذلك المشغّل.
هل يرى استعلام IP قيمة User-Agent؟
لا. يأخذ استعلام GeoIPHub عنوان IP فقط. يستطيع إخبارك بأن العنوان في ملف Anthropic أو Google، وتقارن شيفرتك أنت ذلك المشغّل بالبوت الذي يدّعيه User-Agent.
هل يمكن لبوت موثَّق أن يكون بوتاً سيئاً؟
نعم. فعنوان AhrefsBot 5.39.1.230 طابق نطاقات Ahrefs المنشورة وكان مدرجاً أيضاً في Spamhaus ZEN، فسجّل 35، review، في واجهة GeoIPHub في 29 أكتوبر 2026. يخبرك التحقق من يشغّل العنوان، لا هل تسمح له بالدخول.
كم مرة تتغير نطاقات IP للزواحف؟
يعتمد على المشغّل، ومعظمهم لا يقول. في 29 أكتوبر 2026 تراوحت تواريخ الملفات من يناير 2024 (Microsoft) إلى 28 أكتوبر 2026 (Google وPerplexity). يعيد GeoIPHub جلب كل ملف يومياً، وقد يستغرق وصول التغيير إلى واجهته نحو يومين.
هل ينبغي أن أضع الزواحف في قائمة سماح حسب ASN؟
لا. كثير من الزواحف يعمل على سحابات مشتركة: تحمل شبكة Microsoft كلاً من Bingbot وGPTBot وبوتات DuckDuckGo، فالسماح لها يُدخل كل عميل على تلك السحابة. طابِق البادئات الدقيقة في ملف كل مشغّل.
أي البوتات لا يمكن التحقق منها بقائمة IP؟
البوتات التي لا ينشر مشغّلوها ملفاً، مثل Yandex وBaidu (DNS عكسي بدلاً من ذلك)، وMeta (لا ملف نطاقات؛ يطابق GeoIPHub شبكتها عبر ASN، دون توثيق)، وBytespider. وتعرض Amazon نطاقات Amazonbot داخل صفحة ويب فقط. حدّد معدل ما لا تستطيع التحقق منه.
الفريق الذي يقف وراء واجهة GeoIPHub API
بقلم فريق GeoIPHub، وهم من يبنون واجهة GeoIPHub API لاستخبارات IP وماسحها. تُعَدّ المسودات بمساعدة الذكاء الاصطناعي ويحررها الفريق، وأمثلة API استعلامات حقيقية على واجهة API الحية ما لم تُوصف بأنها توضيحية.


