2011-09-21 52 views
3

我有一个Ruby机械化的问题,它在手动发布请求后302重定向期间丢失了cookie。Ruby Mechanize没有通过cookie请求

1)负载页

agent.get(url) 

登录:

I, [2011-09-21T19:50:46.077628 #5040] INFO -- : Net::HTTP::Get: /some_site 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept => */* 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: user-agent => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-encoding => gzip,deflate,identity 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-language => en-us,en;q=0.5 
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: host => site.com 
I, [2011-09-21T19:50:47.965232 #5040] INFO -- : status: Net::HTTPOK 1.1 200 OK 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: date => Wed, 21 Sep 2011 17:50:46 GMT 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: server => Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g PHP/5.2.17 mod_perl/2.0.4 Perl/v5.10.0 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: x-powered-by => PHP/5.2.17 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: set-cookie => frontend=9d47f1e106d4f2efcc2830988eb66610; expires=Wed, 21-Sep-2011 18:50:46 GMT; path=/; domain=site.com 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: expires => Thu, 19 Nov 1981 08:52:00 GMT 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: cache-control => no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: pragma => no-cache 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: content-encoding => gzip 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: vary => Accept-Encoding,User-Agent 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: keep-alive => timeout=15, max=100 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: connection => Keep-Alive 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: transfer-encoding => chunked 
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: content-type => text/html; charset=UTF-8 
D, [2011-09-21T19:50:48.370832 #5040] DEBUG -- : saved cookie: frontend=9d47f1e106d4f2efcc2830988eb66610 

这一切都工作正常,对我来说很好。会话cookie被设置,添加到机械化cookie jar。

pp agent.cookies[0] 

显示Cookie前端=没有问题。

2)发送POST请求到服务器

agent.post(url,{"product" => "10000","qty" => "1"}) 

这并不该cookie发送到服务器。我收到一条错误消息(“未启用Cookie,请启用以继续”)。机械化只在指定时通过POST请求传递cookie吗?

该cookie不会发送到服务器,除非我专门将它添加到POST请求中。

agent.post(url,{"product" => "10000","qty" => "1"},'cookie' => agent.cookies[0]) 

在这种情况下,记录器显示此:

D, [2011-09-21T19:50:48.480032 #5040] DEBUG -- : request-header: cookie => frontend=9d47f1e106d4f2efcc2830988eb66610 

3)服务器确实302重定向。

对于重定向页面的GET请求,Mechanize不会传递会话cookie。因此,会话会丢失并由服务器设置新的会话cookie。

I, [2011-09-21T19:50:49.182034 #5040] INFO -- : follow redirect to: http://site.com/redirect/ 
I, [2011-09-21T19:50:49.182034 #5040] INFO -- : Net::HTTP::Get: /redirect/ 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept => */* 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: user-agent => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-encoding => gzip,deflate,identity 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-language => en-us,en;q=0.5 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: host => site.com 
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: referer => http:/site.com/referrerlink/ 
I, [2011-09-21T19:50:49.728035 #5040] INFO -- : status: Net::HTTPOK 1.1 200 OK 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: date => Wed, 21 Sep 2011 17:50:49 GMT 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: server => Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g PHP/5.2.17 mod_perl/2.0.4 Perl/v5.10.0 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: x-powered-by => PHP/5.2.17 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: set-cookie => frontend=c08477bb03473d68acd83ed81ed56101; expires=Wed, 21-Sep-2011 18:50:49 GMT; path=/; domain=site.com 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: expires => Thu, 19 Nov 1981 08:52:00 GMT 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: cache-control => no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: pragma => no-cache 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-encoding => gzip 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: vary => Accept-Encoding,User-Agent 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-length => 6441 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: keep-alive => timeout=15, max=98 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: connection => Keep-Alive 
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-type => text/html; charset=UTF-8 

有关如何防止机械手在302重定向过程中丢失cookie的任何建议?由于在网站上使用JavaScript,我无法使用手动POST请求。

这是Mechanize的这种常见行为,只有在明确指定的情况下(根据我使用POST请求的经验,直到现在我没有丢失会话cookie的问题)才使用手动POST请求发送Cookie。

我感谢您的帮助。

谢谢,克里斯

+0

我想我和你有同样的问题。即使使用“agent.redirect_ok = false”关闭重定向似乎也没有帮助。我将深入研究这一点。 – joshaidan

+0

经过一些测试后,我认为这个问题在github上的最新版本中得到修复。 2.0.2在撰写本评论时。 – joshaidan

回答

0

我碰到了同样的问题重定向,其中饼干没有被重定向后保存在罐子。我从github存储库(版本2.0.2)下载了最新版本的Mechanize,并且问题似乎得到解决。不完全确定代码库中的更改是否解决了此问题,但现在似乎在重定向后保存了Cookie。

当您尝试此修复程序时,请确保您使用的是版本2.0.2的gem,而不是另一个本地安装版本的gem。这让我有一段时间。 :)