API поиска DNS: запрос записей A, MX и TXT через REST
Программный поиск записей DNS с помощью трех конечных точек REST. Запрашивайте отдельные типы записей, группируйте несколько типов и проверяйте распространение в Google, Cloudflare и Quad9.
Ваш сценарий мониторинга должен проверять записи 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-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.