浏览 3413 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-25
最后修改:2009-03-30
request_post request_get 是关键!这两个方法市面上找不到,是我翻箱倒柜从http.rb的源码里面扣出来的,DOC太不全了!!!!!! require "net/http" require "uri" require "pp" #~personal configurations as below: #~ forumID="347" cookie="" tid=nil #~loginfo contains userID and password #~ loginfo="username=cuizheng&password=cuizheng&login=登录" #~reportinfo e.g.:"forumID=347&tid=1014&tempAttachmentID=-1&subject=2008-2-25到2008-2-29周报&body=E网打进的性能测试&doPost=发表帖子" #~ reportinfo="forumID=#{forumID}&tid=#{tid}&tempAttachmentID=-1&subject=2008-3-3到2008-3-7周报&body=E网打进的性能测试&doPost=发表帖子" #~the below urls and uris will be used #~ logurl = "http://alisoft.alibaba-inc.com/jiveforums/login.jspa" preposturl = "http://alisoft.alibaba-inc.com/jiveforums/post!default.jspa?forumID=#{forumID}" posturl = "http://alisoft.alibaba-inc.com/jiveforums/post!post.jspa" loguri = URI.parse(logurl) preposturi = URI.parse(preposturl) posturi = URI.parse(posturl) #~the loginfo config of Hash format will not be used but be retained #~ #~ loginfo = { #~ "username" => "cuizheng", #~ "password" => "woaiwojia", #~ "login" => "登录"} #~ Net::HTTP.start(loguri.host, loguri.port) do |http| for i in 1..3 do #~login weekly report site #~ http.request_post(loguri.path,loginfo) do |response| if /Welcome/.match(response.read_body) then puts "login success" cookie=response["set-cookie"] #~get cookie from response #~the site judge the session's logged status by session id that been stored in client's cookie #~ #~ response.each do |key,val| #~ puts "#{key}=>#{val}" #~ end #~ else puts "login failed" next end end #~to get tid value in prepost page's html code #~ http.request_get("#{preposturi.path}?#{preposturi.query}",{"Cookie"=>"#{cookie}"}) do |response| #~DIY http request head[Cookie],otherwise the site will refused this request and redirection the request to default page #~ if match_tid=/name=\"tid\" value=\"(\d+)\"/.match(response.read_body) then tid=match_tid.captures[0] #~use regular expression get tid's value #~ puts "get tid success and tid is #{tid}" else puts "get tid failed" next end end #~post the weekly report #~ http.request_post(posturi.path,reportinfo,{"Cookie"=>"#{cookie}"}) do |response| if response.class==Net::HTTPFound then #~if post success,the site will response 302 Code in head's Status-Line #~ puts "post weekly report success" break else #~else the site will response HTTPBadResponse class #~ puts "post faild and responde type is #{response.class}" next end end end end 注释比较详细,要改的地方是forumID,每个人周报的forumID都是不同但又固定的,改成你自己的就行了,loginfo中账号和密码也改成你自己的,reportinfo写上要post的周报内容和标题,脚本中如果有一个地方出错的话会执行下一个循环,一共执行三次,每出错的话就一次。如果觉得把周报内容写在reportinfo中不爽,可以写进YAML中读写,也很方便。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-25
建議用 mechanize 作 http client ,省去人手找 form field 以及 cookies 處理的問題
|
|
返回顶楼 | |
发表时间:2008-03-26
谢谢siuying让我知道了还有这样的一个库。
不过我有一个建议,就是掌握知识最好掌握最基本的东西,其它的第三方库无非是对最基础的方法的封装而已,太多的第三方库会让我们的大脑不够用,没办法记住太多的知识,不过好用的以一当十的第三方库还是值得推荐的。 |
|
返回顶楼 | |