تخطي إلى المحتوى
Tutorial

واجهة برمجة تطبيقات بحث DNS: الاستعلام عن سجلات A وMX وTXT عبر REST

| 6 min read

ابحث عن سجلات DNS برمجيًا باستخدام 3 نقاط نهاية REST. استعلم عن أنواع السجلات الفردية، وأنواع متعددة على دفعات، وتحقق من الانتشار عبر Google، وCloudflare، وQuad9.

Server racks in a data center
Photo by Taylor Vick on Unsplash

يحتاج البرنامج النصي للمراقبة إلى التحقق من سجلات MX بعد ترحيل DNS. هل يمكن تثبيت dig، وتحليل مخرجاته متعددة الأسطر باستخدام regex، والتعامل مع عشرات الحالات الطرفية حيث يختلف التنسيق بين أنواع السجلات. أو يمكنك إرسال طلب HTTP واحد والحصول عليه ظهر JSON منظم.

تمنحك واجهة برمجة تطبيقات DNS الخاصة بـ botoi ثلاث نقاط نهاية: البحث من نوع واحد، والبحث المجمع عن عدة نقاط أنواع السجلات في وقت واحد، ومدقق الانتشار الذي يستعلم عن Google وCloudflare وQuad9 بالتوازي. تُرجع الثلاثة ملفات JSON متسقة يمكنك إدخالها في أي برنامج نصي أو تطبيق دون تحليل الجمباز.

ابحث عن نوع سجل واحد

ال /v1/dns/lookup تأخذ نقطة النهاية مجالًا ونوع سجل اختياريًا. إذا إذا قمت بحذف النوع، فسيتم تعيينه افتراضيًا على سجلات A. إليك بحث MX عن stripe.com:

curl -X POST https://api.botoi.com/v1/dns/lookup \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "stripe.com", "type": "MX"}'

إجابة:

{
  "success": true,
  "data": {
    "domain": "stripe.com",
    "type": "MX",
    "records": [
      { "type": "MX", "value": "aspmx.l.google.com", "priority": 1, "ttl": 3600 },
      { "type": "MX", "value": "alt1.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
      { "type": "MX", "value": "alt2.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
      { "type": "MX", "value": "alt3.aspmx.l.google.com", "priority": 10, "ttl": 3600 },
      { "type": "MX", "value": "alt4.aspmx.l.google.com", "priority": 10, "ttl": 3600 }
    ],
    "query_time_ms": 14
  }
}

يعود كل سجل MX بملحق priority الميدان و أ ttl في ثواني. لا حاجة لتقسيم السلاسل أو تخمين الرقم الذي له الأولوية؛ واجهة برمجة التطبيقات تفعل ذلك هذا لك.

سجلات TXT لنظام التعرف على هوية المرسل (SPF) والتحقق

تحتفظ سجلات TXT بسياسات نظام التعرف على هوية المرسل (SPF)، ورموز ملكية النطاق، ومحددات DKIM. الاستعلام عنهم بنفس الطريقة:

curl -X POST https://api.botoi.com/v1/dns/lookup \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "github.com", "type": "TXT"}'

إجابة:

{
  "success": true,
  "data": {
    "domain": "github.com",
    "type": "TXT",
    "records": [
      { "type": "TXT", "value": "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com ~all", "ttl": 3600 },
      { "type": "TXT", "value": "MS=ms58704441", "ttl": 3600 },
      { "type": "TXT", "value": "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd", "ttl": 3600 }
    ],
    "query_time_ms": 11
  }
}

تدعم واجهة برمجة التطبيقات ثمانية أنواع من السجلات: A وAAAA وMX وTXT وCNAME وNS وSOA وPTR. كل type يُرجع نفس التنسيق المنظم مع type, value، و ttl الحقول.

الاستعلام عن أنواع سجلات متعددة في وقت واحد

تعتبر أربع مكالمات HTTP منفصلة للحصول على سجلات A وMX وTXT وNS بمثابة إهدار. ال /v1/dns/batch تقوم نقطة النهاية بتشغيل كافة عمليات البحث بالتوازي وإرجاع الملف النتائج مجمعة حسب النوع.

curl -X POST https://api.botoi.com/v1/dns/batch \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "github.com", "types": ["A", "MX", "TXT", "NS"]}'

إجابة:

{
  "success": true,
  "data": {
    "domain": "github.com",
    "results": {
      "A": [
        { "type": "A", "value": "140.82.121.3", "ttl": 60 }
      ],
      "MX": [
        { "type": "MX", "value": "aspmx.l.google.com", "priority": 1, "ttl": 3600 },
        { "type": "MX", "value": "alt1.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
        { "type": "MX", "value": "alt2.aspmx.l.google.com", "priority": 5, "ttl": 3600 }
      ],
      "TXT": [
        { "type": "TXT", "value": "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com ~all", "ttl": 3600 },
        { "type": "TXT", "value": "MS=ms58704441", "ttl": 3600 }
      ],
      "NS": [
        { "type": "NS", "value": "dns1.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns2.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns3.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns4.p08.nsone.net", "ttl": 900 }
      ]
    }
  }
}

طلب واحد، استجابة واحدة، جميع أنواع السجلات الأربعة. إذا قمت بحذف types المصفوفة، تكون نقطة النهاية الافتراضية هي A وAAAA وMX وTXT وNS. وهذا مفيد للبناء لوحات معلومات نظرة عامة على المجال أو إجراء عمليات تدقيق شاملة لنظام أسماء النطاقات.

تحقق من انتشار DNS عبر وحدات الحل

لقد قمت بتحديث السجل الخاص بك منذ 20 دقيقة. يعرض المحلل المحلي عنوان IP الجديد، ولكن لا يزال العملاء في المناطق الأخرى يصلون إلى الخادم القديم. ال /v1/dns/propagation تستعلم نقطة النهاية عن ثلاثة من كبار المحللين العامين وتخبرك إذا كانوا يوافقون.

curl -X POST https://api.botoi.com/v1/dns/propagation \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "stripe.com", "type": "A"}'

إجابة:

{
  "success": true,
  "data": {
    "domain": "stripe.com",
    "type": "A",
    "resolvers": {
      "google": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 18
      },
      "cloudflare": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 9
      },
      "quad9": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 22
      }
    },
    "consistent": true
  }
}

ال consistent المجال هو true عندما تقوم جميع أدوات الحل الثلاثة بإرجاع ملف نفس مجموعة السجلات المصنفة. عندما يكون false، ال resolvers كائن يوضح لك بالضبط أي محلل لا يزال يقدم البيانات القديمة والمدة التي يستغرقها كل استعلام.

مثال عملي: التحقق من سجلات MX قبل قبول الاشتراكات

حالة الاستخدام الشائع: يدخل شخص ما user@typo-domain.cm في نموذج الاشتراك الخاص بك. يتم التحقق من صحة بناء الجملة لأن التنسيق صحيح، ولكن المجال لا يحتوي على خوادم بريد. ستكتشف ذلك بعد ثلاثة أيام عندما ترتد رسالة الترحيب الإلكترونية.

يتحقق مثال Node.js هذا من سجلات MX في وقت الاشتراك ويرفض الإشارة إلى عناوين البريد الإلكتروني إلى المجالات التي لا تحتوي على بنية أساسية للبريد:

import express from "express";

const app = express();
app.use(express.json());

async function lookupMx(domain) {
  const res = await fetch("https://api.botoi.com/v1/dns/lookup", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ domain, type: "MX" }),
  });
  return res.json();
}

app.post("/signup", async (req, res) => {
  const { email } = req.body;
  const domain = email.split("@")[1];

  // Check if the domain has MX records before accepting the signup
  const { data } = await lookupMx(domain);

  if (!data.records || data.records.length === 0) {
    return res.status(422).json({
      error: \`The domain \\\${domain} has no mail servers. Check the email address and try again.\`,
    });
  }

  // MX records exist; proceed with signup
  await createUser({ email });
  res.status(201).json({ created: true });
});

app.listen(3000);

يضيف الشيك 10-30 مللي ثانية إلى طلب التسجيل. هذا سعر بسيط لمنع الارتداد الإضرار بسمعة المرسل الخاص بك. يمكنك أيضًا تخزين نتائج MX لكل مجال لمدة 30 دقيقة لتجنب عمليات البحث المتكررة لنفس المجال.

مراقبة انتشار DNS بعد الترحيل

بعد تغيير سجلات DNS، تريد معرفة اللحظة التي تخدم فيها جميع وحدات الحل الرئيسية السجل الجديد القيم. يستقصي هذا البرنامج النصي نقطة نهاية النشر كل 30 ثانية ويسجل حالة كل محلل:

async function checkPropagation(domain, type) {
  const res = await fetch("https://api.botoi.com/v1/dns/propagation", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ domain, type }),
  });
  return res.json();
}

// After updating DNS records, poll until all resolvers agree
async function waitForPropagation(domain, type, intervalMs = 30000) {
  let attempts = 0;

  while (attempts < 60) {
    const { data } = await checkPropagation(domain, type);

    console.log(
      \`Attempt \\\${attempts + 1}: consistent=\\\${data.consistent}\`
    );

    for (const [name, info] of Object.entries(data.resolvers)) {
      console.log(\`  \\\${name}: \\\${JSON.stringify(info.records)}\`);
    }

    if (data.consistent) {
      console.log("Propagation complete.");
      return data;
    }

    attempts++;
    await new Promise((r) => setTimeout(r, intervalMs));
  }

  throw new Error("Propagation did not complete within 30 minutes.");
}

// Usage
waitForPropagation("yourdomain.com", "A");

قم بتشغيل هذا كمهمة خلفية بعد إجراء تغييرات DNS. فإنه يسجل السجلات من كل محلل في كل محاولة ويخرج عندما يتفق الثلاثة. الفاصل الزمني 30 ثانية يبقيك تحت الحد الأقصى لسعر الطبقة المجانية (5 طلبات في الدقيقة).

النقاط الرئيسية

  • /v1/dns/lookup تقوم بإرجاع JSON منظم لأي من العناصر الثمانية المدعومة أنواع السجلات. تتضمن سجلات MX الأولوية؛ تتضمن سجلات SOA التسلسلية، والتحديث، وإعادة المحاولة، تنتهي الصلاحية، والحد الأدنى من الحقول.
  • /v1/dns/batch يستعلم عن أنواع سجلات متعددة بالتوازي مع طلب واحد. الإعدادات الافتراضية هي A وAAAA وMX وTXT وNS إذا لم تحددها.
  • /v1/dns/propagation يتحقق من Google وCloudflare وQuad9 ويعيد ملف منطقية consistent علَم. استخدمه للتحقق من أن تغييرات DNS قد أصبحت عالمية.
  • تعمل جميع نقاط النهاية الثلاث بشكل مجهول بمعدل 5 متطلبات/دقيقة. تمرير ان X-Api-Key رأس للحدود الأعلى.
  • تعمل واجهة برمجة التطبيقات (API) على شبكة Cloudflare الطرفية. يتم حل الاستعلامات من خلال DNS-over-HTTPS، بحيث تحصل على نفس الموثوقية مثل الاستعلام عن Cloudflare أو Google DNS مباشرة بتنسيق JSON صديق للمطورين.

FAQ

كيف يمكنني البحث عن سجلات DNS برمجياً؟
أرسل طلب POST إلى https://api.botoi.com/v1/dns/lookup مع نص JSON يحتوي على المجال ونوع السجل. تقوم واجهة برمجة التطبيقات (API) بإرجاع JSON منظم مع جميع السجلات المطابقة وTTLs ووقت الاستعلام. لا يلزم تركيب الحفر أو تحليل الإخراج.
ما أنواع سجلات DNS التي تدعمها واجهة برمجة التطبيقات؟
تدعم واجهة برمجة التطبيقات ثمانية أنواع من السجلات: A وAAAA وMX وTXT وCNAME وNS وSOA وPTR. إذا قمت بحذف معلمة النوع، فسيتم تعيينها افتراضيًا على سجلات A.
كيف يمكنني التحقق من انتشار تغييرات DNS؟
استخدم نقطة النهاية /v1/dns/propagation. فهو يستعلم عن Google DNS وCloudflare DNS وQuad9 بالتوازي ويعيد قيمة منطقية "متسقة" تشير إلى ما إذا كانت جميع المحللات الثلاثة تُرجع نفس السجلات. إذا كان التناسق خاطئًا، فإن النشر لا يزال قيد التقدم.
هل يمكنني الاستعلام عن أنواع سجلات DNS متعددة في طلب واحد؟
نعم. تقبل نقطة النهاية /v1/dns/batch مصفوفة من الأنواع (على سبيل المثال، ["A"، "MX"، "TXT"]) وتقوم بالاستعلام عنها جميعًا بالتوازي. تسجل مجموعات الاستجابة حسب النوع. إذا قمت بحذف معلمة الأنواع، فسيتم تعيينها افتراضيًا على A وAAAA وMX وTXT وNS.
هل واجهة برمجة تطبيقات بحث DNS مجانية؟
يتوفر الوصول المجهول بمعدل 5 طلبات في الدقيقة و100 طلب في اليوم مع تحديد معدل يعتمد على IP. لا يوجد مفتاح API أو حساب مطلوب. للحصول على إنتاجية أعلى، تبدأ الخطط المدفوعة بسعر 9 دولارات شهريًا مع مفتاح واجهة برمجة تطبيقات واحد يغطي جميع نقاط النهاية التي يزيد عددها عن 150 نقطة.

ابدأ البناء مع botoi

أكثر من 150 نقطة نهاية API للبحث ومعالجة النصوص وتوليد الصور وأدوات المطورين. باقة مجانية، بدون بطاقة ائتمان.