闲时学习了一下Mechanize库。这是一个用于Web自动交互的lib。可以自动存储cookie,重定向,提交表单等等。详细信息参见http://mechanize.rubyforge.org/mechanize/。
作为学习成果,写一个关于开心网组件《大师》的小外挂。闲话少说,献上代码,以抛砖引玉。
登录:
require 'rubygems'
require 'mechanize'
require 'json/pure'
agent=WWW::Mechanize.new
login=agent.get("http://www.kaixin001.com")
f=login.forms.first
f.email="youremail@website.com"
f.password="yourpwd"
f.submit
跳到大师首页,获取可以比武的好友:
pk = agent.get("http://www.kaixin001.com/!pker/index.php?t=50")
div = pk.search("dl/div")[0]
avs = div.search("dd").select {|d|
d.search("div/img")[1][:src].include?("icon_blank.gif") #匹配没有“满”或“师”标记的行
}
和每个好友比武:
#获得每个好友比武的链接
links = avs.collect { |a|
WWW::Mechanize::Page::Link.new(a.search("div/a")[0], agent, pk)
}
current_kungfu = nil #current_kungfu用于存储你的当前武功类别
links.collect {|link|
link.href.to_s.scan(/(\d+)/)[0][0]
}.each {|fid|
#current_kungfu选择你当前最高的武功类别,选择最强的武功自然胜算高嘛:)
if current_kungfu.nil?
selkungfu = agent.get("http://www.kaixin001.com/!pker/!selkungfu.php?fuid=#{fid}")
# f = selkungfu.form("form1")
current_kungfu = selkungfu.body.scan(/value=\"\d+\"/).collect { |input|
input.split("=")[1][1..-2].to_i
}.sort.[](-1)
end
#get pkid 获得一次pk的id参数
pkid_page = agent.post("http://www.kaixin001.com/!pker/!startpk.php",:fuid => fid)
pkid= ::JSON.parse(pkid_page.body)["pkid"]
#
agent.get("http://www.kaixin001.com/!pker/!dopk.php?fuid=#{fid}&pkid=#{pkid}&flag=0&kfid=#{current_kungfu}")
}
退出:
agent.get("http://www.kaixin001.com/login/logout.php")