科大讯飞文本改写

全屏阅读
  • 基本信息
<?php

 

class XunFeiReWriting
{
    private $app_key = "";
    private $app_secret = "";
    private $date = "";
    private $url = "https://api.xf-yun.com/v1/private/se3acbe7f";
    private $content = "要改的文本内容";
    private $level = "L3";
    private $app_id = "";
    private static $instance;


    /**
     * 禁止new
     */
    private function __construct()
    {
        $this->date = gmdate('D, d M Y H:i:s') . ' GMT';

    }

    /**
     * 禁止clone
     * @return void
     */
    private function __clone()
    {
    }

    /**
     * 获得唯一实例
     * @return XunFeiReWriting
     */
    public static function getInstance(): XunFeiReWriting
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 设置app key
     * @param string $app_key app key
     * @return XunFeiReWriting
     */
    public function setAppKey(string $app_key): XunFeiReWriting
    {
        $this->app_key = $app_key;
        return $this;
    }


    /**
     * 设置app secret
     * @param string $app_secret app secret
     * @return XunFeiReWriting
     */
    public function setAppSecret(string $app_secret): XunFeiReWriting
    {
        $this->app_secret = $app_secret;
        return $this;
    }

    /**
     * 设置app id
     * @param string $app_id app id
     * @return XunFeiReWriting
     */
    public function setAppId(string $app_id): XunFeiReWriting
    {
        $this->app_id = $app_id;
        return $this;
    }

    /**
     * 设置改写内容
     * @param string $content 需要改写的内容
     * @return XunFeiReWriting
     */
    public function setContent(string $content): XunFeiReWriting
    {
        $this->content = $content;
        return $this;
    }

    /**
     * 设置改写等级
     * @param string $level 改写等级(L1~L6)
     * @return $this
     */
    public function setLevel(string $level): XunFeiReWriting
    {
        $this->level = $level;
        return $this;
    }


    /**
     * hmac_sha256加密
     * @param string $content
     * @return string
     */
    private function hmacSha256Encode(string $content): string
    {
        return base64_encode(hash_hmac("sha256", $content, $this->app_secret, true));

    }

    /**
     * 从url中获取主机名
     * @return string
     */
    private function getHost(): string
    {
        $urlArray = parse_url($this->url);
        return $urlArray["host"];
    }

    /**
     * 从URL中获取协议头
     * @return string
     */
    private function getScheme(): string
    {
        $urlInfo = parse_url($this->url);
        return $urlInfo["scheme"];
    }

    /**
     * 拼接完整URL
     * @param string $authorization
     * @return string
     */
    private function getFullUrl(string $authorization): string
    {
        return $this->url . "?host=" . $this->getHost() . "&date=" . urlencode($this->date) . "&authorization=" . $authorization;
    }


    /**
     * 获取错误信息
     * @param int $key http code
     * @return string
     */
    private function getErrorMessage(int $key): string
    {
        $messageArray = [
            401 => "缺少authorization参数或签名参数解析失败",
            403 => "时钟偏移校验失败,检查服务器时间是否标准,相差5分钟以上会报此错误"
        ];
        if (array_key_exists($key, $messageArray)) {
            return $messageArray[$key];
        }
        return "未知错误";
    }

    public function get(): array
    {
        $signatureOrigin = "host: {$this->getHost()}\ndate: {$this->date}\nPOST /v1/private/se3acbe7f HTTP/1.1";
        $signatureSha = $this->hmacSha256Encode($signatureOrigin);
        $authorizationContent = [
            "api_key" => $this->app_key,
            "algorithm" => "hmac-sha256",
            "headers" => "host date request-line",
            "signature" => $signatureSha
        ];
        $authorization = "";
        foreach ($authorizationContent as $k => $v) {
            $authorization .= $k . '=' . '"' . $v . '",';
        }
        $authorization = base64_encode(rtrim($authorization, ","));
        $requestBody = [
            "header" => [
                "app_id" => $this->app_id,
                "status" => 3
            ],
            "parameter" => [
                "se3acbe7f" => [
                    "level" => "<" . $this->level . ">",
                    "result" => [
                        "encoding" => "utf8",
                        "compress" => "raw",
                        "format" => "json"
                    ]
                ]
            ],
            "payload" => [
                "input1" => [
                    "encoding" => "utf8",
                    "compress" => "raw",
                    "format" => "plain",
                    "status" => 3,
                    "text" => base64_encode($this->content)
                ]
            ]
        ];
        $url = $this->getFullUrl($authorization);
        return $this->request($url, $requestBody);
    }


    /**
     * 发送请求
     * @param string $url 请求地址
     * @param array $requestBody 请求体(数组)
     *
     */
    private function request(string $url, array $requestBody): array
    {
        $headerArray = array("Content-type:application/json;Host:{$this->getHost()}");
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        if ($this->getScheme() == "https") {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        }
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($requestBody));
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headerArray);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($curl);
        $requestError = curl_error($curl);
        if ($requestError) {
            return [
                "code" => 201,
                "message" => "请求错误"
            ];
        }
        $responseHeader = curl_getinfo($curl);
        if ($responseHeader["http_code"] != 200) {
            return [
                "code" => 201,
                "message" => $this->getErrorMessage($responseHeader["http_code"])
            ];
        }
        curl_close($curl);
        $responseBody = json_decode($response);
        if ($responseBody->header->code != 0) {
            return [
                "code" => 201,
                "message" => $responseBody->header->message
            ];
        }
        $messageArray = json_decode(base64_decode($responseBody->payload->result->text));
        return [
            "code" => 200,
            "message" => is_array($messageArray) ? $messageArray[0] ? $messageArray[0][0] ?: "" : "" : ""
        ];
    }

}

科大讯飞文本改写PHP类库,支持链式调用

调用示例

XunFeiReWriting::getInstance()->setAppKey("你的app key")->setAppSecret("你的App secret")->setAppId("你的app ID")->setContent("要改写的文本内容")->get();

当然, 你也可以在类中将appKey、appSecret、appID等固定字段写死,然后调用:

XunFeiReWriting::getInstance()->setContent("要改写的内容")->get();

即可。

返回值为数组,示例如下:

["code"  =>  200,     //201表示出了故障	
"message" => "改写完成后的文本内容"    //当code为201时, 表示为错误信息
]

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!