search-domain-validator について
ドメイン形式の検証、登録可能性の確認、キーワード検索を実装する開発スキルです。フォーム検証や候補提示の機能に向け、既存プロジェクトの実装パターンを調べてから進めます。
主な機能
- 01RFC 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 を含めることを検討してください。