跳转到内容
Tutorial

DNS 查找 API:通过 REST 查询 A、MX 和 TXT 记录

| 6 min read

使用 3 个 REST 端点以编程方式查找 DNS 记录。 查询单个记录类型、批量处理多个类型,并检查 Google、Cloudflare 和 Quad9 之间的传播。

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

您的监控脚本需要在 DNS 迁移后验证 MX 记录。 你可以安装 dig,使用正则表达式解析其多行输出,并处理十几个边缘情况 其中记录类型之间的格式有所不同。 或者您可以发送一个 HTTP 请求并获取 结构化 JSON 返回。

botoi DNS API 为您提供了三个端点:单一类型查找、批量查找多个 一次记录类型,以及查询 Google、Cloudflare 和 Quad9 的传播检查器 并行。 所有三个都返回一致的 JSON,您可以将其输入到任何脚本或应用程序中 没有解析体操。

查找单个记录类型

/v1/dns/lookup 端点采用一个域和一个可选的记录类型。 如果 如果省略类型,则默认为 A 记录。 以下是 stripe.com 的 MX 查找:

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 在 秒。 无需分割字符串或猜测哪个数字是优先级; API 确实 给你的。

用于 SPF 和验证的 TXT 记录

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
  }
}

API 支持八种记录类型: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 审核。

检查跨解析器的 DNS 传播

您在 20 分钟前更新了 A 记录。 您的本地解析器显示新的 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 返回 8 个支持的任意一个的结构化 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 记录?
使用包含域和记录类型的 JSON 正文向 https://api.botoi.com/v1/dns/lookup 发送 POST 请求。 API 返回包含所有匹配记录、TTL 和查询时间的结构化 JSON。 无需挖掘安装或输出解析。
API 支持哪些 DNS 记录类型?
API 支持八种记录类型: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”])并并行查询所有这些数组。 响应按类型对记录进行分组。 如果省略 types 参数,则默认为 A、AAAA、MX、TXT 和 NS。
DNS 查找 API 是免费的吗?
匿名访问的速度为每分钟 5 个请求和每天 100 个请求,并具有基于 IP 的速率限制。 无需 API 密钥或帐户。 为了获得更高的吞吐量,付费计划起价为 9 美元/月,单个 API 密钥涵盖所有 150 多个端点。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。