首先你要得到讯飞的api接口 然后尼就可以开始对接 查看讯飞的对接方式文档 发现该方式是以这样方式相连接 那需要链接WebSocket 服务器WebSocket...
首先你要得到讯飞的api接口
然后尼就可以开始对接 查看讯飞的对接方式文档
发现该方式是以这样方式相连接 那需要链接WebSocket 服务器WebSocket 服务器
ws(s)://spark-api.xf-yun.com/v1.1/chat
WebSocket 服务器WebSocket 服务器项目地址
https://github.com/Textalk/websocket-php
安装
使用composer一键安装WebSocket 服务器
在类中引入了
require('vendor/autoload.php');
use WebSocket\Client;
封装类库
我是这样封装的 使用了某cms方法
<?php
// +----------------------------------------------------------------------
// | Site: [ http://www.yzmcms.com]
// +----------------------------------------------------------------------
// | Copyright: 袁志蒙工作室,并保留所有权利
// +----------------------------------------------------------------------
// | Author: YuanZhiMeng <214243830@qq.com>
// +----------------------------------------------------------------------
// | Explain: 这不是一个自由软件,您只能在不用于商业目的的前提下对程序代码进行修改和使用,不允许对程序代码以任何形式任何目的的再发布!
// +----------------------------------------------------------------------
defined('IN_YZMPHP') or exit('Access Denied');
require(APP_PATH.ROUTE_M.'/vendor/autoload.php');
use WebSocket\Client;
class model_client
{
/**
* @构造配置参数
* @author zhaosong
* @date 2023-11-03
*/
public function __construct($data)
{
$this->APPID = $data['appid'];
$this->APISecret = $data['apisecret'];
$this->APIKey = $data['apikey'];
$this->APIURL = $data['apiurl'];
}
/**
* @发送数据到 WebSocket 服务器
* @author zhaosong
* @date 2023-11-03
*/
public function iflytek_cation($problem) {
$addr = $this->APIURL;
$Appid = $this->APPID;
$Apikey = $this->APIKey;
$ApiSecret = $this->APISecret;
$authUrl = $this->assembleAuthUrl("GET",$addr,$Apikey,$ApiSecret);
//创建ws连接对象
$client = new Client($authUrl);
// 连接到 WebSocket 服务器
if ($client) {
// 发送数据到 WebSocket 服务器
$data = $this->getBody($Appid,$problem);
$client->send($data);
// 从 WebSocket 服务器接收数据
$answer = "";
while(true) {
$response = $client->receive();
$resp = json_decode($response,true);
$code = $resp["header"]["code"];
if(0 == $code) {
$status = $resp["header"]["status"];
if($status != 2) {
$content = $resp['payload']['choices']['text'][0]['content'];
$answer .= $content;
} else {
$content = $resp['payload']['choices']['text'][0]['content'];
$answer .= $content;
$total_tokens = $resp['payload']['usage']['text']['total_tokens'];
break;
}
} else {
return ['status'=>0,'msg'=>"服务返回报错".$response];
break;
}
}
return ['status'=>1,'msg'=>$answer];
} else {
return ['status'=>0,'msg'=>"无法连接到 WebSocket 服务器"];
}
}
/**
* @鉴定参数
* @author zhaosong
* @date 2023-11-03
*/
private function assembleAuthUrl($method, $addr, $apiKey, $apiSecret) {
if ($apiKey == "" && $apiSecret == "") {
// 不鉴权
return $addr;
}
$ul = parse_url($addr);
// 解析地址
if ($ul === false) {
// 地址不对,也不鉴权
return $addr;
}
// // $date = date(DATE_RFC1123); // 获取当前时间并格式化为RFC1123格式的字符串
$timestamp = time();
$rfc1123_format = gmdate("D, d M Y H:i:s \G\M\T", $timestamp);
// $rfc1123_format = "Mon, 31 Jul 2023 08:24:03 GMT";
// 参与签名的字段 host, date, request-line
$signString = array("host: " . $ul["host"], "date: " . $rfc1123_format, $method . " " . $ul["path"] . " HTTP/1.1");
// 对签名字符串进行排序,确保顺序一致
// ksort($signString);
// 将签名字符串拼接成一个字符串
$sgin = implode("\n", $signString);
// 对签名字符串进行HMAC-SHA256加密,得到签名结果
$sha = hash_hmac('sha256', $sgin, $apiSecret,true);
$signature_sha_base64 = base64_encode($sha);
// 将API密钥、算法、头部信息和签名结果拼接成一个授权URL
$authUrl = "api_key=\"$apiKey\", algorithm=\"hmac-sha256\", headers=\"host date request-line\", signature=\"$signature_sha_base64\"";
// 对授权URL进行Base64编码,并添加到原始地址后面作为查询参数
$authAddr = $addr . '?' . http_build_query(['host' => $ul['host'],'date' => $rfc1123_format,'authorization' => base64_encode($authUrl),]);
return $authAddr;
}
/**
* 发送post请求
* @param string $url 请求地址
* @param array $post_data post键值对数据
* @return string
*/
public function http_request($url, $post_data, $headers) {
$postdata = http_build_query($post_data);
$options = array(
'http' => array(
'method' => 'POST',
'header' => $headers,
'content' => $postdata,
'timeout' => 15 * 60 // 超时时间(单位:s)
));
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return $result;
return "success";
}
/**
* @构造参数体
* @author zhaosong
* @date 2023-11-03
*/
private function getBody($appid,$question) {
$header = array("app_id" => $appid,"uid" => "12345");
$parameter = array("chat" => array("domain" => "general","temperature" => 0.5,"max_tokens" => 1024));
$payload = array(
"message" => array(
"text" => array(
// 需要联系上下文时,要按照下面的方式上传历史对话
// array("role" => "user", "content" => "你是谁"),
// array("role" => "assistant", "content" => "....."),
// ...省略的历史对话
array("role" => "user", "content" => $question))));
$json_string = json_encode(array("header" => $header,"parameter" => $parameter,"payload" => $payload));
return $json_string;
}
}
然后在控制中使用这个类库 一键生成AI的文章
我采用循环的办法来批量生成文章
/**
* @生成AI
* @author zhaosong
* @date 2023-11-03
*/
private function ai_articles($data)
{
$iflytek = $this->is_data();
for ($i = 1; $i <= $data['num']; $i++) {
$res = new model_client($iflytek);
$content = $res->iflytek_cation($data['content']);
if(!empty($content['status']) == 0){
return_json(array('status'=>$content['status'], 'message'=>$content['msg']));
}
if(!empty($content['status']) == 1) {
$article = [];
$article['issystem'] = 1;
$article['title'] = $this->get_title($content['msg']);
$article['inputtime'] = $data['is_time'] ? $this->is_time() : SYS_TIME;
$article['description'] = str_cut(strip_tags($content['msg']),250);
$article['username'] = $_SESSION['adminname'];
$article['userid'] = $_SESSION['adminid'];
$article['catid'] = intval($data['catid']);
$article['status'] = 0;
$article['content'] = $content['msg'];
$article['click'] = $data['is_click'] ? rand(10,100) :0;
$article['updatetime'] = SYS_TIME;
$content_tabname = D(get_model($data['modelid']));
$id = $content_tabname->insert($article);
if(empty($article['url'])) {
$url = get_content_url($data['catid'], $id);
$content_tabname->update(array('url' => $url), array('id' => $id));
}
//写入全部模型表
$article['siteid'] = get_siteid();
$article['modelid'] = $data['modelid'];
$article['id'] = $id;
$article['url'] = $url;
D('all_content')->insert($article);
}
return_json(array('status'=>1, 'message'=>"文章生成成功!"));
}
}
如果有不懂的可以q我 我给你解答你的疑惑
分享结束 下次再见!!!