php实现百度云加速API及SDK封装

 更新时间:2022年6月11日 19:39  点击:784 作者:若海

百度云加速API参考文档 

https://su.baidu.com/help/index.html#/7_kaifazhinan/2_APIcankao-NEW/2_wangzhanjieru/2.1.1_tianjiayuming.md

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

/**
 * 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);
        $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)
    {
        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);
    }
    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));
            }
        );
    }
    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;
    }
    ////////////////////////////////////////////////////////////////
    public function zones($data)
    {
        $path = 'v31/yjs/zones';
        return $this->api_call('GET', $path, $data);
    }
    ////////////////////////////////////////////////////////////////
    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)
    {
        $path = 'v31/yjs/zones/' . $zone_id . '/purge_cache';
        return $this->api_call('DELETE', $path, $data);
    }
    ////////////////////////////////////////////////////////////////
    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;
    }
    ////////////////////////////////////////////////////////////////
    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);
    }
}

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

原文出处:https://www.rehiy.com/post/159

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • WebStorm无法正确识别Vue3组合式API的解决方案

    这篇文章主要介绍了WebStorm无法正确识别Vue3组合式API的解决方案,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下...2021-02-18
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • 浅谈vue2的$refs在vue3组合式API中的替代方法

    这篇文章主要介绍了浅谈vue2的$refs在vue3组合式API中的替代方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-18
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • 如何使用 JavaScript 操作浏览器历史记录 API

    这篇文章主要介绍了如何使用 JavaScript 操作浏览器历史记录 API,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2020-11-24
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • 理解JavaScript中worker事件api

    这篇文章主要帮助大家理解JavaScript中worker事件api,对worker事件api有一个深刻了解,感兴趣的小伙伴们可以参考一下...2015-12-27
  • vue设置全局访问接口API地址操作

    这篇文章主要介绍了vue设置全局访问接口API地址操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
  • 如何设计一个安全的API接口详解

    在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下...2021-08-12
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法

    这篇文章主要介绍了C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法,结合实例形式分析了GetDesktopWindow函数用于获取窗口句柄的具体使用方法与相关注意事项,需要的朋友可以参考下...2020-06-25
  • Vue常用API、高级API的相关总结

    这篇文章主要介绍了Vue常用API、高级API的相关总结,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下...2021-02-04
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • 浅谈VUE uni-app 常用API

    这篇文章主要介绍了uni-app 常用API,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-10-20
  • Swift 中如何使用 Option Pattern 改善可选项的 API 设计

    这篇文章主要介绍了Swift 中如何使用 Option Pattern 改善可选项的 API 设计,帮助大家更好的进行ios开发,感兴趣的朋友可以了解下...2020-10-23