Skip to content

API接口文档

本文档详细介绍 Yuan-ICP 系统提供的 API 接口,包括接口规范、使用方法、参数说明和示例代码。

📋 API概览

Yuan-ICP 系统提供 RESTful API 接口,支持:

  • 号码获取:获取可用的备案号码
  • 申请提交:提交备案申请
  • 状态查询:查询申请状态
  • 数据统计:获取系统统计数据

API基础信息

  • 基础URL/api/
  • 协议:HTTP/HTTPS
  • 数据格式:JSON
  • 字符编码:UTF-8
  • 认证方式:API Key(可选)

🔑 认证和授权

API Key认证

对于需要认证的接口,请在请求头中添加API Key:

http
Authorization: Bearer YOUR_API_KEY

获取API Key

  1. 登录后台管理系统
  2. 进入"系统设置" → "API管理"
  3. 生成新的API Key
  4. 设置API Key的权限和有效期

权限级别

权限级别描述可访问接口
public公开接口号码获取、申请查询
user用户接口申请提交、状态查询
admin管理接口数据统计、系统管理

📡 号码获取接口

获取可用号码

接口信息

  • URL/api/get_numbers.php
  • 方法:GET
  • 描述:获取可用的备案号码列表

请求参数

参数名类型必填默认值说明
modestringauto获取模式:auto(自动生成) 或 pool(号码池)
countinteger1获取数量,最大100
premium_onlybooleanfalse是否只要靓号
formatstring系统默认号码格式(仅自动生成模式)

请求示例

bash
# 获取1个自动生成的号码
curl "https://your-domain.com/api/get_numbers.php?mode=auto&count=1"

# 获取5个号码池中的号码
curl "https://your-domain.com/api/get_numbers.php?mode=pool&count=5"

# 获取靓号
curl "https://your-domain.com/api/get_numbers.php?premium_only=true&count=3"

响应格式

json
{
    "success": true,
    "data": {
        "numbers": [
            {
                "number": "YuanAB12345678",
                "is_premium": true,
                "mode": "auto"
            },
            {
                "number": "YuanCD87654321",
                "is_premium": false,
                "mode": "pool"
            }
        ],
        "total": 2,
        "mode": "auto"
    },
    "message": "成功获取号码",
    "timestamp": "2024-01-15T10:30:00Z"
}

响应字段说明

字段名类型说明
successboolean请求是否成功
data.numbersarray号码列表
data.numbers[].numberstring备案号码
data.numbers[].is_premiumboolean是否为靓号
data.numbers[].modestring号码来源模式
data.totalinteger返回的号码总数
data.modestring实际使用的获取模式
messagestring响应消息
timestampstring响应时间戳

错误响应

json
{
    "success": false,
    "error": {
        "code": "INVALID_PARAMETER",
        "message": "无效的参数值",
        "details": "count参数必须在1-100之间"
    },
    "timestamp": "2024-01-15T10:30:00Z"
}

错误代码说明

错误代码HTTP状态码说明
INVALID_PARAMETER400参数无效
MODE_NOT_SUPPORTED400不支持的获取模式
NO_NUMBERS_AVAILABLE404没有可用的号码
RATE_LIMIT_EXCEEDED429请求频率超限
INTERNAL_ERROR500服务器内部错误

📝 申请提交接口

提交备案申请

接口信息

  • URL/api/submit_application.php
  • 方法:POST
  • 描述:提交新的备案申请

请求参数

参数名类型必填说明
website_namestring网站名称
domainstring网站域名
descriptionstring网站描述
owner_namestring申请人姓名
owner_emailstring申请人邮箱
owner_phonestring申请人电话
numberstring指定备案号(可选)
csrf_tokenstringCSRF令牌

请求示例

bash
curl -X POST "https://your-domain.com/api/submit_application.php" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "website_name": "示例网站",
    "domain": "example.com",
    "description": "这是一个示例网站",
    "owner_name": "张三",
    "owner_email": "zhangsan@example.com",
    "owner_phone": "13800138000"
  }'

响应格式

json
{
    "success": true,
    "data": {
        "application_id": 123,
        "number": "YuanAB12345678",
        "status": "pending",
        "submitted_at": "2024-01-15T10:30:00Z"
    },
    "message": "申请提交成功",
    "timestamp": "2024-01-15T10:30:00Z"
}

响应字段说明

字段名类型说明
data.application_idinteger申请ID
data.numberstring分配的备案号
data.statusstring申请状态
data.submitted_atstring提交时间

🔍 状态查询接口

查询申请状态

接口信息

  • URL/api/query_application.php
  • 方法:GET
  • 描述:查询备案申请的状态

请求参数

参数名类型必填说明
numberstring备案号(与域名二选一)
domainstring域名(与备案号二选一)
emailstring申请人邮箱(用于验证身份)

请求示例

bash
# 按备案号查询
curl "https://your-domain.com/api/query_application.php?number=YuanAB12345678"

# 按域名查询
curl "https://your-domain.com/api/query_application.php?domain=example.com"

# 按邮箱查询
curl "https://your-domain.com/api/query_application.php?email=zhangsan@example.com"

响应格式

json
{
    "success": true,
    "data": {
        "application": {
            "id": 123,
            "number": "YuanAB12345678",
            "website_name": "示例网站",
            "domain": "example.com",
            "description": "这是一个示例网站",
            "owner_name": "张三",
            "owner_email": "zhangsan@example.com",
            "owner_phone": "13800138000",
            "status": "approved",
            "created_at": "2024-01-15T10:30:00Z",
            "reviewed_at": "2024-01-15T14:20:00Z",
            "reviewer": "admin"
        }
    },
    "message": "查询成功",
    "timestamp": "2024-01-15T15:00:00Z"
}

响应字段说明

字段名类型说明
data.application.idinteger申请ID
data.application.numberstring备案号
data.application.website_namestring网站名称
data.application.domainstring域名
data.application.statusstring申请状态
data.application.created_atstring创建时间
data.application.reviewed_atstring审核时间
data.application.reviewerstring审核人

📊 统计接口

获取系统统计

接口信息

  • URL/api/statistics.php
  • 方法:GET
  • 描述:获取系统统计数据
  • 权限:需要admin权限

请求参数

参数名类型必填说明
typestring统计类型:overview(概览) 或 detailed(详细)
periodstring统计周期:today(今天) 或 month(本月)

请求示例

bash
curl -H "Authorization: Bearer ADMIN_API_KEY" \
  "https://your-domain.com/api/statistics.php?type=overview&period=month"

响应格式

json
{
    "success": true,
    "data": {
        "overview": {
            "total_applications": 156,
            "pending_applications": 15,
            "approved_applications": 128,
            "rejected_applications": 13,
            "total_numbers": 1000,
            "available_numbers": 844,
            "premium_numbers": 89
        },
        "period": "month",
        "generated_at": "2024-01-15T15:00:00Z"
    },
    "message": "统计数据获取成功",
    "timestamp": "2024-01-15T15:00:00Z"
}

🚨 错误处理

标准错误响应

所有API接口在发生错误时都会返回统一的错误格式:

json
{
    "success": false,
    "error": {
        "code": "ERROR_CODE",
        "message": "错误描述",
        "details": "详细错误信息"
    },
    "timestamp": "2024-01-15T15:00:00Z"
}

HTTP状态码

状态码说明
200请求成功
400请求参数错误
401未授权(需要API Key)
403禁止访问(权限不足)
404资源不存在
429请求频率超限
500服务器内部错误

常见错误处理

javascript
// JavaScript错误处理示例
async function callAPI(url, options = {}) {
    try {
        const response = await fetch(url, options);
        const data = await response.json();
        
        if (!data.success) {
            throw new Error(data.error.message);
        }
        
        return data;
    } catch (error) {
        console.error('API调用失败:', error.message);
        throw error;
    }
}

// 使用示例
try {
    const result = await callAPI('/api/get_numbers.php?count=5');
    console.log('获取到的号码:', result.data.numbers);
} catch (error) {
    console.error('获取号码失败:', error.message);
}

📱 客户端集成

JavaScript SDK

javascript
/**
 * Yuan-ICP API SDK
 */
class YuanICPSDK {
    constructor(baseURL, apiKey = null) {
        this.baseURL = baseURL;
        this.apiKey = apiKey;
    }
    
    // 设置请求头
    getHeaders() {
        const headers = {
            'Content-Type': 'application/json'
        };
        
        if (this.apiKey) {
            headers['Authorization'] = `Bearer ${this.apiKey}`;
        }
        
        return headers;
    }
    
    // 通用请求方法
    async request(endpoint, options = {}) {
        const url = `${this.baseURL}${endpoint}`;
        const config = {
            headers: this.getHeaders(),
            ...options
        };
        
        const response = await fetch(url, config);
        const data = await response.json();
        
        if (!data.success) {
            throw new Error(data.error.message);
        }
        
        return data;
    }
    
    // 获取号码
    async getNumbers(options = {}) {
        const params = new URLSearchParams(options);
        return this.request(`/api/get_numbers.php?${params}`);
    }
    
    // 提交申请
    async submitApplication(applicationData) {
        return this.request('/api/submit_application.php', {
            method: 'POST',
            body: JSON.stringify(applicationData)
        });
    }
    
    // 查询申请
    async queryApplication(query) {
        const params = new URLSearchParams(query);
        return this.request(`/api/query_application.php?${params}`);
    }
    
    // 获取统计
    async getStatistics(options = {}) {
        const params = new URLSearchParams(options);
        return this.request(`/api/statistics.php?${params}`);
    }
}

// 使用示例
const sdk = new YuanICPSDK('https://your-domain.com', 'YOUR_API_KEY');

// 获取号码
sdk.getNumbers({ count: 5, premium_only: true })
    .then(result => {
        console.log('获取到的号码:', result.data.numbers);
    })
    .catch(error => {
        console.error('获取号码失败:', error.message);
    });

// 提交申请
sdk.submitApplication({
    website_name: '示例网站',
    domain: 'example.com',
    owner_name: '张三',
    owner_email: 'zhangsan@example.com'
})
.then(result => {
    console.log('申请提交成功:', result.data);
})
.catch(error => {
    console.error('申请提交失败:', error.message);
});

PHP客户端

php
<?php
/**
 * Yuan-ICP API PHP客户端
 */
class YuanICPSDK {
    private $baseURL;
    private $apiKey;
    
    public function __construct($baseURL, $apiKey = null) {
        $this->baseURL = rtrim($baseURL, '/');
        $this->apiKey = $apiKey;
    }
    
    /**
     * 发送HTTP请求
     */
    private function request($endpoint, $method = 'GET', $data = null) {
        $url = $this->baseURL . $endpoint;
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        
        $headers = ['Content-Type: application/json'];
        if ($this->apiKey) {
            $headers[] = 'Authorization: Bearer ' . $this->apiKey;
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        
        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            if ($data) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            }
        }
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        if ($response === false) {
            throw new Exception('请求失败');
        }
        
        $result = json_decode($response, true);
        if (!$result) {
            throw new Exception('响应解析失败');
        }
        
        if (!$result['success']) {
            throw new Exception($result['error']['message']);
        }
        
        return $result;
    }
    
    /**
     * 获取号码
     */
    public function getNumbers($options = []) {
        $params = http_build_query($options);
        return $this->request('/api/get_numbers.php?' . $params);
    }
    
    /**
     * 提交申请
     */
    public function submitApplication($data) {
        return $this->request('/api/submit_application.php', 'POST', $data);
    }
    
    /**
     * 查询申请
     */
    public function queryApplication($query) {
        $params = http_build_query($query);
        return $this->request('/api/query_application.php?' . $params);
    }
    
    /**
     * 获取统计
     */
    public function getStatistics($options = []) {
        $params = http_build_query($options);
        return $this->request('/api/statistics.php?' . $params);
    }
}

// 使用示例
try {
    $sdk = new YuanICPSDK('https://your-domain.com', 'YOUR_API_KEY');
    
    // 获取号码
    $result = $sdk->getNumbers(['count' => 5, 'premium_only' => true]);
    echo "获取到的号码: " . json_encode($result['data']['numbers']) . "\n";
    
    // 提交申请
    $result = $sdk->submitApplication([
        'website_name' => '示例网站',
        'domain' => 'example.com',
        'owner_name' => '张三',
        'owner_email' => 'zhangsan@example.com'
    ]);
    echo "申请提交成功: " . $result['data']['number'] . "\n";
    
} catch (Exception $e) {
    echo "操作失败: " . $e->getMessage() . "\n";
}
?>

🔒 安全考虑

API安全最佳实践

  1. 使用HTTPS:所有API调用都应使用HTTPS协议
  2. API Key管理:定期轮换API Key,设置合理的权限
  3. 请求频率限制:实施请求频率限制,防止滥用
  4. 输入验证:验证所有输入参数,防止注入攻击
  5. 日志记录:记录所有API调用,便于审计和监控

频率限制

系统实施以下频率限制:

  • 公开接口:每分钟最多60次请求
  • 用户接口:每分钟最多30次请求
  • 管理接口:每分钟最多10次请求

超过限制时,系统返回429状态码和相应的错误信息。

📚 相关文档

🎯 总结

Yuan-ICP API提供了完整的接口服务:

  1. 号码管理:获取和管理备案号码
  2. 申请处理:提交和查询备案申请
  3. 数据统计:获取系统运行数据
  4. 安全可靠:完善的认证和授权机制

通过合理使用API接口,您可以:

  • 集成到现有系统中
  • 开发移动应用
  • 自动化备案流程
  • 构建第三方服务

如有问题或建议,欢迎:

  1. GitHub Issues 中报告问题
  2. 提交 Pull Request 改进文档
  3. Discussions 中讨论API设计

基于 MIT 协议发布