組裝http報文調用小黃雞網頁端消息接口

之前看過一篇博文(http://www.cnblogs.com/txw1958/archive/2013/02/07/weixin-if8-simsimi.html)也是調用小黃雞網頁端的消息接口,但是他的做法是直接用GET請求調用,但這樣會被檢測出來,導致不會返回正確的數據,只會返回{"response":"SimSimi is tired, I only can speak 200 time a day. Please visit again tomorrow. See ya~ ","id":1,"result":100,"msg":"OK."},原因應該是調用這個接口有限制。雖然直接用GET請求不行,但可以組裝完整的http報文後在發送GET請求。

但在這之前需要做些準備工作——用wireshark這款軟件抓取在小黃雞網頁端發送消息時的數據包。抓包情況如下:

發送消息的包

主要是看cookie的內容,因爲太長了貼圖看不到,後來經過試驗得出cookie要包括這幾個變量:sagree、selected_nc、JSESSIONID、AWSELB

接收消息的包

可以看出返回的數據是一個json數據

做到這裏就可以組裝一個完整的http報文調用小黃雞的消息接口了,不過在這之前最好了解下http報文的格式。我是用php的curl功能進行調用,整個流程代碼如下:

<?php
function simsimiHttp($keyword)
{
    $JSESSIONID = 'JSESSIONID=B86064A18BB84AB21DF283963671E42C';
    $AWSELB = 'AWSELB=15E16D030EBAAAB8ACFf4BD9BB7E0CA8FB501388662941563CCCE3FBA00C1966E7EFC7E79C02
                      70B337A9EB2DC66B3E19A07708673470FDFA0B2C01AB735E6CC2ABE3DC5F3AF';
    //模擬http報文發送消息
    $ch = curl_init('http://www.simsimi.com/func/req?lc=ch&msg='.$keyword);
    $header = array("Accept: application/json, text/javascript, */*; q=0.01",
                        "X-Requested-With: XMLHttpRequest",
                        "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
                                     Chrome/27.0.1453.116 Safari/537.36",
                        "Content-Type: application/json; charset=utf-8",
                        "Referer: http://www.simsimi.com/talk.htm",
                        "Accept-Encoding: gzip,deflate,sdch",
                        "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
                        "Cookie: sagree=true; ".$AWSELB."; selected_nc=ch; ".$JSESSIONID,
                        "Connection: keep-alive"
                        );
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $data = curl_exec($ch);
    curl_close($ch);
    
    return $data;
}

//轉義特殊字符
function changeSpecialCharacter($str)
{                                          
    $str = str_replace(' ', '%20', $str);
    $str = str_replace('@', '%40', $str);
    $str = str_replace('#', '%23', $str);
    $str = str_replace('%', '%25', $str);
    $str = str_replace('&', '%26', $str);
    $str = str_replace('(', '%28', $str);
    $str = str_replace(')', '%29', $str);
    $str = str_replace('+', '%2B', $str);
    $str = str_replace('=', '%3D', $str);
    $str = str_replace('<', '%3C', $str);
    $str = str_replace('>', '%3E', $str);
    $str = str_replace('"', '%22', $str);
    $str = str_replace(',', '%2C', $str);
    $str = str_replace('/', '%2F', $str);
    $str = str_replace(':', '%3A', $str);
    $str = str_replace(';', '%3B', $str);
    $str = str_replace('?', '%3F', $str);
    $str = str_replace('\\', '%5C', $str);
    $str = str_replace('|', '%7C', $str);

    return $str;
}

$keyword = 'hello world';
echo simsimiHttp(changeSpecialCharacter($keyword));
?>

其中simsimiHttp是組裝報文調用小黃雞消息接口的函數,其中最主要的是仿造上面抓取的發送消息包的格式構造正確的http請求報文頭。值得注意的是因爲我們是用GET請求調用接口,需要把我們發送的消息添加到請求的url中,因此需要發送的消息中的特殊字符(例如空格,<,>這些字符)轉義成正確的形式,所以要有changeSpecialCharacter這個函數。以上代碼調用的結果爲{"response":"儂好","id":24444807,"result":100,"msg":"OK."}。一開始還擔心cookie的有效期的問題,但後來總結出不用擔心這個問題,甚至不用擔心cookie變量的值是否正確,只需要cookie包含那幾個變量。

不過這個做法的效率不是很高,可能是因爲小黃雞的服務器在國外的原因,平均一次調用需要1秒左右的時間(在新浪SAE估計更慢)。因此,如果將這個代碼部署到新浪的SAE上的話,會出現502錯誤,因爲SAE對curl的使用有連接時間上的限制。(PS:我心都碎了,之前是想把這個部署到SAE上做一個微信公衆平臺的,花了兩天時間缺得到這個結果...TAT~~)

效率測試——使用Apache的ab功能,用10個併發完成30請求, 命令行爲“ab -n 30 -c 10 http://localhost/test.php”,結果如下

因此,對響應速度要求比較高的應用不推薦使用這種做法。不過也可以嘗試使用國外的服務器,這樣的話響應速度應該會提高不少。

http://www.cnblogs.com/hdl1992/p/3264135.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章