那有没有一种可能——我们自己搞个工具,让AI帮忙生成域名,然后批量验证可用性?答案是:当然可以!写这个工具主因是我一个域名莫名有人买,居然卖了400块。。。第一回呀。。。
今天就手把手教大家用C#撸一个AI域名生成+批量查询神器。用阿里千问做大脑,阿里云万网API做眼睛,让这俩巨头帮咱打工。

咱们这个工具主要由三个核心服务组成,就像一个精密的工厂流水线:
负责调用千问API,根据你的需求描述生成候选域名。这玩意儿的智能程度?我测试过,给它说"工业自动化、智能制造",它能给你吐出smartfab、autocore、industech这种既专业又朗朗上口的域名。
对接阿里云万网API,批量检查域名可用性和价格信息。这里面的技术细节可不少——反爬虫、速率限制、重试机制,咱们都得考虑周全。
提供用户友好的操作界面,支持批量操作、进度显示、结果筛选等功能。
首先来看看AI域名生成服务的核心实现。这里我选择了阿里千问,原因很简单:性价比高,中文理解能力强,而且兼容OpenAI接口。
csharppublic class AiDomainService
{
private readonly string _apiKey;
private Kernel? _kernel;
// 千问API兼容OpenAI接口,直接复用Semantic Kernel
private const string QwenEndpoint = "https://dashscope.aliyuncs.com/compatible-mode/v1";
private const string QwenModel = "qwen-plus";
public AiDomainService(string apiKey)
{
_apiKey = apiKey;
}
private Kernel GetKernel()
{
if (_kernel != null) return _kernel;
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: QwenModel,
apiKey: _apiKey,
endpoint: new Uri(QwenEndpoint)
);
_kernel = builder.Build();
return _kernel;
}
}
这里有个小技巧:使用Semantic Kernel的好处是什么?它帮我们封装了底层的HTTP请求细节,而且支持多种大模型切换。今天用千问,明天想换成GPT-4?改个配置就行。
接下来是提示词设计,这玩意儿可是个技术活:
csharpvar systemPrompt = @"你是一个品牌域名专家,擅长为工业自动化、物联网、
智能制造、工业4.0等领域生成简洁有力的英文品牌域名。
规则:
1. 只输出域名主体(不含后缀,不含.com等)
2. 每行一个,不加序号、不加解释
3. 长度 6~12 个字符
4. 纯英文字母或字母,不含连字符与数字
5. 朗朗上口,商业感强";
var userPrompt = $"为以下需求生成 {count} 个候选域名:{prompt}";
为什么要这样设计提示词?
域名查询这块是整个项目的技术难点。阿里云的域名查询API虽然是公开的,但人家也不是吃素的——各种反爬虫机制齐上阵。
csharpprivate static readonly string[] UserAgentPool =
{
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) " +
"Gecko/20100101 Firefox/125.0",
};
private HttpRequestMessage BuildRequest(string url, bool isWarmup)
{
var req = new HttpRequestMessage(HttpMethod.Get, url);
var ua = GetRandomUserAgent();
req.Headers.Add("User-Agent", ua);
req.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
req.Headers.Add("Accept-Encoding", "gzip, deflate, br");
req.Headers.Add("Referer", isWarmup ? "https://www.aliyun.com/" : AliyunHome);
// 如果是Chrome内核,添加Sec-CH-UA头
if (ua.Contains("Chrome") && !ua.Contains("Firefox"))
{
var ver = Regex.Match(ua, "Chrome/(\\d+)")
.Groups[1].Value.DefaultIfEmpty("124");
req.Headers.TryAddWithoutValidation("sec-ch-ua",
"\"Chromium\";v=\"" + ver + "\", \"Google Chrome\";v=\"" + ver + "\"");
req.Headers.Add("sec-ch-ua-mobile", "?0");
req.Headers.Add("sec-ch-ua-platform", "\"Windows\"");
}
return req;
}
这段代码的精髓在哪?
csharpprivate async Task ExecuteWithRetryAsync(
string url,
DomainQueryResult result,
CancellationToken ct)
{
for (int attempt = 1; attempt <= MaxRetryCount; attempt++)
{
try
{
using var request = BuildRequest(url, isWarmup: false);
var response = await _httpClient.SendAsync(request, ct);
// 遇到限流,智能等待
if (response.StatusCode == HttpStatusCode.TooManyRequests)
{
int waitMs = RetryBaseDelayMs * (int)Math.Pow(2, attempt);
if (response.Headers.TryGetValues("Retry-After", out var vals) &&
int.TryParse(vals.FirstOrDefault(), out int retryAfter))
waitMs = Math.Max(waitMs, retryAfter * 1000);
await Task.Delay(waitMs + _random.Next(0, 800), ct);
continue;
}
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync(ct);
ParseDomainCheckResponse(json, result);
return;
}
catch (HttpRequestException ex) when (attempt < MaxRetryCount)
{
// 指数退避 + 随机抖动
int waitMs = RetryBaseDelayMs * (int)Math.Pow(2, attempt)
+ _random.Next(0, 500);
await Task.Delay(waitMs, ct);
}
}
}
这里面的门道可不少:
阿里云的域名查询API有个特点——不同后缀需要不同的产品ID。这个映射关系我花了好久才摸清楚:
csharpprivate static readonly Dictionary<string, string> SuffixProductIdMap =
new(StringComparer.OrdinalIgnoreCase)
{
{ ".com", "210701" },
{ ".cn", "10681" },
{ ".net", "210703" },
{ ".com.cn", "19922" },
{ ".top", "12255" },
{ ".wang", "12254" },
{ ".xyz", "12257" },
{ ".vip", "16054" },
{ ".shop", "16065" },
// ... 更多后缀映射
};
为什么需要这个映射? 因为不同域名后缀在阿里云系统里对应不同的产品线,查询时必须带上正确的产品ID,否则返回的价格信息会不准确。
技术再牛逼,没有好的界面也是白搭。咱们这个工具的界面设计遵循一个原则:简单易用,功能完整。
现在程序员都喜欢深色主题,咱也得跟上时代。WinForms的深色主题适配稍微有点麻烦,特别是菜单栏:
csharppublic class DarkColorTable : ProfessionalColorTable
{
public override Color MenuItemSelected => Color.FromArgb(0, 120, 215);
public override Color MenuItemBorder => Color.FromArgb(0, 160, 255);
public override Color MenuBorder => Color.FromArgb(60, 60, 80);
public override Color ToolStripDropDownBackground => Color.FromArgb(35, 35, 48);
public override Color ImageMarginGradientBegin => Color.FromArgb(28, 28, 35);
// ... 更多颜色定义
}
这个项目里最容易出问题的地方就是UI线程安全。AI生成和域名查询都是耗时操作,必须在后台线程执行,但UI更新必须在主线程进行:
csharpprivate void AppendLog(string msg, Color color)
{
if (InvokeRequired)
{
Invoke(() => AppendLog(msg, color));
return;
}
rtbLog.SelectionStart = rtbLog.TextLength;
rtbLog.SelectionLength = 0;
rtbLog.SelectionColor = Color.DarkGray;
rtbLog.AppendText($"[{DateTime.Now:HH:mm:ss}] ");
rtbLog.SelectionColor = color;
rtbLog.AppendText(msg + "\n");
rtbLog.ScrollToCaret();
}
这里的关键是什么? InvokeRequired检查当前线程是否为UI线程,如果不是就通过Invoke方法切换到UI线程执行。这是WinForms多线程编程的基本功。
用户最讨厌的就是点了按钮没反应。咱们的批量查询功能必须提供详细的进度反馈:
csharpprivate async void BtnStartQuery_Click(object? sender, EventArgs e)
{
// ... 参数检查和初始化
var progress = new Progress<(int done, int total, string domain)>(p =>
{
pgbQuery.Value = p.done;
lblQueryProgress.Text = $"进度 {p.done}/{p.total} — 正在查询:{p.domain}";
tspProgress.Value = (int)((double)p.done / p.total * 100);
SetStatus($"查询中... {p.done}/{p.total}");
});
try
{
await foreach (var result in _queryService.QueryBatchAsync(
keywords, suffix, delayMs, progress, _queryCts.Token))
{
AddResultToGrid(result);
AppendLog($"[查询] {result.DomainName} → {result.Status}",
result.Status.Contains("可注册") ? Color.LightGreen : Color.OrangeRed);
}
}
catch (OperationCanceledException)
{
AppendLog("[查询] ⏹ 查询已停止", Color.Orange);
}
}
这段代码的亮点:
经过实际测试,这个工具的表现如何?我用它跑了几轮测试:
AI生成效果测试:
smartfab, autocore, industech, roboflex, iotsync查询性能测试:
用户体验测试:
搞完这个项目,我总结出几个关键经验:
这个项目从想法到完成,前前后后折腾了两周。最大的感触是什么?真正有价值的技术应用,往往来自于对实际问题的深刻理解。
域名注册这个看似简单的需求,背后涉及AI应用、API集成、反爬虫对抗、UI/UX设计等多个技术领域。每个环节都有值得深挖的技术细节。
想要源码的同学,可以在GitHub上搜索相关关键词,或者自己动手实现一遍——相信我,自己撸一遍代码的收获远比直接看源码大得多。
最后抛个问题给大家:如果让你来优化这个工具,你会从哪个角度入手?是增加更多AI模型支持,还是扩展到其他域名注册商,或者是加入域名价值评估功能?
期待在评论区看到你们的想法!
🏷️ 标签:#C#开发 #AI应用 #WinForms #API集成 #实战项目
相关信息
我用夸克网盘给你分享了「AppDomainQueryTool.zip」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/aefc3YrL2o:/
链接:https://pan.quark.cn/s/c2ef20f96e88
提取码:AHy5


本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!