代码之家  ›  专栏  ›  技术社区  ›  Andy Waite

在谷歌文档中使用机械化

  •  1
  • Andy Waite  · 技术社区  · 14 年前

    我尝试使用机械化登录到Google文档,这样我就可以抓取一些东西(从API中是不可能的),但当我尝试遵循元重定向时,我似乎一直得到404:

    require 'rubygems'
    require 'mechanize'
    
    USERNAME = "..."
    PASSWORD = "..."
    
    LOGIN_URL = "https://www.google.com/accounts/Login?hl=en&continue=http://docs.google.com/"
    
    agent = Mechanize.new
    login_page = agent.get(LOGIN_URL)
    login_form = login_page.forms.first
    login_form.Email = USERNAME
    login_form.Passwd = PASSWORD
    login_response_page = agent.submit(login_form)
    
    redirect = login_response_page.meta[0].uri.to_s
    
    puts "redirect: #{redirect}"
    
    followed_page = agent.get(redirect) # throws a HTTPNotFound exception
    
    pp followed_page
    

    有人知道为什么这个不起作用吗?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Paul S    14 年前

    安迪,你太棒了!! 你的代码帮助我使我的脚本可行,并登录到谷歌帐户。几个小时后我发现了你的错误。是关于HTML转义的。正如我发现的,机械化会自动转义它接收的作为“get”方法参数的URI。所以我的解决方案是:

    EMAIL  = ".."
    PASSWD = ".."
    agent = Mechanize.new{ |a| a.log = Logger.new("mech.log")}
    agent.user_agent_alias = 'Linux Mozilla'
    agent.open_timeout = 3
    agent.read_timeout = 4
    agent.keep_alive   = true
    agent.redirect_ok  = true
    LOGIN_URL = "https://www.google.com/accounts/Login?hl=en"
    
    login_page = agent.get(LOGIN_URL)
    login_form = login_page.forms.first
    login_form.Email = EMAIL
    login_form.Passwd = PASSWD
    login_response_page = agent.submit(login_form)
    
    redirect = login_response_page.meta[0].uri.to_s
    
    puts redirect.split('&')[0..-2].join('&') + "&continue=https://www.google.com/"
    followed_page = agent.get(redirect.split('&')[0..-2].join('&') + "&continue=https://www.google.com/adplanner")
    pp followed_page
    

    这对我来说很好。我已经用新的替换了元标记(已经转义)中的continue参数。