小I机器人接口[PHP版本 08.12.7]

以前研究过小I的WebAPI,那个时候很简单,就是一个Http包完成说话、回答

但是现在的小I WebApi复杂了一些,网上也没有现成的资料,于是我着手自己开发。

通过抓包,发现小I WebApi通信原理如下:

以服务器202.109.73.87上机器人/engine/flashrobot2/为例:

1、首先调用/engine/flashrobot2/webbot.js,获得SID,下方以{{SID}}代替

2、调用/engine/flashrobot2/send.js?SID={{SID}}&USR={{SID}}&CMD=JOIN&r=

3、调用/engine/flashrobot2/recv.js?SID={{SID}}&USR={{SID}}&r=

以上完成登录,并且把广告也清除了,然后开始聊天:

4、第一步先调用/engine/flashrobot2/recv.js?SID={{SID}}&USR={{SID}}&r=,不要recv,也不要关闭此连接

5、调用/engine/flashrobot2/send.js?SID={{SID}}&USR={{SID}}&CMD=CHAT&SIG=You&MSG={{MESSAGE}}

其中{{MESSAGE}}为要发的内容,编码为utf-8

6、从刚才调用的recv.js的连接中,recv出内容,用正则表达式提取就OK。

 

PHP类如下:

PHP代码
  1. date_default_timezone_set("Asia/Shanghai");   
  2.   
  3. class XiaoI   
  4. {   
  5.     //by Hackfan   
  6.     public $sid = '';   
  7.   
  8.     public function __construct($sid = false)   
  9.     {   
  10.         if(!$sid)   
  11.         {   
  12.             $this->join();   
  13.         }   
  14.         else  
  15.         {   
  16.             $this->sid = $sid;   
  17.         }   
  18.     }   
  19.     public function join()   
  20.     {   
  21.         $fp = fsockopen('202.109.73.87', 80);   
  22.         fwrite($fp'GET /engine/flashrobot2/webbot.js HTTP/1.1  
  23. Connection: Close  
  24. Host: 202.109.73.87  
  25.  
  26. ');   
  27.         $r = '';   
  28.         while(!feof($fp))   
  29.         {   
  30.             $r .= fgets($fp, 512);   
  31.         }   
  32.         fclose($fp);   
  33.         preg_match('!var __sessionId = "(/d+)";!',$r$match);   
  34.         $this->sid = $match[1];   
  35.   
  36.         $fp = fsockopen('202.109.73.87', 80);   
  37.         fwrite($fp'GET /engine/flashrobot2/send.js?SID='.$this->sid.'&USR='.$this->sid.'&CMD=JOIN&r= HTTP/1.1  
  38. Connection: Close  
  39. Host: 202.109.73.87  
  40.  
  41. ');   
  42.         fclose($fp);   
  43.   
  44.         $fpr = fsockopen('202.109.73.87', 80);   
  45.         fwrite($fpr'GET /engine/flashrobot2/recv.js?SID='.$this->sid.'&USR='.$this->sid.'&r= HTTP/1.1  
  46. Connection: Close  
  47. Host: 202.109.73.87  
  48.  
  49. ');   
  50.         fclose($fpr);   
  51.   
  52.     }   
  53.     public function chat($msg)   
  54.     {   
  55.         $fpr = fsockopen('202.109.73.87', 80);   
  56.         fwrite($fpr'GET /engine/flashrobot2/recv.js?SID='.$this->sid.'&USR='.$this->sid.'&r= HTTP/1.1  
  57. Connection: Close  
  58. Host: 202.109.73.87  
  59.  
  60. ');   
  61.         $fps = fsockopen('202.109.73.87', 80);   
  62.         fwrite($fps'GET /engine/flashrobot2/send.js?SID='.$this->sid.'&USR='.$this->sid.'&CMD=CHAT&SIG=You&MSG='.urlencode($msg).'&FTN=&FTS=&FTC=&r= HTTP/1.1  
  63. Connection: Close  
  64. Host: 202.109.73.87  
  65.  
  66. ');   
  67.         fclose($fps);   
  68.   
  69.         $r = '';   
  70.         while(!feof($fpr))   
  71.         {   
  72.             $r .= fgets($fpr, 512);   
  73.         }   
  74.         fclose($fpr);   
  75.   
  76.         if(preg_match('!"MSG":"(.*?)"!'str_replace(array("/r""/n"), array(''), $r), $match))   
  77.         {   
  78.             return $match[1];   
  79.         }   
  80.         else  
  81.         {   
  82.             return false;   
  83.         }   
  84.     }   
  85. }   
  86. ?>  

具体运行代码如下:

PHP代码
  1. require('xiaoi.php');   
  2. $i = new XiaoI();   
  3. while(1)   
  4. {   
  5.     echo 'me: ';   
  6.     $s = trim(fgets(STDIN));   
  7.     $s = iconv('gb2312''utf-8'$s);   
  8.     echo 'xiaoi: '.$i->chat($s)."/n";   
  9. }  

运行效果如下:

作者:Hackfan,转载请保留,谢谢。

你可能感兴趣的:(PHP,php,fp,timezone,正则表达式,cmd,服务器)