PHP CURL 图灵机器人
本次CURL的使用
是圍繞軟件工程8大步驟來的
1問題定義 2可行性研究 3需求分析 4總體設計 5詳細設計 6編碼和單元測試 7綜合測試?8軟件維護
一、問題定義
我們想獲取別人網頁上的東西,比如圖靈官網上的機器人,現在應該怎么弄呢?
二、可行性研究
因為都是網頁上的東西,服務器獲取數據的方式總是萬變不離其中,當你發送消息的時候,查看HTTP請求就知道其中發生了什么,然后你也就可以進行相應的爬取操作,然后這個小機器人你也自己也可以調用了。
三、需求分析
需要一個官網樣例上的機器人的調用接口。
四、總體設計。
通過觀察HTTP響應頭,了解表單與服務器數據交互的流程,然后仿照類似的方法,去調用服務器數據。
五、詳細設計
Step 1:進入http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp
進入與機器人對話的頁面
Step 2:開啟 開發者工具,觀察Network的變化
Step 3:提交表單后,會新出來了一個POST包,我們這時查看這個包的具體內容
Step 4:分析這個數據包的Header
Step 5:現在我們也模擬傳包到這個服務器響應地址。
很明顯,沒有按照它規定的user_id的值,多半會出問題,
比如這里的userid,經我分析,缺少它,機器人會不知道你上一句話說的是什么,就不能達到連續對話的效果了
所以我們主要差的是userid這個值,我們要怎么去獲取呢?當然是查看該頁面哪個地方存了這個值就好了
現在我們查看http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp的網頁源碼
通過瀏覽器輸入userid,嘗試是否能查找到類似這個表單的userid格式,如果有類似的存在,多半是找到了,如下面的圖
Step 6:現在我們要做的是,把這個userid獲取下來,并存入$_SESSION['chart_id']變量就可以了。
我們只用匹配到這句話,然后對這句話 用正則表達式取出來userid就好了
window.localStorage.setItem("_userid", '57a2413c-1f19-4e74-95a5-0b79d041e81d');
Step 7:接下來我們只需要獲取服務器返回的數據就好了
六、編碼和單元測試
<?php session_start(); /* * @Name 圖靈機器人 * @Function 圖靈機器人API * @Author 云天河Blog * @Link http://www.hlzblog.top/ * @date 2016-9-26 19:35:44 */ class TuLing_Robot{/*** @param String $get_unique_uid 通過此網址 可獲取與用戶 一對一的臨時對話 UID* @param String $to_api 圖靈機器人的實現接口,它會返回XML* @param String $form_data 格式化用戶消息后的 傳給圖靈服務器的信息*/private $get_unique_uid="http://www.tuling123.com/experience/exp_virtual_robot.jhtml?nav=exp";private $to_api="http://www.tuling123.com/api/product_exper/chat.jhtml";private $form_data;/***析構函數* @param String $say 用戶輸入數據* @return void*/public function __construct($say="云天河Blog,你知道嗎?"){$this->get_char_id();$this->post_data($say);}/**獲取機器人與用戶的對話的userid,通過正則表達式即可獲取* @param $_SESSION['chat_id'] 機器人與用戶對話所用的唯一的臨時ID* @return void*/public function get_char_id(){//如果用戶還沒有臨時對話變量,則注冊一個 $_SESSION['char_id']if( !isset($_SESSION['chat_id']) ){$ch = curl_init(); //開啟curl連接curl_setopt($ch, CURLOPT_URL, $this->get_unique_uid); //寫入urlcurl_setopt($ch, CURLOPT_HEADER, 0); //是否有寫入頭信息需要寫入=>falsecurl_setopt($ch, CURLOPT_RETURNTRANSFER,true);//返回字符串,而不直接輸出$content = curl_exec($ch); //執行curl,并把結果返回給一個字符串curl_close($ch); //關閉curl連接//通過正則表達式提取出與機器人對話的userid$reg="/setItem\(\"\_userid\", \'([^\']+)/i";preg_match($reg,$content,$match);$content=null;//用完了抓取頁面的臨時變量,就立馬釋放掉。$_SESSION['chat_id']=$match[1];$match=null;}}/***POST方式獲取數據過程,并將XML解析為對象后,獲取機器人發給用戶的消息* @param boolean $https https協議相關, 默認false* @param method $method curl鏈接方式,默認POST* @param String @data 格式化后的傳入服務器的數據;* @return String 機器人發給用戶的消息*/public function curl_request($https = false, $method = 'POST', $data = null){$data=$this->form_data;//請求 URL,返回該 URL 的內容 $ch = curl_init(); // 初始化curlcurl_setopt($ch, CURLOPT_URL, $this->to_api); //設置訪問的 URLcurl_setopt($ch, CURLOPT_HEADER, false); //放棄 URL 的頭信息curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //返回字符串,而不直接輸出if($https){ //判斷是否是使用 https 協議curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不做服務器的驗證curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); //做服務器的證書驗證}if($method == 'POST'){ //是否是 POST 請求curl_setopt($ch, CURLOPT_POST, true); //設置為 POST 請求curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //設置POST的請求數據}$content = curl_exec($ch); //開始訪問指定URLcurl_close($ch);//關閉 cURL 釋放資源$XML_Obj=simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);return $XML_Obj->Content;}/***格式化用戶輸入的數據參數* @param String $say 用戶輸入的聊天消息*/public function post_data($say){$say=urlencode($say);//因為要通過post傳值,所以轉碼中文內容為,url傳值格式$this->form_data="info=".$say."&userid=".$_SESSION['chat_id'];} }/** *對了,那個服務器返回數據的樣式,見下 <xml> <ToUserName><![CDATA[27d7f9f2-106c-47e0-be2d-be44abaf9118]]></ToUserName> <FromUserName><![CDATA[toUser]]></FromUserName> <CreateTime>1474882713061</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[賭大10]]></Content> <FuncFlag>0</FuncFlag> </xml> */@$info=$_GET['content'];//通過GET方式傳入聊天信息 $ac_info=new TuLing_Robot($info); echo $ac_info->curl_request();//輸出機器人的話七、綜合測試
經過測試代碼,沒有問題
八、軟件維護
待各位小伙伴來維護。。。總結
以上是生活随笔為你收集整理的PHP CURL 图灵机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 60分钟精通正则表达式
- 下一篇: PM Basic Skill---Com