Перейти к содержимому
Tutorial

API поиска DNS: запрос записей A, MX и TXT через REST

| 6 min read

Программный поиск записей DNS с помощью трех конечных точек REST. Запрашивайте отдельные типы записей, группируйте несколько типов и проверяйте распространение в Google, Cloudflare и Quad9.

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

Ваш сценарий мониторинга должен проверять записи MX после миграции DNS. Вы можете установить dig, проанализировать его многострочный вывод с помощью регулярного выражения и обработать дюжину крайних случаев где формат варьируется в зависимости от типа записи. Или вы можете отправить один HTTP-запрос и получить структурированный JSON обратно.

Botoi DNS API предоставляет вам три конечные точки: поиск одного типа, пакетный поиск по нескольким типы записей одновременно и средство проверки распространения, которое запрашивает Google, Cloudflare и Quad9. параллельно. Все три возвращают согласованный JSON, который вы можете использовать в любом скрипте или приложении. без разбора гимнастики.

Поиск одного типа записи

The /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 в секунды. Не нужно разбивать строки или угадывать, какое число является приоритетным; API делает это для тебя.

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

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 между преобразователями

Вы обновили свою запись A 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
  }
}

The 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 со всеми совпадающими записями, сроками жизни и временем запроса. Никакой установки раскопок или анализа вывода не требуется.
Какие типы записей DNS поддерживает API?
API поддерживает восемь типов записей: A, AAAA, MX, TXT, CNAME, NS, SOA и PTR. Если вы опустите параметр типа, по умолчанию будет использоваться запись A.
Как проверить, распространились ли изменения DNS?
Используйте конечную точку /v1/dns/propagation. Он параллельно запрашивает Google DNS, Cloudflare DNS и Quad9 и возвращает «согласованное» логическое значение, указывающее, возвращают ли все три преобразователя одни и те же записи. Если значение «consistent» ложно, распространение все еще продолжается.
Могу ли я запросить несколько типов записей DNS в одном запросе?
Да. Конечная точка /v1/dns/batch принимает массив типов (например, ["A", "MX", "TXT"]) и запрашивает их все параллельно. Группы ответов записываются по типу. Если вы опустите параметр типов, по умолчанию будут использоваться значения A, AAAA, MX, TXT и NS.
Является ли API поиска DNS бесплатным?
Анонимный доступ доступен со скоростью 5 запросов в минуту и ​​100 запросов в день с ограничением скорости по IP. Никакой ключ API или учетная запись не требуется. Для более высокой пропускной способности платные планы начинаются с 9 долларов США в месяц с одним ключом API, охватывающим все более 150 конечных точек.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.