近期没事干,玩了一会儿网页游戏,travian,玩的是 speed 服的,因为普服的速度没意思。
里面涉及到一个话题,就是扫田。
田不象绿洲,开图即现,而是要非得点进去才能看得见,再者,对于大量造兵者,没有田就会饿死人,因此,田也就成了一个争夺的目标。
下面我们看一下如何写一个扫田器。
首先,你得在任何一个服注册一个帐号,这个要求太简单了,但是要注意,以下我们要做的就用这个帐号,这个帐号如果没有意外,肯定会在你用完之后被封。
1.写一个程序,登录进这个服务器。
这个要求很简单。因为我目前使用 C# 所以以 speed.travian.cn 说一下方法,
要
using System.IO;
using System.Text.RegularExpressions;
这很重要,.Net 中有对网络有用的地东西,IO在操作 Stream 上提供支持,而RegularExpressions则是正则表达式的了。
然后,
client.Encoding = System.Text.Encoding.UTF8;
string source = client.DownloadString( @" Http://speed.travian.cn/login.php " );
如此就可以得知登录页面的代码,因为里面有几处是几个随机值,要提交的,包括几个input 的 name 。
得到的 source 就是网页的源代码。
如前面几贴提到,如果要使用代理,则
wp.BypassProxyOnLocal = false ;
client.Proxy = wp;
这样就实现代理访问了。
得到 source 之后,即可对其进行分析。
为了方便,去掉所有的 " 号,因为这个东西处理起来很麻烦。
接下来根据正则表达式取得登录的内容。
Match mloginName = rloginName.Match(source);
if (mloginName.Success) { loginName = mloginName.ToString().Replace(@"name=login value=", ""); }
Regex rloginPassword = new Regex( @" type=password name=\w* " );
Match mloginPassword = rloginPassword.Match(source);
if (mloginPassword.Success) { loginPassword = mloginPassword.ToString().Replace(@"type=password name=", ""); }
Regex rloginUsername = new Regex( @" input class=fm fm110 type=text name=\w* " );
Match mloginUsername = rloginUsername.Match(source);
if (mloginUsername.Success) { loginUsername = mloginUsername.ToString().Replace(@"input class=fm fm110 type=text name=",""); }
Regex rloginRand = new Regex( @" <p align=center><input type=hidden name=\w* " );
Match mloginRand = rloginRand.Match(source);
if (mloginRand.Success) { loginrand = mloginRand.ToString().Replace("<p align=center><input type=hidden name=",""); }
//
postString = @" w=1024:768&login= " + loginName + " & " + loginUsername + " = " + txtUserName.Text + " & " + loginPassword + " = " + txtPassword.Text + " & " + loginrand + " =&s1.x=10&s1.y=10&s1=login " ;
WebRequest req = WebRequest.Create( @" http://speed.travian.cn/dorf1.php " );
req.ContentType = " application/x-www-form-urlencoded " ;
req.Method = " POST " ;
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(postString);
req.ContentLength = bytes.Length;
req.ContentLength = bytes.Length;
Stream os = req.GetRequestStream();
os.Write(bytes, 0 , bytes.Length);
os.Close();
WebResponse resp = req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream());
好了,提交的字符串是poststring, sr 就是登录之后的村庄主页的详细内容了。当然,还是页面源码。
其实此处有没有这个源码意义不大,因为我们此处的目的在于扫田,(我另外一个程序中有取这些信息进行一些自动建筑之类)
接下来,我们开始进行扫田了。
travian 的地图是一个方形地图,左上角是 (-400,400)右下解是 400,-400)每个格子一直加过去即可,构造好相应的 URL ,直接访问,得到源码后根据一个 <div id="f6"></div>类似的东西就可以得出是多少田的了,比如说, f6 是 15田的。其特点是一个字母后加一个数字,正则表达式为 <div id=\w\d></div> (我讨厌"号)
接下来没什么技术难度了,开50个线程,一个格子一个格子扫过去。
因为此方法将大幅影响服务器的响应,所以,就不发布这个害人的东西了。