php讯飞文本纠错接口对接

32 阅读3分钟

标注:
1、gmstrftime(“%a, %d %b %Y %T %Z”,time()) 获取RFC1123格式时间
2、 hash_hmac(“sha256”, $signature, $this->ApiSecret,true) 二进制的hmac_sha256加密
3、生成的url后面有三个参数
1.authorization通过一系列的加密获得
2.date这个参数需要url加密
3. host 这个参数我写死的

 <?php
 

  
    echo "<pre>";
  $text=  '<h1>
	作者:小飞飞,撰写于6月31日。
</h1>
<p>
	<br />
</p>
<span style="color:#E53333;">想当年</span>,<span style="background-color:#E53333;">他所带领的军</span>队以锐不可<u>挡之势,</u>横扫大江南北,可以说是在父兄基业上既往开来,成就了一番伟业。原本偏安一隅的小国,从他的手中变成了十三个州,国人对这位领袖的敬意由然而生。威望的增加、权利的扩张丝毫没有改变他原有的样样子,他迈步走进岳楼,回忆起在湖北省张家界市的一段往事。那是一个薄雾蒙蒙的清晨,在急促行军途中他与一位素未谋面的人相逢,虽然之后并没有太多故事,却至今难以忘却,正当他的思绪陷入过往,忽然一阵震天的马蹄声夹杂着士兵的喧闹传来,报:“敌人来袭,我方战线危机,望将军火速驰援”。由于刚刚陷入过往的原因,他稍微愣了愣神,咆哮道:“大军听令,即刻出发”!军令如山。成群的士兵迅速从营房中跑出在校场上整齐队列,方阵如虹、战马昂首、刀枪如林、战旗迎风飘扬,将士身上的盔甲在阳光照射下,闪耀着金属的光泽。看着这支曾跟着他南征北战的队伍,他默默翻身登上战马,走在队伍最前面。营房外的道路两旁站满了欢送的百姓,大家希望将军能带领着军队,再次创造奇迹。<br />
<div style="text-align:right;">
	&nbsp; &nbsp; 太阳当空照,花儿对我笑,小鸟说早上好啊,真是画蛇天足
</div>';
//     $text="
//     作者:小飞飞,撰写于6月31日。
// 想当年,他所带领的军队以锐不可挡之势,横扫大江南北,可以说是在父兄基业上既往开来,成就了一番伟业。原本偏安一隅的小国,从他的手中变成了十三个州,国人对这位领袖的敬意由然而生。威望的增加、权利的扩张丝毫没有改变他原有的样样子,他迈步走进岳楼,回忆起在湖北省张家界市的一段往事。那是一个薄雾蒙蒙的清晨,在急促行军途中他与一位素未谋面的人相逢,虽然之后并没有太多故事,却至今难以忘却,正当他的思绪陷入过往,忽然一阵震天的马蹄声夹杂着士兵的喧闹传来,报:“敌人来袭,我方战线危机,望将军火速驰援”。由于刚刚陷入过往的原因,他稍微愣了愣神,咆哮道:“大军听令,即刻出发”!军令如山。成群的士兵迅速从营房中跑出在校场上整齐队列,方阵如虹、战马昂首、刀枪如林、战旗迎风飘扬,将士身上的盔甲在阳光照射下,闪耀着金属的光泽。看着这支曾跟着他南征北战的队伍,他默默翻身登上战马,走在队伍最前面。营房外的道路两旁站满了欢送的百姓,大家希望将军能带领着军队,再次创造奇迹。
// 太阳当空照,花儿对我笑,小鸟说早上好啊,真是画蛇天足";
    
    
       $index=new index;
       
 $zz=$index->authenticate($text);

 
echo $zz;die;
 
  
// pol	政治术语纠错  [位置,原词,结果词,类型]
// char	别字纠错  [位置,原字,结果字,类型],
// word	别词纠错  [位置,原词,结果词,类型]  。
// redund	语法纠错-冗余  [位置,原文本,纠错后文本,类型] 。
// miss	语法纠错-缺失  [位置,原文本,纠错后文本,类型]  
// order	语法纠错-乱序  [位置,原文本,纠错后文本,类型] ,其中【类型】中的lx_word代表词级别乱序纠错、lx_char代表字级别乱序纠错。
// dapei	搭配纠错  [位置,原文本,纠错后文本,类型]  
// punc	标点纠错 [位置,原文本,纠错后文本,类型]
// idm	成语纠错  [位置,原文本,纠错后文本,类型] (纠错后为空表示当前无纠正结果),其中【类型】中的idm-成语纠错。
// org	机构名纠错 [位置,原文本,纠错后文本,类型]  
            // org_R:机构名字词冗余
            // org_M:机构名字词缺失
            // org_S:机构名字词错误
            // org_N:机构名称变更
            // org_P:机构名字词乱序
// addr	地名纠错 [位置,原文本,纠错后文本,类型] (纠错后为空表示当前无纠正结果);【类型】:addr_R-地名字词冗余、addr_M-地名字词缺失、addr_S-地名字词错误



// leader [位置,原文本,纠错后文本,类型] (纠错后为空表示当前无纠正结果),其中【类型】中的lea代表领导人职称纠错。
// number	数字纠错  [位置,原文本,纠错后文本,类型] (纠错后为空表示当前无纠正结果),其中【类型】可能的值如下:
// time:时间纠错
// date-m:日期纠错(月份)
// date-d:日期纠错(日)
// name	全文人名纠错  [位置,原文本,纠错后文本,类型] (纠错后为空表示当前无纠正结果);【类型】:name-全文人名纠错
// grammar_pc	句式杂糅&语义重复 
 class  Index
{
    
    protected  $type=[
                    "black_list"=>"黑名单纠错",
                    "pol"=>"政治术语纠错",
                    "char"=>"别字纠错",
                    "word"=>"别词纠错",
                    "redund"=>"语法纠错-冗余",
                    "miss"=>"语法纠错-缺失",
                    "order"=>"语法纠错-乱序",
                    "dapei"=>"搭配纠错",
                    "punc"=>"标点纠错",
                    "idm"=>"成语纠错",
                    "org"=>"机构名纠错",
                    "addr"=>"地名纠错",
                    "grammar_pc"=>"句式杂糅&语义重复",
     ];
 /* 
     * */
    public  function authenticate($text){
        
          $Base=new Base;
          
        //去除html标签
       $text= $this->removeHtml($text);
        //生成接口url
        $url= $Base->produceurl();
        //生成请求参数
       $postfields= $Base->producepostfields($text);
        //返回数据并解码
      $returntext= json_decode($Base->PostUrl($url, $postfields),true);
      //获取返回数据中的纠错内容
      $base64text=$returntext["payload"]["result"]["text"];
      //解码纠错内容
      $zz=json_decode(base64_decode($base64text),true);
      //拼接错误信息
       $src="";
         foreach ($zz as $key=>$val){
             //  黑名单纠错
             if(!empty($val)&&array_key_exists($key,$this->type)){
                    $src.=$this->type[$key]."\n";
                //   if(=="punc"){ $src.="结果类型".$val[2];}
                  foreach($val as $ke=>$va){
                    //   [位置,原字,结果字,类型]
                    if(!empty($va[1])&&$va[1]!=' '){
                         $src.="         ";
                        $src.="第".$va[0]."字‘";
                        $src.= $va[1];
                        $src.="’应改为‘".$va[2];
                        $src.= "’\n";
                    }
                      
                        
                  }
                    $src.= "\n";
             }
         }
          return $src;
    }
    //去除html标签
      public function removeHtml($content)
    {
        $handle1  = htmlspecialchars_decode($content);  //把一些预定义的 HTML 实体转换为字符
        $handle2  = str_replace("&nbsp;", "", $handle1);//将空格替换成空
        $contents = strip_tags($handle2);               //函数剥去字符串中的 HTML、XML 以及 PHP 的标签,获取纯文本内容
        return $contents;
        // return mb_substr($contents, 0, 50, "utf-8");        //返回字符串中的前100字符串长度的字符
    }


} 
     
//  json_encode($headerBody)

   
/**
 * Created by PhpStorm.
 * User: uolon
 * Date: 2022/08/08
 * Time: 18:21 PM
 */
class  Base
{
    protected $Server = "https://api.xf-yun.com";
    protected $host = "api.xf-yun.com";
    protected $AppId = "xxx";
    protected $ApiSecret="xxx"; 
    protected $AccessKeyId = "xxx"; 
   //生成 参数
  
  public function producepostfields($text){
        $text_base64=base64_encode($text);
        $headerBody=[
                            "header"=>[
                             "app_id"=> $this->AppId,
                             "status"=>3
                            ],
                          "parameter"=>[
                              "s9a87e3ec"=>[
                                           
                                          "result"=>[
                                                "encoding"=>"utf8",
                                                "compress"=>"raw",
                                                "format"=>"json"
                                            ]
                                ]
                            ],
                            "payload"=>[
                                "input"=>[
                                      "encoding"=> "utf8",
                                      "compress"=>"raw",
                                      "format"=>"json",
                                      "status"=>3,
                                      "text"=>$text_base64
                                ]
                            ]
         ];
        return json_encode($headerBody);
     
  }
  //生成 url
  
  public function produceurl(){
      
     $url=$this->Server."/v1/private/s9a87e3ec?authorization=".$this->produceauthorization();
     $url.="&host=".$this->host;
     $url.="&date=". urlencode($this->producedate());
     
     return $url;
  }
   //生成 authorization
  
  protected function produceauthorization(){
      
       $api='api_key="'.$this->AccessKeyId.'", algorithm="hmac-sha256", headers="host date request-line", signature="';
        $api.=$this->producesignature().'"';
    //   var_dump($api);die;
        $authorization=base64_encode($api);
    //  var_dump($authorization_origin);die;
            return $authorization;
  }
  //生成 date
  
  protected function producedate(){
      
        $producedate=gmstrftime("%a, %d %b %Y %T %Z",time());
       
            // return "Fri, 09 Sep 2022 01:40:15 GMT";die;//$producedate;
            
            return $producedate;
  }
  //生成 signature
  
  protected function producesignature(){
      
        $signature="host: ".$this->host."\n";
        // $signature="host: api.xf-yun.com\n";
        $signature.="date: ".$this->producedate()."\n";
      
        $signature.="POST /v1/private/s9a87e3ec HTTP/1.1";
        
 
        $signature_hash = hash_hmac("sha256", $signature, $this->ApiSecret,true);
        $signature_base64=base64_encode($signature_hash);
      
            return $signature_base64;
  }
  //curl请求
    public function PostUrl($durl, $post_data){
        // header传送格式
        $headers = array(
            'Content-Type: application/json; charset=utf-8',
            // "app_id: ".$this->AppId
       
        );
        //初始化
        $curl = curl_init();
        //设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $durl);
        //设置头文件的信息作为数据流输出
        curl_setopt($curl, CURLOPT_HEADER, false);
        //设置获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
        //设置post方式提交
        curl_setopt($curl, CURLOPT_POST, true);
        // 设置post请求参数
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        // 添加头信息
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        // CURLINFO_HEADER_OUT选项可以拿到请求头信息
        curl_setopt($curl, CURLINFO_HEADER_OUT, true);
        // 不验证SSL
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        // 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
        // curl_setopt($curl, CURLOPT_HEADER, true);
        //执行命令
 
        $data = curl_exec($curl);
        
  
        
        // // 获得响应结果里的:头大小
        // $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        
        // // 根据头大小去获取头信息内容
        // $header = substr($data, 0, $headerSize);
        
        
        $httpCode = curl_getinfo($curl,CURLINFO_HTTP_CODE);
        if($httpCode!==200){
                // echo "<hr><h1>打印请求头信息</h1>";
                // // 打印请求头信息
                // echo curl_getinfo($curl, CURLINFO_HEADER_OUT);
                
                
                // echo "<hr><h1>打印请求body信息</h1>";
                // // 打印请求头信息
                // echo $post_data;
                
                // // echo "<hr><h1>打印响应头信息</h1>";
                // // // 获得响应结果里的:头大小
                // // $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
                
                // //   // 根据头大小去获取头信息内容
                // // $header = substr($data, 0, $headerSize);
                // // echo $header;
                
                
                // echo "<hr><h1>打印响应信息</h1>";
                
                
                // echo $data;
                // die;
            //   var_dump($httpCode);die;
        }
       
  
        //关闭URL请求
        curl_close($curl);
        //显示获得的数据
        return $data;
    }

    


}