|
首先简单介绍一下这个游戏,手机游戏大航海是人人网上一个纯手机游戏,目前只针对手机校内用户。 手机访问m.xiaonei.com->应用->大航海来体验这个手机游戏的乐趣。
现在随着SNS的流行,WEB游戏也开始流行。有时候并不是为了玩游戏,更多的时候是遍历一遍好友。回到外挂这个话题上来。
作为手机游戏,受到手机浏览器的限制,这个WAP游戏不可能做的很炫很复杂。所以弄个外挂还是非常简单的。
首先要感谢人人网,为我们提供了免登录书签,这样凭借一串字符串就可以登录人人网,而不需要再模拟手机用户登录的过程了。下面代码当中的sid=****就是我的登录大航海游戏的书签。出于众所周知的原因,这串字符是不能公布的。
说起来这个原理非常简单:获取页面->分析链接->执行操作。
涉及到两个个关键的PHP函数:
1、file_get_contents():用来取得URL的内容。
2、preg_match_all():正则匹配所有可执行操作的链接。每一个可执行的操作对应的URL字符串都有明显特征,所以找起来也很方便。
下面附上完整的PHP代码。
<?php/*** 手机人人网(http://m.renren.com)* 大航海外挂* * @author BookMoth* @version 0.1* @copyright BookMoth* * @todo 捕捞价值高的鱼、自动转移新海域、给好友放鲨鱼、好友……**/define('BASE_URL','http://mapps.renren.com/');$url = "http://m.renren.com/apphistory.do?appid=31662&sid=*********************************&u*b*s*&htf=646";//捕鱼游戏的入口链接地址。$reg_a = '/<a href="//([^>]*)">.+?<//a>/';$cmdChain = new CommandChain();$cmdChain->addCommand(new OpRemoveShark());//清除鲨鱼操作$cmdChain->addCommand(new OpSell());//卖鱼操作$cmdChain->addCommand(new OpFish());//捕捞操作while (true) {$content = file_get_contents($url);preg_match_all($reg_a,$content,$result);//提取所有链接foreach ($result[1] as $item) {$cmdChain->runCommand($item);//根据链接执行操作}$remain_second = get_remain_time($content);//获取刷新时间$refresh_second = $remain_second?(($remain_second < 7200)?$remain_second:7200):3;sleep($refresh_second);//睡觉。。}function get_remain_time($content){$reg_hour = '/(/d+)小时/u';$reg_minus = '/(/d+)分/u';preg_match($reg_hour,$content,$hour);preg_match($reg_minus,$content,$minus);$remain_hour = $hour[1]?$hour[1]:0;$remain_min = $minus[1]?$minus[1]:0;$remain_sec = ($remain_hour*60+$remain_min)*60;echo date("Y-m-d H:i:s",time())."[0]还需{$remain_hour}小时{$remain_min}分完成/n";return $remain_sec;}class CommandChain{private $_commands = array();public function addCommand($cmd){$this->_commands []= $cmd;}public function runCommand($url){foreach( $this->_commands as $cmd ){if ( $cmd->onCommand($url) )return;}}}class OpRemoveShark{//清鲨鱼public function onCommand($url){if(strpos($url,'removeShark?')){//发现鲨鱼$result = file_get_contents(BASE_URL.$url);if(strstr($result,'成功清除鲨鱼,获得5点经验')){echo date("Y-m-d H:i:s",time())."[0]成功清除鲨鱼,获得5点经验/n";}else{echo date("Y-m-d H:i:s",time())."[1]发现鲨鱼,但是清除失败/n";}return true;}else{return false;}}}class OpSell{//卖出public function onCommand($url){if(strpos($url,'sell?')){$result = file_get_contents(BASE_URL.$url);if(strstr($result,'成功卖出')){preg_match('/<span class="red">([^<]+)<//span>/',$result,$info);echo date("Y-m-d H:i:s",time())."[0]{$info[1]}/n";}else{echo date("Y-m-d H:i:s",time())."[1]卖出失败/n";}return true;}else{return false;}}}class OpFish{//开始探测public function onCommand($url){if(strpos($url,'fishDetect?')){$result = file_get_contents(BASE_URL.$url);if(strstr($result,'捕捞')){//捕捞preg_match('/<a href="//(voyage_wap//fish//fish/?[^" mce_href="//(voyage_wap//fish//fish/?[^"]+)">/',$result,$fish);if($fish[1]){$result = file_get_contents(BASE_URL.$fish[1]);echo date("Y-m-d H:i:s",time())."[0]捕捞开始/n";}}else{echo date("Y-m-d H:i:s",time())."[1]探测失败/n";}return true;}else{return false;}}}?>
运行的结果大概是这样的:
最后说下为什么要写外挂,主要是有人偷鱼偷的很happy,我稍微有点小郁闷。写外挂的重要意义在于:
为了减少渔民的损失,打消几个别有用心的不法分子别人劳动果实的险恶意图。在广大青少年当中树立高尚的社会主义价值观,强化青少年法律意识,杜绝青少年违法犯罪行为,共同构建社会主义和谐社会……
其实大航海是个非常不错的应用。感谢他的作者。
--
欢迎讨论下面的问题:
1、对于受到客户端限制的WEB/WAP游戏,如何检测和预防上面的这种自动化脚本?
2、代码本身的问题,比如设计模式,算法等等。
不欢迎下面的问题:
1、这个外挂怎么用啊? |
|
|