|
JS小程序:开心餐厅布局程序(可以超过限制多摆炉子,重叠炉子、餐台、桌子、椅子,回收地板、墙纸等功能
http://hi.baidu.com/134931/blog/ ... 155142925807c6.html
在大家的强烈鞭策下,我终于抽了点时间,把前面写的两个小程序组合起来,可以不安装任何软件的情况下,直接用浏览器打开下面的脚本,实现多摆炉子等 功能。 程序的使用方法:粘贴下面的HTML代码到记事本,另存为HTML文件(例如ABC.HTML),登录开心网之后(一定先登录),在那个浏览器 窗口选择打开刚才保存的HTML文件既可使用(有时侯鼠标双击打开就不灵了)。首先只看到获取verify的按钮,点了之后浏览器向开心网发送打开餐厅主 页的请求,稍等一会就会显示verify代码,同时显示可以进一步操作的按钮,这时候应该点“刷新布局”,稍等一会就能看见你的餐厅里面摆放好的物品(注 意坐标方向有一点变化)。现在可以进行两类操作,一是点物品可以移动或者回收物品,移动或者回收后原来的物品消失,新地方或者仓库的变化却要“刷新”后才 显示出来。另外一个功能是点击空白摆放炉子,比如你仓库里面买好了20个炉子,你可以依次点不同的地方,布局好以后点“摆放”按钮,系统就去摆放炉子,等 几秒后就可以“刷新布局”查看战果,进一步到开心网去做菜,看看多出的炉子、草坪上的炉子是不是一样可以用。
超过限制多摆炉子的说明:首先要在开心网餐厅页面,把现有的炉子上的菜扔了或者收了、清洗干净、收到仓库,然后进入商店购买炉子直到达到限制, 然后再次把新买的炉子收回仓库,如此反复可以购买许多炉子到仓库,但是能摆出来的炉子仍然是有限的。现在在开心网页面少摆放一两个炉子(不留是无法多摆 的),比如你可以摆六个炉子就只摆四个或者五个,就在开心网的这个页面,选择浏览器打开文件,浏览你用记事本保存在本机的脚本文件,获取verify、刷 新布局之后就可以在空白处摆放炉子,摆放10个左右,然后点“摆放”按钮,过10秒就可以查看你的效果了。
特别提示:能多摆放的炉子数量,与机器的性能、网络的速度有关,所以你在点“摆放”按钮之前,请关闭与开心网无关的程序窗口,特别是关闭迅雷、 快车、QQ旋风等下载软件,可以用任务管理器看一下CPU的繁忙情况,机器基本上平静的时侯点“摆放”按钮,那样成功的可能行最高。但是经过我的测试(我 的系统和网络都很差),运气好的时侯可以多摆10个,运气不好的时侯只多摆放了两三个,这个能超标的数量,全靠你的PC系统在点“摆放”那一瞬间的并发能 力,一般浏览器可能只有这个水平,如果需要超标更多的数量,可能只有你自己用DELPHI或者C++编写多线程程序,原理和下面的代码是一样的--瞬间并 发。
类似的办法可以摆放其它物品,比如餐台,方法是刷新一下仓库,点一下仓库里面的物品,然后清空摆放设置,重新选择摆放的位置,最后点“摆放”按 钮完成。
提醒一下,我以前刷的炉子今天被开心网没收了,不过我又用这个程序给另外一个朋 友刷了几个,说明程序还能工作。但是如果使用本程序产生了什么后果,比如被开心网进行什么处罚,请自行承担!我的经验是不要超过16个炉子,把摆放成功多的炉子收回仓库,只保留16个炉子做菜就比较安全。
常见问题:你的浏览器可能不支持本地JS,运行后弹出的警告要选择允许被禁用的功能。如果无法获取verify,那说明我的AJAX代码可能并 不适合你的浏览器版本,你需要自行学习如何修改AJAX那几行。我的系统是WINXP的,我只使用的IE6,如果其它系统下出现了问题,请自行分析原因, 一般都是多窗口浏览器是否同步COOKIE的问题,还有就是浏览器对JS的语法要求不同的问题。
完整的程序代码如下:
<style type=text/css>.href {cursor:hand;color:blue;} textarea,input {font-size:9pt;}</style>
<script type=text/javascript>
//全局变量
var verify='';
var cid='';
var uid='';
var gid=256;
function $(id){return document.getElementById(id);}
function createXmlDom(){
var xmlVersions = new Array("MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom");
for (var i=0; i<xmlVersions.length; i++){
try {var oXmlDom = new ActiveXObject(xmlVersions); return oXmlDom;}
catch (e) {}//alert(e.message);
}
throw new Error("当前系统未安装 MSXML!");
}
function getNode(doc, xpath){
var retval = "";
var value = doc.selectSingleNode(xpath);
if (value) retval = value.text;
return retval;
}
var XmlDom=createXmlDom();
var xmlHttpReady=1;
var xmlHttp=null;
function handleStateChange(){
var url=$('addr_line').value;
var now=new Date();
now=now.getTime();
if (xmlHttp.readyState==4){
if (xmlHttp.status==200){
var s_header=xmlHttp.getAllResponseHeaders();
var s_body=xmlHttp.responseText;
$("text_msg").value+='\n====RESULT HEADER======\n'+s_header+'\n=====RESULT TEXT=======\n'+s_body;
//更新verify
if (s_body.match(/verify=([0-9a-z_]+)\&/)){
verify=RegExp.$1;
$('var_verify').innerHTML=verify;
if (verify.match(/^(\d+)_/)) uid=RegExp.$1;
$('opt1').style.display='';
}
//分地址进行处理
if (url.indexOf('http://www.kaixin001.com/cafe/api_getconf.php')==0){show_decor(s_body);}
else if (url.indexOf('http://www.kaixin001.com/cafe/api_mygranary.php')==0){show_granary(s_body);}
} else $("text_msg").value+='\n\n错误代码:'+xmlHttp.status;
xmlHttpReady=1;
xmlHttp=null;
}
}
function http_request(m,u,d){
if (xmlHttpReady==0) return;
xmlHttpReady=0;
$("addr_line").value=u;
$("text_msg").value=m+' '+d+'\n';
if (window.ActiveXObject) xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
else if (window.XMLHttpRequest) xmlHttp=new XMLHttpRequest();
else {alert('浏览器不支持');return;}
xmlHttp.onreadystatechange=handleStateChange;
xmlHttp.open(m,u);
if (d=='') xmlHttp.send(null);
else xmlHttp.send(d);
}
</script>
<input type=text id=addr_line style='width:100%'>
<textarea id=text_msg style='width:100%;height:300'></textarea>
<div>verify=<span id=var_verify></span><a class=href onclick="http_request('GET','http://www.kaixin001.com/!cafe /index.php','');">获取</a></div>
<table><tr valign=top>
<td><div id=show_tab></div>
<td>
<a id=opt1 style='display:none' class=href onclick='if (verify=="") alert("请先获取verify"); else http_request("GET","http://www.kaixin001.com/cafe/api_getconf.php?verify="+verify+"&uid="+uid,"");'> 刷新布局</a><br>
<div id=opt21 style='display:none'>
说明:<br>
一、点击物品可以<select id=func1><option value=1>移动<option value=2>回收</select>物品。<br>
二、点击空白处批量摆放<span id=gname>白色堡垒灶台</span>(点仓库具体物品改变):<br>
<span id=putstove_show></span> <a class=href onclick="putstove_clear();">清除</a> <a class=href onclick="putstove_exec();">摆放</a><br>
</div>
<div id=result_div style='display:none'></div>
</table>
<table><tr valign=top>
<td id=show_granary>
<td><a id=opt22 style='display:none' class=href onclick='if (cid=="") alert("请先刷新布局"); else http_request("GET","http://www.kaixin001.com/cafe/api_mygranary.php?verify="+verify+"&page=0&&type=&cafeid="+cid+"&r="+Math.random(),"");'> 刷新仓库</a><br>
</table>
<script language=javascript>
function show_decor(s){
XmlDom.loadXML(s);
cid=getNode(XmlDom,'/data/cafe/cafeid');
$('opt21').style.display='';
$('opt22').style.display='';
var items=XmlDom.selectNodes('/data/decor/item');
var decor=new Array();
var i,j,x,y,tkey;
for (i=1;i<=20;i++) {decor=new Array();for (j=1;j<=20;j++) decor[j]=' ';}
for (i=1;i<=items.length;i++){
x=parseInt(getNode(XmlDom,'/data/decor/item['+i+']/x'));
y=parseInt(getNode(XmlDom,'/data/decor/item['+i+']/y'));
oid=parseInt(getNode(XmlDom,'/data/decor/item['+i+']/orderid'));
tkey=getNode(XmlDom,'/data/decor/item['+i+']/tkey');
if (tkey=='window') tkey='窗'; else if (tkey=='door') tkey='门'; else if (tkey=='chair') tkey='椅'; else if (tkey=='table') tkey='桌'; else if (tkey=='counter') tkey='柜'; else if (tkey=='stove') tkey='炉'; else if (tkey=='wall') tkey='墙'; else if (tkey=='floor') tkey='地';
decor[x][y]+='<a class=href onclick="do_move('+x+','+y+','+oid+');this.innerHTML=\'\';">'+tkey+'</a>';
}
s='<table border=1 cellspacing=0>';
for (i=0;i<=20;i++) {s+='<tr><td>'+(i==0?'x\\y':i);if (i==0) for (j=1;j<=20;j++) s+='<td>'+j;else for (j=1;j<=20;j++) s+='<td onclick="putstove('+i+','+j+');">'+decor[j];}
s+='</table>';
$('show_tab').innerHTML=s;
}
function show_granary(s){
XmlDom.loadXML(s);
var items=XmlDom.selectNodes('/data/goods/item');
var i,s='',id,name;
for (i=1;i<=items.length;i++){
id=getNode(XmlDom,'/data/goods/item['+i+']/id');
name=getNode(XmlDom,'/data/goods/item['+i+']/name');
s+=' <a class=href style="white-space:pre" onclick="gid='+id+';$(\'gname\').innerHTML=\''+name+'\';">'+name+'('+getNode(XmlDom,'/data/goods/item['+i+']/num')+')</a>';
}
$('show_granary').innerHTML=s;
}
function do_move(x,y,oid){
var url;
if ($('func1').value==1) {
x=prompt('移动的新位置x',x);if (!x) return false;
y=prompt('移动的新位置y',y);if (!y) return false;
url='http://www.kaixin001.com/cafe/api_savegoods.php?verify='+verify+'&cafeid='+cid+'&orderid='+oid+'&direct=1&x='+x+'&y='+y;
}
else if ($('func1').value==2) url='http://www.kaixin001.com/cafe/api_goods2granary.php?verify='+verify+'&cafeid='+cid+'&orderid='+oid+'&r='+Math.random();
if (url) http_request('GET',url,'');
return false;
}
var putstove_html='';
function putstove(i,j){putstove_html+='<img src="http://www.kaixin001.com/cafe/api_granary2cafe.php?verify='+verify+'&cafeid='+cid+'&id='+gid+'&type=10&x='+i+'&y='+j+'&direct=1&orderid=&r=0.'+Math.random()+'">';$('putstove_show').innerHTML+=' ('+i+','+j+')';}
function putstove_clear(){putstove_html='';$('putstove_show').innerHTML='';}
function putstove_exec(){$('result_div').innerHTML=putstove_html;alert('请求发出完毕,你可 以刷新布局看看。');}
</script>
<a href=http://hi.baidu.com/134931/blog/item/2e011923f3155142925807c6.html& gt;本程序最新版本</a>
最后说一句,我写这样的程序,主要是希望激发大家学习计算机编程语言的兴趣,特别是JAVASCRIPT,很简单,很容易学, 而且最关键的是很容易编写出非常有用的程序。以上代码,仅仅是个演示,和专业的外挂相比,相差很远。 |
|