2013-05-22 18 views
4

我使用機械化來根據用戶的請求刮取受密碼保護的網站。我試圖通過運行登錄到站點的Rake任務來分離登錄和搜索功能,並將cookie保存到數據庫中,並由隨後的機械化請求重新使用。機械化cookie_jar不保存會話標記

我的問題是,cookie_jar.save方法不會將會話cookie /令牌保存到cookie文件中。以下是一個演示一個簡單的例子:

require 'mechanize' 

# Setup Mechanize agents 
agent1 = Mechanize.new 
agent2 = Mechanize.new 

# Fetch page and save cookies to local file 
agent1.get ('http://www.my-secure-website.com') 
agent1.post('http://www.my-secure-website.com/login', { 
    'user[login]' => 'my_login', 
    'user[password]' => 'my_password', 
    'submit' => 'Login' 
}) 

# Verify and save cookies 
agent1.cookie_jar.save_as 'cookies' 
p agent1.cookie_jar 
# #<Mechanize::CookieJar:0x8cf60b8 @jar={"www.my-secure-website.com"=>{"/"=>{"JSESSIONID"=>JSESSIONID=1NqLRc4dm0Qp5465N82Zwz4N0yXxy5jP1pXpyKp9jG8ssX2nMp5q!-334818122}, "/login/"=>{"Account"=>Account=my_account_number}}, "evr.my-secure-website.com"=>{"/APBDBQ"=>{"JSESSIONID"=>JSESSIONID=A74D230DEAFF50098557FBE76DD2E0C5}}} 


######################################################## 
# Now let's load cookies into the second Mechanize agent 

# Version 1 - This works only partially. Session cookies are missing: 
agent2.cookie_jar.load 'cookies' 
p agent2.cookies 
# [ 
# [0] Account=my_account_number 
# ] 
p agent2.cookie_jar 
# #<Mechanize::CookieJar:0x914c658 @jar={"www.my-secure-website.com"=>{"/"=>{}, "/login/"=>{"Account"=>Account=my_account_number}}, "evr.my-secure-website.com"=>{"/APBDBQ"=>{}}}> 


# Version 2 - This works, but cannot be saved into file/db! 
agent2.cookie_jar = agent1.cookie_jar 
p agent2.cookies 
# [ 
# [0] JSESSIONID=1NqLRc4dm0Qp5465N82Zwz4N0yXxy5jP1pXpyKp9jG8ssX2nMp5q!-334818122, 
# [1] Account=my_account_number, 
# [2] JSESSIONID=A74D230DEAFF50098557FBE76DD2E0C5 
# ] 
p agent2.cookie_jar 
# #<Mechanize::CookieJar:0x8cf60b8 @jar={"www.my-secure-website.com"=>{"/"=>{"JSESSIONID"=>JSESSIONID=1NqLRc4dm0Qp5465N82Zwz4N0yXxy5jP1pXpyKp9jG8ssX2nMp5q!-334818122}, "/login/"=>{"Account"=>Account=my_account_number}}, "evr.my-secure-website.com"=>{"/APBDBQ"=>{"JSESSIONID"=>JSESSIONID=A74D230DEAFF50098557FBE76DD2E0C5}}}> 

這是我保存的Cookie文件看起來像:

--- 
www.my-secure-website.com: 
    /: {} 
    /login/: 
    Account: !ruby/object:Mechanize::Cookie 
    version: 0 
    port: 
    discard: 
    comment_url: 
    expires: Thu, 22 May 2014 07:48:46 GMT 
    max_age: 
    comment: 
    secure: true 
    path: /login/ 
    domain: www.my-secure-website.com 
    accessed_at: 2013-05-22 00:48:47.227628764 -07:00 
    created_at: 2013-05-22 00:48:47.227628764 -07:00 
    name: Account 
    value: S4633 
    for_domain: false 
    domain_name: !ruby/object:DomainName 
     ipaddr: 
     hostname: www.my-secure-website.com 
     uri_host: www.my-secure-website.com 
     tld: com 
     canonical_tld_p: true 
     domain: my-secure-website.com 
    session: false 
evr.my-secure-website.com: 
    /APBDBQ: {} 

你可以看到在控制檯輸出會話令牌(JSESSIONID),但它缺少來自本地cookie文件。我的問題是,我怎樣才能讓Mechanize.cookie_jar.save_as也保存會話數據?

+0

那麼問題是什麼? – pguardiario

+0

已更新才能使問題更清晰。 –

+0

會話cookie可能不會保存。你想修補Mechanize.cookie_jar來改變它? – pguardiario

回答

7

自機械化版本2.6.0起。該cookie_jar.save_as方法允許:session選擇傳球,使保存會話cookie,以及:

agent1.cookie_jar.save_as 'cookies', :session => true, :format => :yaml 

附:我使用的是v2.5.1,它缺少這個功能。

+0

很高興知道! – pguardiario