[原创]编写 Travian 扫田器
近期没事干,玩了一会儿网页游戏,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个线程,一个格子一个格子扫过去。
因为此方法将大幅影响服务器的响应,所以,就不发布这个害人的东西了。