YY抢楼机……

阅读更多

喜欢耍星际,喜欢看rep,所以yaoyuan.com我是常常去的。yaoyuan有个风格,就是里面的人喜欢抢楼,当然,抢到第一楼就可以捏楼下所有人的jj,是件很痛快的事情,娃哈哈。。。

想做一个自动抢楼的程序是很久之前的事情了,一直没有着手做,直到最近,前天吧,才开始……

抢楼,对我来说,只有第一楼才是我感兴趣的。所以,抢楼程序需要满足这个需求。

步骤如下:

  1. 抓取首页的html进行分析取出最大的有效的SID(yaoyuan首页有rep上传,和rep下载都是用的SID需要分开)
  2. 解析最大的SID对应的页面检查是否有回复
  3. 没有回复的话post自己定义好的随机字符串

其实,貌似原理简单,用socket连接上去post数据就是了。其实,里面还有很多细节问题。

  • 解析html

解析html有几种方式:

  1. 一是把html一行行的读出来,通过subString进行截取。
  2. 还有就是正则表达式获取。
  3. 另外还有就是把html解析成xml文件

三种方式第一种应该是最简单的,但是效率和扩展性不行,第二种较复杂,解析的速度应该不错,但是扩展性依然不行。第三种是我最倾向的。速度可能会慢些,但是由于把html解析成标准的xml文件,用dom来获取节点数据,是很规范的做法,如果要获取页面的其他数据,可以很方便的取得。

但是三种方式应用到yaoyuan,应用到抢楼来说的话,肯定是第一种占优势了,简单呗。yaoyuan的页面几年了都没有变过,即使变,修改下代码也是很simple的事情。

  • post数据

yaoyuan的php程序比较烂,连$_POST,$_GET的获取也没有区分开来。发表讨论只需要把什么用户密码搞成一个字符串,浏览器输入就可以了,,这种方式简单是简单,可惜没有办法换行。所以用POST的方式是最好的。

代码如下:
  1. PostMethod pMethod = new PostMethod(host);   
  2. //  method.setFollowRedirects(true);   
  3.     NameValuePair SID = new NameValuePair("SID""49997");   
  4.     NameValuePair type = new NameValuePair("type""soft");   
  5.     NameValuePair act = new NameValuePair("act""post");   
  6.     NameValuePair cont = new NameValuePair("cont", reply);   
  7.     NameValuePair backurl = new NameValuePair("backurl""/show.php?SID=49997");   
  8.        
  9.     NameValuePair UserName = new NameValuePair("name", username);   
  10.     NameValuePair Password = new NameValuePair("psw", password);   
  11.     NameValuePair[] postPair = new NameValuePair[] {SID, type, act, cont, backurl, UserName, Password};   
  12.     pMethod.setRequestBody(postPair);  

这样就可以完成一个简单的post数据。其中的String reply是用xml文件定义好,然后自己获取的随机回复,这样就可以解决换行的问题。

  • 线程

还有一个就是线程了。要获取最大的SID并且,其他人访问同一个程序的时候直接访问已经获取到的SID,而不用再产生一个获取SID的实例,需要用到线程。不知道这算不算传说中的单值模式,,忽忽,设计模式没有学好……这点我没有做了,什么时候得了解下。

这是用java的httpClient写的,java的socket本来也可以自己写,但是总是感觉没有httpClient爽……

抢楼机没有写一个正式版的出来,因为剩下的都是一些杂七杂八的活了,不想写了。html的parse也搞累了,httpClient的登陆也把我头搞大了。还好,都已经写出demo程序了。

html parse: jTidy/nekoHTML/htmlParser...

http client:apache-commons-httpClient

xml parse:jDom

你可能感兴趣的:(正则表达式,Socket,PHP,设计模式,XML)