mcpField
S
search-domain-validator

search-domain-validator

github.com/shipshitdev开发38146 次安装2 天前更新
代码仓库

关于 search-domain-validator

用于域名格式校验、注册可用性检查和关键词搜索的开发 Skill,适合实现域名表单校验或建议功能。它还指导先检查项目已有的验证与 API 模式,再按项目惯例实现。

主要功能

  1. 01按 RFC 1035 和 RFC 1123 校验
  2. 02通过域名 API 检查可用性
  3. 03按关键词生成域名建议
  4. 04批量检查候选域名
  5. 05遵循项目现有实现模式

适用场景

  1. 01校验表单中的域名格式
  2. 02查询域名是否可注册
  3. 03搜索关键词相关的可用域名
  4. 04为应用添加域名建议

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/shipshitdev/skills --skill search-domain-validator

安装后在 Claude Code 中输入/search-domain-validator确认已加载。

附带文件plugin.json

详细介绍

域名搜索与验证器

概述

此技能可验证域名格式、检查域名可用状态,并根据关键词搜索可用域名。它将实现域名验证逻辑、集成域名可用性 API,并提供域名搜索功能。

何时使用此技能

当用户执行以下操作时,此技能会自动激活:

  • 需要验证域名格式或语法
  • 想检查域名是否可以注册
  • 需要根据关键词搜索可用域名
  • 需要在表单或应用中验证域名
  • 需要验证域名是否符合 RFC 标准
  • 想实现域名建议功能

项目上下文发现

提供域名验证指导前,请先了解项目上下文:

  1. 扫描项目文档:

    • 检查是否已有域名验证逻辑
    • 查看表单验证模式
    • 查找 API 集成模式
    • 检查环境变量的使用情况
  2. 识别现有模式:

    • 查看正在使用的验证库
    • 检查 API 客户端模式
    • 查看错误处理方法
    • 检查域名相关工具
  3. 使用项目专属技能:

    • 检查是否存在 [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