[原创]编写 Travian 扫田器

近期没事干,玩了一会儿网页游戏,travian,玩的是 speed 服的,因为普服的速度没意思。
里面涉及到一个话题,就是扫田。

田不象绿洲,开图即现,而是要非得点进去才能看得见,再者,对于大量造兵者,没有田就会饿死人,因此,田也就成了一个争夺的目标。

下面我们看一下如何写一个扫田器。

首先,你得在任何一个服注册一个帐号,这个要求太简单了,但是要注意,以下我们要做的就用这个帐号,这个帐号如果没有意外,肯定会在你用完之后被封。

 

1.写一个程序,登录进这个服务器。

这个要求很简单。因为我目前使用 C# 所以以 speed.travian.cn 说一下方法,

 

 

using  System.Net;
using  System.IO;
using  System.Text.RegularExpressions;


 

这很重要,.Net 中有对网络有用的地东西,IO在操作 Stream 上提供支持,而RegularExpressions则是正则表达式的了。

然后,

 

           WebClient client  =   new  WebClient();
            client.Encoding 
=  System.Text.Encoding.UTF8;
           
string   source  =  client.DownloadString( @" Http://speed.travian.cn/login.php " );

如此就可以得知登录页面的代码,因为里面有几处是几个随机值,要提交的,包括几个input 的 name 。

 得到的 source 就是网页的源代码。

如前面几贴提到,如果要使用代理,则

 

        WebProxy wp  =   new  WebProxy( " 125.125.125.125:8080 " );    // 当然,这个IP是假的,代理的IP网上到处都是,随便找个就有。

        wp.BypassProxyOnLocal 
=   false ;

         client.Proxy 
=  wp;

这样就实现代理访问了。

 

得到 source 之后,即可对其进行分析。

为了方便,去掉所有的 " 号,因为这个东西处理起来很麻烦。

 

           source  =  source.Replace( " \ "" , "" );

接下来根据正则表达式取得登录的内容。

            Regex rloginName  =   new  Regex( @" name=login value=\w* " );
            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个线程,一个格子一个格子扫过去。


 

因为此方法将大幅影响服务器的响应,所以,就不发布这个害人的东西了。

转载于:https://www.cnblogs.com/qufo/archive/2007/11/05/949725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值