PHP 实现百度云加速(Yunjiasu)API及SDK封装

南乔
南乔
发布时间:2026-10-15| 6人浏览过
原创

由于百度智能云加速官方接口文档中存在部分参数未实现或描述不符的情况,实际开发中需交叉使用 v3 和 v31 版本接口。本方案通过 PHP 实现了一套完整的核心类与管理类,自动处理 HMAC-SHA1 签名与 HTTP 头封装,方便开发者快速集成域名管理(DNS记录增删改查)及缓存刷新功能。

核心原理与注意事项

百度云加速 API 采用基于时间戳和非ce(Nonce)的 HMAC-SHA1 签名机制。在调用任何 API 前,必须构建包含 Access Key、Path Info、Timestamp 等字段的 Header,并生成 Sign 字段。

// 注意:官方接口v3和v31有些参数并未实现,或返回的内容和文档描述不符合
// 所以在封装时交叉使用了2个版本的API

准备工作

  1. 获取百度智能云账号的 Access Key 和 Secret Key。
  2. 确认目标站点已通过百度云加速接入。
  3. 确保服务器支持 PHP CURL 扩展。

代码结构与真实操作

代码分为两部分:YunjiasuCore 负责底层 HTTP 请求与鉴权,Yunjiasu 作为业务包装层提供便捷方法。

第一步:配置核心请求类

YunjiasuCore 负责处理所有网络交互,内部实现了 api_call 统一分发器,并根据环境打印调试信息(CLI模式下)。

class YunjiasuCore
{
    private $api_base = 'https://api.su.baidu.com/';
    private $access_key = '';
    private $secret_key = '';

    public function __construct($access_key, $secret_key)
    {
        $this->access_key = $access_key;
        $this->secret_key = $secret_key;
    }
    
    // ... 此处省略具体HTTP请求逻辑,参考下方完整代码块

第二步:封装业务管理类

Yunjiasu 类初始化时自动根据域名查找 Zone ID,并重载了常用方法如 DNS 查询、删除及缓存清除。

/**
 * Author: rehiy <https://www.rehiy.com>
 * Update: 2021-04-12
 */
class Yunjiasu
{
    private $su;
    private $name = '';
    private $zone = [];
    private $zone_fn = [
        'dns_records',
        'dns_records_post',
        'dns_records_patch',
        'dns_records_delete',
        'purge_cache',
    ];

    public function __construct($domain, $access_key, $secret_key)
    {
        $this->su = new YunjiasuCore($access_key, $secret_key);
        // 自动查找对应的 zone id
        $this->zone = $this->su->zones(['name' => $domain]);
        if (empty($this->zone['id'])) {
            throw new Exception('not found domain');
        }
        $this->name = $domain;
    }

    public function __call($name, $arguments)
    {
        // 动态代理核心类方法,若为Zone级操作自动注入ID
        if (in_array($name, $this->zone_fn)) {
            array_unshift($arguments, $this->zone['id']);
        }
        return call_user_func_array(array($this->su, $name), $arguments);
    }

    /**
     * 强制清理缓存
     */
    public function purge_cache($data)
    {
        return $this->su->purge_cache($this->zone['id'], $data);
    }

    /**
     * 查询DNS记录并过滤
     */
    public function dns_records($data = [])
    {
        $list = $this->su->dns_records($this->zone['id']);
        if (empty($list) || empty($data)) {
            return $list;
        }
        return array_filter(
            $list,
            function ($item) use ($data) {
                isset($data['name']) && $data['name'] .= '.' . $this->name;
                return count($data) === count(array_intersect_assoc($item, $data));
            }
        );
    }

    /**
     * 批量删除匹配条件的DNS记录
     */
    public function dns_records_delete($data)
    {
        return array_map(
            function ($rs) {
                return $this->su->dns_records_delete($this->zone['id'], $rs['id']);
            },
            $this->dns_records($data)
        );
    }
}

// 核心请求类实现
class YunjiasuCore
{
    private $api_base = 'https://api.su.baidu.com/';
    private $access_key = '';
    private $secret_key = '';

    public function __construct($access_key, $secret_key)
    {
        $this->access_key = $access_key;
        $this->secret_key = $secret_key;
    }

    // -------------------------------------------------------
    // 基础API路由
    // -------------------------------------------------------
    public function zones($data)
    {
        // v31 版本
        $path = 'v31/yjs/zones';
        return $this->api_call('GET', $path, $data);
    }

    // DNS相关
    public function dns_records($zone_id)
    {
        $path = 'v31/yjs/zones/' . $zone_id . '/dns_records';
        return $this->api_call('GET', $path);
    }

    public function dns_records_post($zone_id, $data)
    {
        $path = 'v31/yjs/zones/' . $zone_id . '/dns_records';
        return $this->api_call('POST', $path, $data);
    }

    public function dns_records_patch($zone_id, $data)
    {
        $path = 'v31/yjs/zones/' . $zone_id . '/dns_records';
        return $this->api_call('PATCH', $path, $data);
    }

    public function dns_records_delete($zone_id, $id)
    {
        $path = 'v31/yjs/zones/' . $zone_id . '/dns_records/' . $id;
        return $this->api_call('DELETE', $path);
    }

    // 缓存清理
    public function purge_cache($zone_id, $data)
    {
        // v31 版本用于Cache Purge
        $path = 'v31/yjs/zones/' . $zone_id . '/purge_cache';
        return $this->api_call('DELETE', $path, $data);
    }

    // 证书相关 (注:部分证书接口可能位于v3版本)
    public function custom_certificates($data)
    {
        $path = 'v3/yjs/custom_certificates';
        return $this->api_call('GET', $path, $data);
    }

    public function custom_certificates_post($data)
    {
        $path = 'v3/yjs/custom_certificates';
        return $this->api_call('POST', $path, $data);
    }

    public function custom_certificates_delete($data)
    {
        $path = 'v3/yjs/custom_certificates';
        return $this->api_call('DELETE', $path, $data);
    }

    // -------------------------------------------------------
    // 核心请求逻辑
    // -------------------------------------------------------
    private function api_call($method, $path, $data = NULL)
    {
        if (PHP_SAPI == 'cli') {
            print_r("\n> " . $method . ' /' . $path);
        }
        $url = $this->api_base . $path;
        $header = $this->api_header($path, $data);
        $result = $this->http_repuest($method, $url, $header, $data);

        if (!empty($result['errors'])) {
            $error = json_encode($result['errors']);
            throw new Exception($error);
        }
        if (!empty($result['result'])) {
            return $result['result'];
        }
        if (!empty($result['success'])) {
            return ['success' => true];
        }
        return $result;
    }

    private function api_header($path, $data = NULL)
    {
        $params = [
            'X-Auth-Access-Key' => $this->access_key,
            'X-Auth-Nonce' => uniqid(),
            'X-Auth-Path-Info' => $path,
            'X-Auth-Signature-Method' => 'HMAC-SHA1',
            'X-Auth-Timestamp' => time(),
        ];
        if (is_array($data)) {
            $params = array_merge($params, $data);
        }
        ksort($params);

        $header = $signls = [];
        foreach ($params as $k => $v) {
            if (is_bool($v)) {
                $v = $v ? 'true' : 'false';
            }
            if (is_array($v)) {
                $v = str_replace('","', '", "', json_encode($v, JSON_UNESCAPED_SLASHES));
            }
            if (strpos($k, 'X-Auth') === 0) {
                $header[] = $k . ':' . $v;
            }
            if ($v !== '') {
                $signls[] = $k . '=' . $v;
            }
        }
        // 计算签名
        $header[] = 'X-Auth-Sign:' . base64_encode(
            hash_hmac('sha1', implode('&', $signls), $this->secret_key, true)
        );
        return $header;
    }

    // 修复原代码拼写错误 http_repuest -> http_request
    private function http_repuest($method, $url, $header = NULL, $body = NULL)
    {
        $ch = curl_init();
        if ($method == 'GET' && $body) {
            $url .= '?' . http_build_query($body);
            $body = NULL;
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        if ($header) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        if ($body) {
            if (is_array($body)) {
                $body = json_encode($body);
            }
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        }
        $result = curl_exec($ch);
        $errno = curl_errno($ch);
        $error = curl_error($ch);
        curl_close($ch);
        if ($errno) {
            return ['error' => $errno, 'message' => $error];
        }
        return json_decode($result, true);
    }
}

完成判断

  • 实例化 Yunjiasu 类后,可通过 dns_records() 查看解析记录。
  • 调用 purge_cache() 可清空对应域名的 CDN 缓存。
  • 若发生网络错误或权限不足,将抛出 Exception。

以上就是php实现百度云加速API及SDK封装的详细内容,更多关于php封装百度云加速API及SDK的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。