论坛首页 编程语言技术论坛

《无处不Ruby》系列之自动提交周报到周报系统

浏览 3413 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-25   最后修改:2009-03-30
下面这个自动提交周报的代码只适用于我公司的周报系统,但改改就可以适应别的公司的web周报系统了,关键的代码都在for循环里面,三次HTTP请求,每次都要带上登录时分配给你的Cookie以保持连接状态,这跟我们公司的周报系统设定有关。

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中读写,也很方便。
   发表时间:2008-03-25  
建議用 mechanize 作 http client ,省去人手找 form field 以及 cookies 處理的問題
0 请登录后投票
   发表时间:2008-03-26  
谢谢siuying让我知道了还有这样的一个库。

不过我有一个建议,就是掌握知识最好掌握最基本的东西,其它的第三方库无非是对最基础的方法的封装而已,太多的第三方库会让我们的大脑不够用,没办法记住太多的知识,不过好用的以一当十的第三方库还是值得推荐的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics