PHP版百度云加速API/SDK封装

百度云加速API参考文档 https://su.baidu.com/help/index.html#/7_kaifazhinan/2_APIcankao-NEW/2_wangzhanjieru/2.1.1_tianjiayuming.md

<?php

/**
 * Author: anrip <https://www.arnip.com>
 * Update: 2021-04-13
 */

class Yunjiasu
{
    private $su;

    private $name = '';
    private $zone = [];

    public function __construct($domain, $access_key, $secret_key)
    {
        $this->su = new YunjiasuCore($access_key, $secret_key);
        $this->zone = $this->su->zones(['name' => $domain]);
        $this->name = $domain;
    }

    public function __call($name, $arguments)
    {
        array_unshift($arguments, $this->zone['id']);
        return call_user_func_array(array($this->su, $name), $arguments);
    }

    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 $data === 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 = 'zones';
        return $this->api_call('GET', $path, $data);
    }

    ////////////////////////////////////////////////////////////////

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

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

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

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

    ////////////////////////////////////////////////////////////////

    public function purge_cache($zone_id, $data)
    {
        $path = 'zones/' . $zone_id . '/purge_cache';
        return $this->api_call('DELETE', $path, $data);
    }

    ////////////////////////////////////////////////////////////////

    private function api_call($method, $path, $data = NULL)
    {
        $path = 'v31/yjs/' . $path;

        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封装”的3个回复

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注