以前研究过小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代码
date_default_timezone_set("Asia/Shanghai");
classXiaoI
{
//by Hackfan
public$sid='';
publicfunction__construct($sid= false)
{
if(!$sid)
{
$this->join();
}
else
{
$this->sid =$sid;
}
}
publicfunctionjoin()
{
$fp=fsockopen('202.109.73.87', 80);
fwrite($fp,'GET /engine/flashrobot2/webbot.js HTTP/1.1
Connection: Close
Host: 202.109.73.87
');
$r='';
while(!feof($fp))
{
$r.=fgets($fp, 512);
}
fclose($fp);
preg_match('!var __sessionId = "(/d+)";!',$r,$match);
$this->sid =$match[1];
$fp=fsockopen('202.109.73.87', 80);
fwrite($fp,'GET /engine/flashrobot2/send.js?SID='.$this->sid.'&USR='.$this->sid.'&CMD=JOIN&r= HTTP/1.1
Connection: Close
Host: 202.109.73.87
');
fclose($fp);
$fpr=fsockopen('202.109.73.87', 80);
fwrite($fpr,'GET /engine/flashrobot2/recv.js?SID='.$this->sid.'&USR='.$this->sid.'&r= HTTP/1.1
Connection: Close
Host: 202.109.73.87
');
fclose($fpr);
}
publicfunctionchat($msg)
{
$fpr=fsockopen('202.109.73.87', 80);
fwrite($fpr,'GET /engine/flashrobot2/recv.js?SID='.$this->sid.'&USR='.$this->sid.'&r= HTTP/1.1
Connection: Close
Host: 202.109.73.87
');
$fps=fsockopen('202.109.73.87', 80);
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
Connection: Close
Host: 202.109.73.87
');
fclose($fps);
$r='';
while(!feof($fpr))
{
$r.=fgets($fpr, 512);
}
fclose($fpr);
if(preg_match('!"MSG":"(.*?)"!',str_replace(array("/r","/n"),array(''),$r),$match))
{
return$match[1];
}
else
{
returnfalse;
}
}
}
?>
具体运行代码如下:
PHP代码
require('xiaoi.php');
$i=newXiaoI();
while(1)
{
echo'me: ';
$s= trim(fgets(STDIN));
$s= iconv('gb2312','utf-8',$s);
echo'xiaoi: '.$i->chat($s)."/n";
}
运行效果如下:
作者:Hackfan,转载请保留,谢谢。