// +---------------------------------------------------------------------- class Alichat { private $method = 'GET'; private $api = 'http://chatbot.cn-shanghai.aliyuncs.com';//接口 private $dateTimeFormat = 'Y-m-d\TH:i:s\Z'; private $config = [ 'Format' => 'json', 'ServiceCode' => "beeboot", 'RegionId' => "cn-shanghai", 'Version' => '2017-10-11', 'SignatureMethod' => 'HMAC-SHA1', 'SignatureVersion' => "1.0", 'AccessKeyId' => 'LTAI5tS2cBUXxUG591esJqBq', 'accessKeySecret' => 'LeXSrnBR1GRfbXEyTyX9sai28pb0EF', ]; protected function createdata(){ date_default_timezone_set("GMT"); $dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601规范 return array( 'Version' => $this->config['Version'], 'ServiceCode' =>$this->config['ServiceCode'], 'RegionId' =>$this->config['RegionId'], 'Format' => $this->config['Format'], 'AccessKeyId' => $this->config['AccessKeyId'], 'SignatureVersion' => $this->config['SignatureVersion'], 'SignatureMethod' => $this->config['SignatureMethod'], 'Timestamp' => date($dateTimeFormat), 'SignatureNonce' => md5('estxiu.com').rand(100000,999999).uniqid(), //唯一随机数 ); } public function __construct($config = []){ $this->config($config); } /*读取配置*/ public function config($config = []){ /** *@AccessKeyId 阿里云申请的 Access Key ID *@AccessKeySecret 阿里云申请的 Access Key Secret */ $this->config = array_merge($this->config, $config); return $this; } /** *发送视⻆ - 列表 *PerspectiveId String 视⻆主键(code_id) *PerspectiveCode String 视⻆编码(⽤于问答api) *ModifyTime String 修改时间 UTC时间 *CreateTime String 创建时间 UTC时间 *SelfDefine Boolean 是否⾃定义 * Status Integer 数据状态:3:选中;1:未选中 * Name String 视⻆名称 */ public function perspect() { $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryPerspectives' ); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); //var_dump($data);exit; $data = $this->http($this->api, $data, $this->method); return $data; } public function perspectDetail($PerspectiveId='') { $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribePerspective', 'PerspectiveId'=>$PerspectiveId ); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 视⻆ - 创建 */ public function createPerspect($name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreatePerspective', 'Name'=>$name ); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 视⻆ - 修改 */ public function editPerspect($name='',$perid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdatePerspective', 'Name'=>$name, 'PerspectiveId'=>$perid ); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 视⻆ - 启⽤ */ public function activePerspect($perid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ActivatePerspective', 'PerspectiveId'=>$perid ); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 知识库 - 类⽬ - 列表 */ public function categories($pid=-1,$show=false){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryCategories' ); if($pid)$data['ParentCategoryId']=$pid; if($show)$data['ShowChildrens']=$show; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 类⽬ - 详情 */ public function categoryDetail($cid=-1){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeCategory' ); if($cid)$data['CategoryId']=$cid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 类⽬ - 新增 */ public function createCategory($pid=-1,$name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateCategory' ); if($pid)$data['ParentCategoryId']=$pid; $data['Name']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 类⽬ - 修改 */ public function editCategory($cid=-1,$name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateCategory' ); if($cid)$data['CategoryId']=$cid; $data['Name']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 类⽬ - 删除 *CategoryId Long 是 类⽬Id,唯⼀标志 */ public function delCategory($cid=-1){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteCategory' ); if($cid)$data['CategoryId']=$cid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 列表 *CoreWordName String 是 核⼼词名称 *PageNumber Integer 否 分⻚-第⼏⻚,默认1 *PageSize Integer 否 分⻚-⻚⾯⼤⼩,默认 10 *Synonym String 否 核⼼词的同义词 */ public function coreWords($name='',$page=1,$size=10,$synon=false){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryCoreWords' ); if($name)$data['CoreWordName']=$name; $data['PageNumber']=$page; $data['PageSize']=$size; $data['Synonym']=$synon; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 详情 *CoreWordName String 是 名称 */ public function describeWord($name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeCoreWord' ); if($name)$data['CoreWordName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 创建 *CoreWordName String 是 核⼼词名称 */ public function createWord($name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateCoreWord' ); if($name)$data['CoreWordName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 修改 *CoreWordCode String 是 唯⼀编码 * CoreWordName String 是 核⼼词 */ public function editWord($code='',$name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateCoreWord' ); if($code)$data['CoreWordCode']=$code; if($name)$data['CoreWordName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 删除 *CoreWordName String 是 唯⼀标识 */ public function delWord($name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteCoreWord' ); if($name)$data['CoreWordName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 同义词添加 *CoreWordName String 是 核⼼词名称 *Synonym String 是 同义词 */ public function addSynon($name='',$synon=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'AddSynonym' ); $data['CoreWordName']=$name; $data['Synonym']=$synon; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 核⼼词 - 同义词删除 *CoreWordName String 是 核⼼词名称 * Synonym String 是 同义词 */ public function delSynon($name='',$synon=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'RemoveSynonym' ); $data['CoreWordName']=$name; $data['Synonym']=$synon; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 列表 *KnowledgeTitle String 否 知识标题 *CoreWordName String 否 核⼼词 *PageNumber Integer 否 分⻚-第⼏⻚,默认1 *PageSize Integer 否 分⻚-⻚⾯⼤⼩,默认 10 *CategoryId Long 否 知识类⽬ID */ public function knowledges($cid='',$title='',$name='',$page=1,$size=10){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryKnowledges' ); if($title)$data['KnowledgeTitle']=$title; if($name)$data['CoreWordName']=$name; $data['PageNumber']=$page; $data['PageSize']=$size; if($cid)$data['CategoryId']=$cid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 详情 *KnowledgeId Long 是 知识唯⼀标识 */ public function describeknow($kid){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeKnowledge' ); $data['KnowledgeId']=$kid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 创建并发布 *Knowledge String 是 知识数据,⻅ * *Knowledge *CategoryId Long 是 类⽬ID *KnowledgeTitle String 是 标题 * KnowledgeType Integer 否 知识类型:1:普通知识 5:⽂档知识(私有 云) * StartDate String 否 ⽣效时间(UTC时间) * EndDate String 否 失效时间(UTC时间) * Solutions Array of Solution 是 ⽂本型知识答案 * Outlines Array of Outline 否 关联知识(私有云) * SimQuestions Array of SimQuestion 否 相似问题 *KeyWords Array of String 否 关键词(划词)(私有 云) *CoreWords Array of String 否 核⼼词 * *SimQuestion * Title String 是 相似问法标题 * * Solution * Content String 是 富⽂本内容 * PlainText String 是 纯⽂本内容 * PerspectiveIds Array of String 是 视⻆id列表 * * Outline * KnowledgeId Long 是 知识id * Title String 是 知识题⽬ */ public function createknow($know=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateKnowledge' ); $know=json_encode($know); $data['Knowledge']=$know; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 修改并发布 *Knowledge String 是 知识数据,⻅ * *Knowledge *KnowledgeId Long 是 知识ID *CategoryId Long 是 类⽬ID *KnowledgeTitle String 是 标题 * KnowledgeType Integer 否 知识类型:1:普通知识 5:⽂档知识(私有 云) * StartDate String 否 ⽣效时间(UTC时间) * EndDate String 否 失效时间(UTC时间) * Solutions Array of Solution 是 ⽂本型知识答案 * Outlines Array of Outline 否 关联知识(私有云) * SimQuestions Array of SimQuestion 否 相似问题 *KeyWords Array of String 否 关键词(划词)(私有 云) *CoreWords Array of String 否 核⼼词 * *SimQuestion *SimQuestionId Long 否 相似问法Id,当Action 为ADD时可空 * Title String 是 相似问法标题 * Action String 是 操作类型:追加: ADD,修改:UPD,移 除:DEL * * Solution * SolutionId Long 否 Solution Id主键, 新增 时可空 * Content String 是 富⽂本内容 * PlainText String 是 纯⽂本内容 * PerspectiveIds Array of String 是 视⻆id列表 * * Outline * OutlineId Long 否 关联关系Id,当Action为 ADD时可空 * KnowledgeId Long 是 知识id * Title String 是 知识题⽬ */ public function editknow($know=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateKnowledge' ); $know=json_encode($know); $data['Knowledge']=$know; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 删除 KnowledgeId Long 是 待删除知识id */ public function delknow($kid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteKnowledge' ); $data['KnowledgeId']=$kid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 - 发布 KnowledgeId Long 是 待删除知识id */ public function pushknow($kid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'PublishKnowledge' ); $data['KnowledgeId']=$kid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 -失效 KnowledgeId Long 是 待删除知识id */ public function disableknow($kid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DisableKnowledge' ); $data['KnowledgeId']=$kid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *知识库 - 知识 -转移类⽬ KnowledgeId Long 是 知识id CategoryId Long 是 类⽬id */ public function moveknow($kid='',$cid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'MoveKnowledgeCategory' ); $data['KnowledgeId']=$kid; $data['CategoryId']=$cid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *机器⼈-创建 *Name String 是 机器⼈名称,不超过7 字 *Introduction String 否 机器⼈备注,不超过50 字 *LanguageCode String 是 机器⼈服务的语⾔,如 zh-cn、en-us77 TimeZone String 是 机器⼈的时区,参考 《公共-时区码》 RobotType String 否 机器⼈类型: scenario_im、 scenario_ivr、 scenario_callout */ public function createBot($name='',$intro='',$lang='zh-cn',$zone='',$type=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateBot' ); $data['Name']=$name; if($intro)$data['Introduction']=$intro; $data['LanguageCode']=$lang; $data['TimeZone']=$zone; if($type)$data['RobotType']=$type; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *机器⼈-详情 InstanceId String 是 机器⼈ID */ public function botDetail($iid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeBot' ); $data['InstanceId']=$iid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *机器⼈-列表 PageNumber Integer 否 分⻚-第⼏⻚,默认1 PageSize Integer 否 分⻚-⻚⾯⼤⼩,默认 10 */ public function bots($page=1,$size=10){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryBots' ); $data['PageNumber']=$page; $data['PageSize']=$size; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话单元 - 列表 InstanceId String 是 机器⼈ ID DialogName String 否 对话单元名称 */ public function dialogs($iid='',$name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryDialogs' ); $data['InstanceId']=$iid; if($name)$data['DialogName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话单元 - 详情 DialogId Long 是 对话 ID */ public function describedialog($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeDialog' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话单元 - 创建 InstanceId String 是 应⽤ ID DialogName String 否 对话单元名称 Description String 否 对话单元描述 */ public function createDialog($iid='',$name='',$des=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateDialog' ); $data['InstanceId']=$iid; if($name)$data['DialogName']=$name; if($des)$data['Description']=$des; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话单元 - 修改 DialogId Long 是 对话 ID DialogName String 是 对话名称 Description String 否 对话描述 */ public function updateDialog($did='',$name='',$des=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateDialog' ); $data['DialogId']=$did; $data['DialogName']=$name; if($des)$data['Description']=$des; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话单元 - 删除 DialogId Long 是 对话 ID */ public function delDialog($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteDialog' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话流 - 保存草稿 DialogId Long 是 对话 ID DialogFlowDefinition String 是 对话流描述信息(Json 字符串) */ public function updateFlow($did='',$flow=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateDialogFlow' ); $data['DialogId']=$did; $flow=json_encode($flow); $data['DialogFlowDefinition']=$flow; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话流 - 测试 DialogId Long 是 对话 ID */ public function testFlow($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'TestDialogFlow' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话流 - 发布 DialogId Long 是 对话 ID */ public function pushFlow($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'PublishDialogFlow' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话流 - 下线 DialogId Long 是 对话 ID */ public function disableFlow($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DisableDialogFlow' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 对话流 - 详情 DialogId Long 是 对话 ID */ public function describeFlow($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeDialogFlow' ); $data['DialogId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 意图 - 列表 DialogId Long 是 对话流Id IntentName String 否 意图名称 PageNumber Integer 否 分⻚-第⼏⻚,默认1 PageSize Integer 否 分⻚-⻚⾯⼤⼩,默认 10 */ public function intents($did='',$name='',$page=1,$size=10){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryIntents' ); $data['DialogId']=$did; if($name)$data['IntentName']=$name; if($page)$data['PageNumber']=$page; if($size)$data['PageSize']=$size; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 意图 - 详情 IntentId Long 是 意图 ID */ public function describeIntent($iid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeIntent' ); $data['IntentId']=$iid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 意图 - 创建 DialogId Long 是 对话 ID IntentDefinition JSON 是 意图描述信息-JSON字 符串, IntentDefinition IntentId Long 意图Id Name String 意图名称 UserSay Array of UserSay 意图表述 RuleCheck Array of RuleCheck LGF意图表述表达式//TODO校 验 Slot Array of Slot 意图槽位信息 UserSay 字段名 类型 描述 Id String 表述唯⼀标识 UUID Data Array of SayText 意图表述(被划词切分后结果) Strict Boolean 是否严格匹配 SayText 字段名 类型 描述 SlotId String 槽位唯⼀标识 Text String 表述 RuleCheck 字段名 类型 描述 Warning Array of String 异常提示//TODO,可为空数组 Text String 表达式值 Strict Boolean 是否严格匹配 Error Array of String 错误提示//TODO,可为空数组 Slot Id String 槽位唯⼀标识 UUID Question Array of String 槽位反问话术,默认范⽂ LifeSpan Integer 槽位⽣命周期:默认0,可⾃定 义,建议5 //TODO,后台默认 0 Name String 槽位名称 IsArray Boolean 是否数组 Value String 槽位划词结果,对应“@${专有名 词名称}”,@是必须的 IsNecessary Boolean 是否必填槽 Tags Array of Tag 槽位划词标签 IntentDefinition(JSON):如下【注意:意图中 UseSay 需要带上 Id 字段,请⾃⾏⽣成 UUID】 TagUserSayId String 标签对应意图表述唯⼀标识 Value String 标签对应意图表述划词结果 */ public function createIntent($did='',$intent=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateIntent' ); $data['DialogId']=$did; $intent=json_encode($intent); $data['IntentDefinition']=$intent; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 意图 - 修改 IntentId Long 是 意图 ID IntentDefinition JSON 是 ⻅意图描述信息 */ public function editIntent($did='',$intent=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateIntent' ); $data['IntentId']=$did; $intent=json_encode($intent); $data['IntentDefinition']=$intent; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 意图 - 删除 IntentId Long 是 意图 ID IntentDefinition JSON 是 ⻅意图描述信息 */ public function delIntent($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteIntent' ); $data['IntentId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 专有名词 - 列表 DialogId Long 是 对话单元Id EntityName String 否 专有名词名称 PageNumber Integer 否 当前⻚,默认1 ageSize Integer 否 ⻚⾯⼤⼩,默认10 */ public function entities($did='',$name='',$page=1,$size=10){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QueryEntities' ); $data['DialogId']=$did; $data['EntityName']=$name; $data['PageNumber']=$page; $data['ageSize']=$size; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 专有名词 - 详情 EntityId Long 是 专有名词id */ public function describeEntities($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DescribeEntities' ); $data['EntityId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 专有名词 - 创建 DialogId Long 是 对话 ID EntityName String 是 专有名词名称 EntityType String 是 类型:regex:正则名 词; synonyms:标准 名词 Regex String 否 正则表达式,与 Regex String 否 正则表达式,与 Members⼆选⼀必填 Members Array of Member 否 专有名词成员(json字符 串),与Regex⼆选⼀必 填 Members⼆选⼀必填 Members Array of Member 否 专有名词成员(json字符 串) Synonyms Array Of String 否 成员同义词列表 MemberName String 是 成员名称 */ public function createEntities($did='',$name='',$type='',$synon='',$regex='',$members=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'CreateEntity' ); $data['DialogId']=$did; $data['EntityName']=$name; $data['EntityType']=$type; $data['synonyms']=$synon; $data['Regex']=$regex; $data['Members']=json_encode($members); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** *对话⼯⼚ - 专有名词 - 修改 EntityId Long 是 对话 ID EntityName String 是 专有名词名称 EntityType String 是 类型:regex:正则名 词; synonyms:标准 名词 Regex String 否 正则表达式,与 Regex String 否 正则表达式,与 Members⼆选⼀必填 Members Array of Member 否 专有名词成员(json字符 串),与Regex⼆选⼀必 填 Members⼆选⼀必填 Members Array of Member 否 专有名词成员(json字符 串) Synonyms Array Of String 否 成员同义词列表 MemberName String 是 成员名称 */ public function editEntities($did='',$name='',$type='',$synon='',$regex='',$members=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'UpdateEntity' ); $data['EntityId']=$did; $data['EntityName']=$name; $data['EntityType']=$type; $data['Regex']=$regex; $data['Members']=json_encode($members); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 对话⼯⼚ - 专有名词 - 删除 * @param string $did * @return array */ public function delEntities($did=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'DeleteEntity' ); $data['EntityId']=$did; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 对话⼯⼚ - 专有名词 - 追加 * EntityId Long 是 实体 ID * ApplyType String 是 追加内容: memberName-专有名 词成员、synonyms-专 有名词相似问 * Member JSON 是 专有名词成员(json字符 串) */ public function appendMember($eid='',$type='',$member=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'AppendEntityMember' ); $data['EntityId']=$eid; $data['ApplyType']=$type; $data['Member']=json_encode($member); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 对话⼯⼚ - 专有名词 - 移除 * EntityId Long 是 实体 ID * RemoveType String 是 追加内容: memberName-专有名 词成员、synonyms-专 有名词相似问 * Member JSON 是 专有名词成员(json字符 串) */ public function delMember($eid='',$type='',$member=[]){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'RemoveEntityMember' ); $data['EntityId']=$eid; $data['RemoveType']=$type; $data['Member']=json_encode($member); $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 对话⼯⼚ - 专有名词 - 系统专有名词列表 * EntityName String 是 搜索系统专有名词关键 字 */ public function sysEntities($name=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'QuerySystemEntities' ); $data['EntityName']=$name; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 会话API * InstanceId String 是 机器⼈实例ID。登录云 ⼩蜜控制台,左侧⾯板 选择开发者->基本配 置,查看机器⼈示例信 息,可获得该实例ID。 * Utterance String 是 机器⼈访问者的输⼊ * SessionId String 否 会话ID,⽤于标识⼀个 访问者的会话和保持上 下⽂信息。对于⼀个新 的访问者,⾸次调⽤ Chat接⼝时⽆需传递此 字段,机器⼈会开启⼀ 个会话,并在Chat接⼝ 的响应中返回该会话的 SessionId。对于该访 问者的后续轮次的会 话,调⽤Chat接⼝时传 递当前会话的 SessionId,机器⼈即 可基于SessionId继续 该轮次会话。 * KnowledgeId String 否 知识库词条的关联问题 的ID。若指定此ID,那 么机器⼈会直接返回指 定的关联问题指定视⻆ 的答案 * SenderId String 否 访问者ID。⽤于识别当 前会话中的⽤户 * SenderNick String 否 当前会话中访问的昵称 * Tag String 否 可以传递任何内容参 数,该参数将会直接在 返回结果中透传回来 (公有云)。 * PerspectivesList String 否 视⻆编码,⽤于调⽤同 ⼀知识标题下不同视⻆ 的答案。⽬前仅⽀持⼀ 个视⻆答案的调⽤,视 ⻆的请求格式是数组, ⽐如["default"] (URL 请求,请注意括号的转 义(Perspective=%5B"d efault"%5D))(私有云) * Perspective.1 String 否 视⻆编码,⽤于调⽤同 ⼀知识标题下不同视⻆ 的答案。在拼装请求参 数时,需要以 Perspective.1={视⻆编 码}的格式传递参数。 如:&Perspective.1=FZJB Y3raWr。使⽤SDK时 以SDK中定义的参数为 准。⽬前仅⽀持⼀个视 ⻆答案的调⽤。 (公有云) Recommend Boolean 否 默认true,会话API保 持出推荐逻辑;如果 * recommend = false则 不出推荐 * RecommendNum Integer 否 推荐问题数量,1-10, 当出推荐的时候才⽣ 效,返回不⼤于 * RecommendNum的推 荐问题数量 */ public function chat($iid='',$utter='',$sid='',$kid='',$sendid='',$snick='',$tag='',$plist='',$per='',$recom='',$rnum=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'Chat' ); $data['InstanceId']=$iid; $data['Utterance']=$utter; if($sid)$data['SessionId']=$sid; if($kid)$data['KnowledgeId']=$kid; if($sendid)$data['SenderId']=$sendid; if($snick)$data['SenderNick']=$snick; if($tag)$data['Tag']=$tag; if($plist)$data['PerspectivesList']=$plist; if($per)$data['Perspective.1']=$per; if($recom)$data['Recommend']=$recom; if($rnum)$data['RecommendNum']=$rnum; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-指标数据 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function sessionData($stime='',$etime='',$rebotid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'GetBotSessionData' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-机器⼈对话轮次详情 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function chatData($stime='',$etime='',$rebotid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'GetBotChatData' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-机器⼈对话轮次详情 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function chatDetailData($stime='',$etime='',$rebotid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotReceptionDetailDatas' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-知识概览API * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botKnowledgeData($stime='',$etime='',$rebotid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'GetBotKnowledgeStatData' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-机器⼈热⻔知识 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botHotKnowledges($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotHotKnowledges' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-机器⼈冷⻔知识 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botColdKnowledges($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotColdKnowledges' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-机器⼈知识明细API * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botKnowledgeDetail($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotKnowledgeDetails' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-对话⼯⼚概览API * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botDsStat($stime='',$etime='',$rebotid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'GetBotDsStatData' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-对话流热⻔榜 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botHotDsDatas($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotHotDsDatas' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-对话流冷⻔榜 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botColdDsDatas($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotColdDsDatas' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-对话流明细 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botDsDetail($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotDsDetails' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**数据api-会话历史明细 * StartTime String 是 查询开始时间,时间格式 为yyyyMMdd,⽐如 20190401 * EndTime String 是 查询结束时间,时间格式 为yyyyMMdd,⽐如 20190401 * RobotInstanceId String 是 机器⼈实例id * @return array */ public function botChatHistorys($stime='',$etime='',$rebotid='',$limit=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListBotChatHistorys' ); $data['StartTime']=$stime; $data['EndTime']=$etime; $data['RobotInstanceId']=$rebotid; $data['Limit']=$limit; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**获取会话列表 * InstanceId String 是 机器⼈实例ID。登录云⼩蜜控 制台,左侧⾯板选择开发者-> 基本配置,查看机器⼈示例信 息,可获得该实例ID。 * SessionId String 否 会话ID,⽤于标识⼀个访问者 的会话和保持上下⽂信息。对 于⼀个新的访问者,⾸次调⽤ Chat接⼝时⽆需传递此字段, 机器⼈会开启⼀个会话,并在 Chat接⼝的响应中返回该会话 的SessionId。对于该访问者的 后续轮次的会话,调⽤Chat接 ⼝时传递当前会话的 SessionId,机器⼈即可基于 SessionId继续该轮次会话。 SenderId String 否 访问者ID。⽤于识别当前会话 中的⽤户。 StartDate String 否 开始时间。 EndDate String 否 结束时间。 PageNumber Integer 否 当前⻚码(默认1)。 PageSize Integer 否 每⻚条数(默认10),最⼤50。 * @return array */ public function conversationList($iid='',$sid='',$senderid='',$sdate='',$edate='',$page=1,$size=10){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'GetConversationList' ); $data['InstanceId']=$iid; if($sid)$data['SessionId']=$sid; if($senderid)$data['SenderId']=$senderid; if($sdate)$data['StartDate']=$sdate; if($edate)$data['EndDate']=$edate; if($page)$data['PageNumber']=$page; if($size)$data['PageSize']=$size; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /**获取会话详情 * InstanceId String 是 机器⼈实例ID。登录云⼩蜜控 制台,左侧⾯板选择开发者-> 基本配置,查看机器⼈示例信 息,可获得该实例ID。 * SessionId String 否 会话ID,⽤于标识⼀个访问者 的会话和保持上下⽂信息。对 于⼀个新的访问者,⾸次调⽤ Chat接⼝时⽆需传递此字段, 机器⼈会开启⼀个会话,并在 Chat接⼝的响应中返回该会话 的SessionId。对于该访问者的 后续轮次的会话,调⽤Chat接 ⼝时传递当前会话的 SessionId,机器⼈即可基于 SessionId继续该轮次会话。 SenderId String 否 访问者ID。⽤于识别当前会话 中的⽤户。 StartDate String 否 开始时间。 EndDate String 否 结束时间。 PageNumber Integer 否 当前⻚码(默认1)。 PageSize Integer 否 每⻚条数(默认10),最⼤50。 */ public function listConverLogs($sid=''){ $params=$this->createdata(); $data = array( // 接口参数 'Action' => 'ListConversationLogs' ); $data['SessionId']=$sid; $data= array_merge($params,$data); $data['Signature'] = $this->computeSignature($data,$this->config['accessKeySecret']); $data = $this->http($this->api, $data, $this->method); return $data; } /** * 发送HTTP请求方法,目前只支持CURL发送请求 * @param string $url 请求URL * @param array $params 请求参数 * @param string $method 请求方法GET/POST * @return array $data 响应数据 */ protected function http($url, $params, $method = 'GET', $header = array(), $multi = false) { $opts = array( CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => $header ); /* 根据请求类型设置特定参数 */ switch (strtoupper($method)) { case 'GET': $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); break; case 'POST': //判断是否传输文件 $params = $multi ? $params : http_build_query($params); $opts[CURLOPT_URL] = $url; $opts[CURLOPT_POST] = 1; $opts[CURLOPT_POSTFIELDS] = $params; break; default: exception('不支持的请求方式!'); } /* 初始化并执行curl请求 */ $ch = curl_init(); curl_setopt_array($ch, $opts); $data = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if ($error) exception('请求发生错误:' . $error); return $data; } //生成取短信签名 private function computeSignature($parameters, $accessKeySecret) { ksort($parameters); $canonicalizedQueryString = ''; foreach($parameters as $key => $value){ $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value); } $stringToSign = $this->method.'&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1)); $signature = $this->signString($stringToSign, $accessKeySecret."&"); return $signature; } private function percentEncode($str) { $res = urlencode($str); $res = preg_replace('/\+/', '%20', $res); $res = preg_replace('/\*/', '%2A', $res); $res = preg_replace('/%7E/', '~', $res); return $res; } private function signString($source, $accessSecret) { return base64_encode(hash_hmac('sha1', $source, $accessSecret, true)); } }