コンテンツへスキップ
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 リクエストを 1 つ送信して、 構造化された JSON を返します。

botoi DNS API は、単一タイプのルックアップ、複数のバッチ ルックアップの 3 つのエンドポイントを提供します。 レコードタイプを一度に管理し、Google、Cloudflare、Quad9 にクエリを実行する伝播チェッカー 並行して。 3 つすべてが一貫した 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 の 8 つのレコード タイプをサポートします。 それぞれ type は同じ構造化フォーマットを返します。 typevalue、 そして ttl フィールド。

複数のレコードタイプを一度にクエリする

A、MX、TXT、NS レコードを取得するために 4 回の個別の HTTP 呼び出しは無駄です。 の /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 }
      ]
    }
  }
}

1 つのリクエスト、1 つのレスポンス、4 つのレコード タイプすべて。 を省略した場合、 types 配列の場合、エンドポイントのデフォルトは A、AAAA、MX、TXT、および NS です。 これは構築に役立ちます ドメイン概要ダッシュボードや包括的な DNS 監査の実行。

リゾルバー間での DNS 伝播を確認する

20 分前に A レコードを更新しました。 ローカル リゾルバーには新しい IP が表示されますが、 他の地域の顧客は依然として古いサーバーにアクセスします。 の /v1/dns/propagation エンドポイントは 3 つの主要なパブリック リゾルバーにクエリを実行し、それらが同意するかどうかを通知します。

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 3 つのリゾルバーがすべてを返すと、 同じソートされたレコードのセット。 そうなったとき falseresolvers オブジェクト どのリゾルバーがまだ古いデータを提供しているのか、また各クエリにかかった時間が正確に表示されます。

実践例: サインアップを受け入れる前に MX レコードを検証する

一般的な使用例: 誰かが入ってくる user@typo-domain.cm サインアップフォームに。 形式は正しいため、構文検証は合格しますが、ドメインにはメール サーバーがありません。 これは 3 日後にウェルカム メールが返送されたときにわかります。

この 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 レコードを変更した後、すべての主要なリゾルバーが新しい 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 を変更した後、これをバックグラウンド ジョブとして実行します。 それぞれのレコードをログに記録します 試行するたびにリゾルバが実行され、3 つすべてが一致すると終了します。 30秒間隔で 無料利用枠のレート制限 (1 分あたり 5 リクエスト) を下回ります。

重要なポイント

  • /v1/dns/lookup サポートされている 8 つのいずれかに対して構造化された JSON を返します。 レコードの種類。 MX レコードには優先順位が含まれます。 SOA レコードには、シリアル、リフレッシュ、再試行、 有効期限と最小限のフィールド。
  • /v1/dns/batch 1 つのリクエストで複数のレコード タイプを並行してクエリします。 指定しない場合、デフォルトは A、AAAA、MX、TXT、および NS になります。
  • /v1/dns/propagation Google、Cloudflare、Quad9 をチェックし、 ブール値 consistent フラグ。 これを使用して、DNS の変更がグローバルに反映されたことを確認します。
  • 3 つのエンドポイントはすべて匿名で 5 req/min で動作します。 渡す X-Api-Key より高い制限のヘッダー。
  • APIはCloudflareのエッジネットワーク上で実行されます。 クエリは DNS-over-HTTPS を通じて解決されます。 そのため、Cloudflare または Google DNS をラップして直接クエリするのと同じ信頼性が得られます。 開発者にとって使いやすい JSON 形式です。

FAQ

プログラムで DNS レコードを検索するにはどうすればよいですか?
ドメインとレコード タイプを含む JSON 本文を使用して、POST リクエストを https://api.botoi.com/v1/dns/lookup に送信します。 API は、一致するすべてのレコード、TTL、およびクエリ時間を含む構造化 JSON を返します。 dig インストールや出力解析は必要ありません。
API はどの DNS レコード タイプをサポートしていますか?
API は、A、AAAA、MX、TXT、CNAME、NS、SOA、および PTR の 8 つのレコード タイプをサポートします。 type パラメータを省略すると、デフォルトで A レコードが使用されます。
DNS の変更が反映されたかどうかを確認するにはどうすればよいですか?
/v1/dns/propagation エンドポイントを使用します。 Google DNS、Cloudflare DNS、Quad9 に並行してクエリを実行し、3 つのリゾルバーすべてが同じレコードを返すかどうかを示す「一貫した」ブール値を返します。 一貫性が false の場合、伝播はまだ進行中です。
1 つのリクエストで複数の DNS レコード タイプをクエリできますか?
はい。 /v1/dns/batch エンドポイントは、タイプ配列 (例: ["A"、"MX"、"TXT"]) を受け入れ、それらすべてを並行してクエリします。 応答はタイプ別にレコードをグループ化します。 type パラメータを省略した場合、デフォルトは A、AAAA、MX、TXT、および NS になります。
DNS ルックアップ API は無料ですか?
匿名アクセスは、IP ベースのレート制限により、1 分あたり 5 リクエスト、1 日あたり 100 リクエストまで利用できます。 API キーやアカウントは必要ありません。 スループットを高めるには、150 以上のエンドポイントすべてをカバーする単一の API キーを備えた有料プランが月額 9 ドルから始まります。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。