关于 search-domain-validator
用于域名格式校验、注册可用性检查和关键词搜索的开发 Skill,适合实现域名表单校验或建议功能。它还指导先检查项目已有的验证与 API 模式,再按项目惯例实现。
主要功能
- 01按 RFC 1035 和 RFC 1123 校验
- 02通过域名 API 检查可用性
- 03按关键词生成域名建议
- 04批量检查候选域名
- 05遵循项目现有实现模式
适用场景
- 01校验表单中的域名格式
- 02查询域名是否可注册
- 03搜索关键词相关的可用域名
- 04为应用添加域名建议
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ shipshitdev/ skills --skill search-domain-validator安装后在 Claude Code 中输入/search-domain-validator确认已加载。
附带文件plugin.json
详细介绍
域名搜索与验证器
概述
此技能可验证域名格式、检查域名可用状态,并根据关键词搜索可用域名。它将实现域名验证逻辑、集成域名可用性 API,并提供域名搜索功能。
何时使用此技能
当用户执行以下操作时,此技能会自动激活:
- 需要验证域名格式或语法
- 想检查域名是否可以注册
- 需要根据关键词搜索可用域名
- 需要在表单或应用中验证域名
- 需要验证域名是否符合 RFC 标准
- 想实现域名建议功能
项目上下文发现
提供域名验证指导前,请先了解项目上下文:
-
扫描项目文档:
- 检查是否已有域名验证逻辑
- 查看表单验证模式
- 查找 API 集成模式
- 检查环境变量的使用情况
-
识别现有模式:
- 查看正在使用的验证库
- 检查 API 客户端模式
- 查看错误处理方法
- 检查域名相关工具
-
使用项目专属技能:
- 检查是否存在
[project]-domain-validator技能 - 查看项目专属的验证模式
- 遵循项目的验证标准
- 检查是否存在
核心功能
1. 域名格式验证
根据 RFC 1035 和 RFC 1123 标准验证域名。
域名规则:
- 长度:总计 1-253 个字符
- 标签:每个最多 63 个字符
- 字符:字母(a-z、A-Z)、数字(0-9)、连字符(-)
- 标签不能以连字符开头或结尾
- 必须包含 TLD(顶级域名)
- 不能包含连续的连字符
验证实现:
// TypeScript/JavaScript domain validation
function isValidDomain(domain: string): boolean {
if (!domain || domain.length > 253) {
return false;
}
// RFC 1035 compliant regex
const domainRegex = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
if (!domainRegex.test(domain)) {
return false;
}
// Check label length (max 63 chars)
const labels = domain.split('.');
for (const label of labels) {
if (label.length > 63 || label.length === 0) {
return false;
}
// Labels cannot start or end with hyphen
if (label.startsWith('-') || label.endsWith('-')) {
return false;
}
}
return true;
}
Python 验证:
import re
def is_valid_domain(domain: str) -> bool:
"""Validate domain name format according to RFC 1035 and RFC 1123."""
if not domain or len(domain) > 253:
return False
# RFC 1035 compliant regex
domain_pattern = r'^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$'
if not re.match(domain_pattern, domain, re.IGNORECASE):
return False
# Check label length (max 63 chars)
labels = domain.split('.')
for label in labels:
if len(label) > 63 or len(label) == 0:
return False
# Labels cannot start or end with hyphen
if label.startswith('-') or label.endswith('-'):
return False
return True
NestJS 验证:
import { IsString, Matches, MaxLength, ValidateIf } from 'class-validator';
export class DomainDto {
@IsString()
@MaxLength(253)
@Matches(
/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i,
{
message: 'Invalid domain name format',
}
)
domain: string;
}
2. 域名可用性检查
使用域名可用性 API 检查域名是否可以注册。
常见的域名可用性 API:
- Namecheap API
- GoDaddy API
- Name.com API
- WHOIS 查询(用于基本检查)
Namecheap API 集成:
// Namecheap domain availability check
async function checkDomainAvailability(domain: string): Promise<boolean> {
const apiUser = process.env.NAMECHEAP_API_USER;
const apiKey = process.env.NAMECHEAP_API_KEY;
const clientIp = process.env.NAMECHEAP_CLIENT_IP;
const url = `https://api.namecheap.com/xml.response?ApiUser=${apiUser}&ApiKey=${apiKey}&UserName=${apiUser}&Command=namecheap.domains.check&ClientIp=${clientIp}&DomainList=${domain}`;
try {
const response = await fetch(url);
const xml = await response.text();
// Parse XML response
// Available domains return <DomainCheckResult Domain="example.com" Available="true"/>
return xml.includes('Available="true"');
} catch (error) {
console.error('Error checking domain availability:', error);
throw error;
}
}
GoDaddy API 集成:
// GoDaddy domain availability check
async function checkGoDaddyAvailability(domain: string): Promise<boolean> {
const apiKey = process.env.GODADDY_API_KEY;
const apiSecret = process.env.GODADDY_API_SECRET;
const url = `https://api.godaddy.com/v1/domains/available?domain=${domain}`;
try {
const response = await fetch(url, {
headers: {
'Authorization': `sso-key ${apiKey}:${apiSecret}`,
'Content-Type': 'application/json',
},
});
const data = await response.json();
return data.available === true;
} catch (error) {
console.error('Error checking domain availability:', error);
throw error;
}
}
NestJS 服务示例:
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class DomainService {
constructor(private httpService: HttpService) {}
async checkAvailability(domain: string): Promise<boolean> {
const apiKey = process.env.DOMAIN_API_KEY;
const apiSecret = process.env.DOMAIN_API_SECRET;
try {
const response = await firstValueFrom(
this.httpService.get(`https://api.example.com/domains/check`, {
params: { domain },
headers: {
'Authorization': `Bearer ${apiKey}`,
},
})
);
return response.data.available;
} catch (error) {
throw new Error(`Failed to check domain availability: ${error.message}`);
}
}
}
3. 域名搜索功能
根据关键词搜索可用域名,生成建议和替代选项。
域名建议算法:
function generateDomainSuggestions(keyword: string, tlds: string[] = ['com', 'io', 'net', 'org']): string[] {
const suggestions: string[] = [];
const sanitized = keyword.toLowerCase().replace(/[^a-z0-9-]/g, '');
// Direct combinations
for (const tld of tlds) {
suggestions.push(`${sanitized}.${tld}`);
}
// Common prefixes
const prefixes = ['get', 'try', 'use', 'my', 'the'];
for (const prefix of prefixes) {
for (const tld of tlds) {
suggestions.push(`${prefix}${sanitized}.${tld}`);
}
}
// Common suffixes
const suffixes = ['app', 'hub', 'ly', 'fy', 'io'];
for (const suffix of suffixes) {
for (const tld of tlds) {
suggestions.push(`${sanitized}${suffix}.${tld}`);
}
}
return suggestions;
}
批量可用性检查:
async function searchAvailableDomains(keyword: string): Promise<string[]> {
const suggestions = generateDomainSuggestions(keyword);
const availableDomains: string[] = [];
// Check availability for all suggestions (with rate limiting)
for (const domain of suggestions) {
try {
const isAvailable = await checkDomainAvailability(domain);
if (isAvailable) {
availableDomains.push(domain);
}
// Rate limiting delay
await new Promise(resolve => setTimeout(resolve, 100));
} catch (error) {
console.error(`Error checking ${domain}:`, error);
}
}
return availableDomains;
}
最佳实践
验证
- 检查可用性前,务必先验证域名格式
- 处理边缘情况(国际化域名、子域名)
- 为无效域名提供明确的错误消息
- 如有需要,考虑单独验证 TLD
API 集成
- 将 API 凭据存储在环境变量中
- 实施速率限制,避免触发 API 限流
- 妥善处理 API 错误
- 适时缓存可用性结果
- 为 API 调用设置适当的超时时间
用户体验
- 提供实时验证反馈
- 随用户输入显示域名建议
- 清晰显示可用状态
- 提供其他 TLD 建议
- 在检查可用性期间显示加载状态
安全性
- 切勿在客户端代码中暴露 API 密钥
- 验证并清理所有用户输入
- 实施适当的错误处理
- 所有 API 通信均使用 HTTPS
- 遵循 API 提供商的安全指南
用户请求示例
示例 1:“验证此域名:example.com”
- 使用格式验证检查域名是否符合 RFC 标准
- 如果无效,返回验证结果并提供具体错误详情
示例 2:“检查 example.com 是否可用”
- 先验证域名格式
- 调用域名可用性 API
- 返回可用状态
示例 3:“搜索包含关键字 ‘techstartup’ 的可用域名”
- 根据关键字生成域名建议
- 检查每个建议域名是否可用
- 返回可用域名列表,并在有定价信息时一并提供
示例 4:“在此表单中实现域名验证”
- 为表单组件添加域名验证
- 集成实时验证
- 为无效域名提供用户反馈
常见域名 TLD
通用 TLD:
- .com、.net、.org、.info、.biz
新 gTLD:
- .app、.dev、.io、.ai、.tech、.online、.xyz
国家代码 TLD:
- .us、.uk、.ca、.au、.de、.fr、.jp
实现域名搜索时,请考虑纳入与用户使用场景或行业相关的热门 TLD。
评论
支持 Markdown