返回> 网站首页
获取域名TXT解析数据
yoours2026-02-27 09:41:15
简介一边听听音乐,一边写写文章。
一、介绍
在申请域名数字证书时,通常需要配置域名的TXT记录,可以考虑使用此种方式进行辅助通讯认证。
二、使用windows命令获取TXT记录
例如:
nslookup -q=TXT _acme-challenge.soskp.com

三、使用C++获取TXT记录
#include <windows.h>
#include <windns.h>
#include <vector>
#include <string>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "dnsapi.lib")
// 将宽字符串转换为 UTF-8 多字节字符串(
std::string WStringToString(const std::wstring& wstr)
{
if (wstr.empty()) return std::string();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
// 查询指定域名的所有 TXT 记录
bool QueryTxtRecords(const std::wstring& domainName)
{
PDNS_RECORD pDnsRecord = NULL;
DNS_STATUS status = DnsQuery(
domainName.c_str(), // 查询的域名(宽字符串)
DNS_TYPE_TEXT, // 查询类型:TXT
DNS_QUERY_STANDARD, // 标准查询
NULL, // 不使用指定 DNS 服务器(使用系统默认)
&pDnsRecord, // 返回的记录列表
NULL // 保留
);
if (status != ERROR_SUCCESS)
{
std::cerr << "DNS 查询失败,错误码: " << status << std::endl;
return false;
}
std::cout << "查询域名: " << WStringToString(domainName) << " 的 TXT 记录:" << std::endl;
bool found = false;
PDNS_RECORD pCurrent = pDnsRecord;
int recordIndex = 1;
while (pCurrent)
{
// 只处理 TXT 类型记录
if (pCurrent->wType == DNS_TYPE_TEXT)
{
found = true;
// 获取 TXT 记录中的数据
// TXT 记录可能包含多个字符串片段(pStringArray),需要拼接
std::wstring txtValue;
for (DWORD i = 0; i < pCurrent->Data.TXT.dwStringCount; i++)
{
if (pCurrent->Data.TXT.pStringArray[i])
{
// pStringArray[i] 是 const char* 类型(ANSI)
txtValue += pCurrent->Data.TXT.pStringArray[i];
}
}
// 获取 TTL
DWORD ttl = pCurrent->dwTtl;
std::cout << "记录 " << recordIndex++ << ":" << std::endl;
std::cout << " TTL: " << ttl << " 秒" << std::endl;
std::wcout << " 值: " << txtValue << std::endl;
}
pCurrent = pCurrent->pNext;
}
if (!found)
std::cout << "未找到任何 TXT 记录。" << std::endl;
// 释放 DNS 记录内存
DnsRecordListFree(pDnsRecord, DnsFreeRecordList);
return true;
}
int main()
{
// 初始化 Winsock(虽然 DnsQuery 不严格要求,但某些网络功能可能需要)
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0)
{
std::cerr << "WSAStartup 失败: " << result << std::endl;
return 1;
}
// 要查询的域名
std::wstring domain = L"_acme-challenge.soskp.com"; // 使用宽字符串,DnsQuery 需要
// 执行查询
QueryTxtRecords(domain);
// 清理 Winsock
WSACleanup();
std::cout << "\n按回车键退出...";
std::cin.get();
return 0;
}