微信公眾號在收到文本消息之後,即調用小i機器人自動回復,需要將用戶ID及用戶的內容都傳給小i機器人。其相關代碼如下。
1 private function receiveText($object) 2 { 3 $keyword = trim($object->Content); 4 include("xiaoi.php"); 5 $content = getXiaoiInfo($object->FromUserName, $keyword); 6 $result = $this->transmitText($object, $content); 7 return $result; 8 }
小i機器人的邏輯實現比較複雜,其智能問答的實現代碼如下。
1 function getXiaoiInfo($openid, $content) 2 { 3 // 定義APP 4 $app_key="************"; 5 $app_secret="********************"; 6 7 // 簽名算法 8 $realm = "xiaoi.com"; 9 $method = "POST"; 10 $uri = "/robot/ask.do"; 11 $nonce = ""; 12 $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 13 for ($i = 0; $i < 40; $i++) { 14 $nonce .= $chars[ mt_rand(0, strlen($chars) - 1) ]; 15 } 16 $HA1 = sha1($app_key.":".$realm.":".$app_secret); 17 $HA2 = sha1($method.":".$uri); 18 $sign = sha1($HA1.":".$nonce.":".$HA2); 19 20 // 接口調用 21 $url = "http:// nlp.xiaoi.com/robot/ask.do"; 22 $ch = curl_init; 23 curl_setopt($ch, CURLOPT_URL, $url); 24 curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Auth: app_key="'.$app_key.'", nonce="'.$nonce.'", signature="'.$sign.'"')); 25 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 26 curl_setopt($ch, CURLOPT_POST, 1); 27 curl_setopt($ch, CURLOPT_POSTFIELDS, "question=".urlencode($content)."&userId=". $openid."&platform=custom&type=0"); 28 $output = curl_exec($ch); 29 if ($output === FALSE){ 30 return "cURL Error: ". curl_error($ch); 31 } 32 return trim($output);
上述代碼解讀如下。
第3~5行:定義API接口,即申請到的接口。
第7~18行:這一段為簽名算法的實現。小i機器人API需要通過簽名來訪問,簽名的過程是將APP的Key和Secret以及隨機數等參數根據一定簽名算法生成的簽名值,作為新的請求頭中的一部分,以此提高訪問過程中的防篡改性。
簽名算法如下。
1)sha1加密(app_key:realm:app_secret),其中realm為"xiaoi.com"。
2)sha1加密(method:uri),其中method為請求方法,如"POST",uri為"/robot/ask.do"。
3)sha1加密(HA1:nonce:HA2),其中HA1為步驟1的值,HA2為步驟2的值,nonce為40位隨機數。
第20~31行:使用curl獲取調用智能問答的結果。
小i機器人API的有效訪問都必須包含簽名請求頭,在第24行中定義了一個簽名請求頭字符串。其中,app_key為API接口的key,nonce為上面過程中生成的40位隨機數,signature為簽名算法步驟3的值。最後為該字符串添加請求頭:"X-Auth"。
第27行中將請求參數連接成字符串,通過POST提交給接口。
第32行:返回接口的內容。
小i機器人的運行效果如圖24-2所示。
圖24-2 小i機器人智能聊天