第一部分 基於模擬請求的方式
一、模擬請求數據
先看一下小黃雞的網頁版界面

我們通過模擬http請求來實現,上面對話抓包如下:
發送消息的包

接收消息的包:

根據上面的包,模擬發起請求如下:

二、與微信對接

小黃雞還可以使用API方式調用,但免費時間有限,代碼和上面基本一樣,就不多寫了。
三、演示效果

第二部分 基於接口的方式
一、申請小黃雞接口
SimSimi,發音為〝shim-shimee〞,中文翻譯:小黃雞,由韓文simsim(심심)演變而成。 “심심”原意為“無聊”。SimSimi 由ISMaker於2002年建立流行的人工智能對話系統。
官方網站 http://www.simsimi.com/
接口申請地址: http://developer.simsimi.com/pricing
接口申請流程:
1. 注冊賬號
2. 激活賬號
3. 申請7天試用接口(或者付費購買接口,價格30美元10 萬次)
4. 獲得Key:d4899e2a-7ea8-40ab-a0d2-f258ddd7de15
二、接口分析
請求 URL
http://sandbox.api.simsimi.com/request.p?key=your_trial_key&lc=en&ft=1.0&text=hi
請求參數說明
key:授權key
text:查詢消息
lc: 語言代碼
ft: 過濾器參數
響應示例
{ “result”: 100, “response”: “Who are you?!”, “id”: 13185569, “msg”: “OK.” }
響應參數說明
result: 調用結果,成功時為100
id: 響應id
response: 響應消息內容
msg: 調用結果對應的內容
三、程序實現
構造Url參數
$params['key'] = "d4899e2a-7ea8-40ab-a0d2-f258ddd7de15";
$params['lc'] = "ch";
$params['ft'] = "1.0";
$params['text'] = $keyword;
$url = "http://sandbox.api.simsimi.com/request.p?".http_build_query($params);
CURL獲取內容
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
獲取回復內容
$message = json_decode($output,true);
$result = "";
if ($message['result'] == 100){
$result = $message['response'];
}else{
$result = $message['result'].$message['msg'];
}
小黃雞完整代碼simsimi.php
function callSimsimi($keyword)
{
$params['key'] = "d4899e2a-7ea8-40ab-a0d2-f258ddd7de15";
$params['lc'] = "ch";
$params['ft'] = "1.0";
$params['text'] = $keyword;
$url = "http://sandbox.api.simsimi.com/request.p?".http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$message = json_decode($output,true);
$result = "";
if ($message['result'] == 100){
$result = $message['response'];
}else{
$result = $message['result']."-".$message['msg'];
}
return $result;
}
接入微信公眾平台
將官方文件的$contentStr = “Welcome to wechat world!”; 修改為接口調用$contentStr = callSimsimi($keyword);
define("TOKEN", "pondbay");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE)
{
case "text":
$resultStr = $this->receiveText($postObj);
break;
case "event":
$resultStr = $this->receiveEvent($postObj);
break;
}
echo $resultStr;
}else {
echo "";
exit;
}
}
private function receiveText($object)
{
$funcFlag = 0;
$keyword = trim($object->Content);
include('simsimi.php');
$contentStr = callSimsimi($keyword);
$resultStr = $this->transmitText($object, $contentStr, $funcFlag);
return $resultStr;
}
private function receiveEvent($object)
{
$contentStr = "";
switch ($object->Event)
{
case "subscribe":
$contentStr = "歡迎關注方倍工作室\n小黃雞為您服務!";
}
$resultStr = $this->transmitText($object, $contentStr);
return $resultStr;
}
private function transmitText($object, $content, $flag = 0)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
return $resultStr;
}
}
更多內容,請關注方倍工作室微信,然后回復 “教程”,



