喜欢耍星际,喜欢看rep,所以yaoyuan.com我是常常去的。yaoyuan有个风格,就是里面的人喜欢抢楼,当然,抢到第一楼就可以捏楼下所有人的jj,是件很痛快的事情,娃哈哈。。。
想做一个自动抢楼的程序是很久之前的事情了,一直没有着手做,直到最近,前天吧,才开始……
抢楼,对我来说,只有第一楼才是我感兴趣的。所以,抢楼程序需要满足这个需求。
步骤如下:
- 抓取首页的html进行分析取出最大的有效的SID(yaoyuan首页有rep上传,和rep下载都是用的SID需要分开)
- 解析最大的SID对应的页面检查是否有回复
- 没有回复的话post自己定义好的随机字符串
其实,貌似原理简单,用socket连接上去post数据就是了。其实,里面还有很多细节问题。
- 解析html
解析html有几种方式:
- 一是把html一行行的读出来,通过subString进行截取。
- 还有就是正则表达式获取。
- 另外还有就是把html解析成xml文件
三种方式第一种应该是最简单的,但是效率和扩展性不行,第二种较复杂,解析的速度应该不错,但是扩展性依然不行。第三种是我最倾向的。速度可能会慢些,但是由于把html解析成标准的xml文件,用dom来获取节点数据,是很规范的做法,如果要获取页面的其他数据,可以很方便的取得。
但是三种方式应用到yaoyuan,应用到抢楼来说的话,肯定是第一种占优势了,简单呗。yaoyuan的页面几年了都没有变过,即使变,修改下代码也是很simple的事情。
- post数据
yaoyuan的php程序比较烂,连$_POST,$_GET的获取也没有区分开来。发表讨论只需要把什么用户密码搞成一个字符串,浏览器输入就可以了,,这种方式简单是简单,可惜没有办法换行。所以用POST的方式是最好的。
这样就可以完成一个简单的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