2011-08-12 33 views
14

Tôi đang cố sử dụng phiên bản Ruby của Mechanize để trích xuất vé của nhà tuyển dụng của tôi từ hệ thống quản lý vé mà chúng tôi di chuyển ra khỏi đó không cung cấp API.Duy trì cookie giữa Yêu cầu cơ chế

Vấn đề là, có vẻ như mechanize không được giữ các cookie giữa post cuộc gọi và get cuộc gọi hiển thị dưới đây:

require 'rubygems' 
require 'nokogiri' 
require 'mechanize' 

@agent = Mechanize.new 

page = @agent.post('http://<url>.com/user_session', { 
              'authenticity_token' => '<token>', 
              'user_session[login]' => '<login>', 
              'user_session[password]' => '<password>', 
              'user_session[remember_me]' => '0', 
              'commit' => 'Login' 
}) 

page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1' 
puts page.title 

user_session là URL mà POSTS trang đăng nhập của trang web, và tôi đã xác minh rằng điều này thực sự đăng nhập tôi. Nhưng trang trả về từ cuộc gọi get là 'Rất tiếc, bạn chưa đăng nhập!' trang.

Tôi đã xác minh rằng các liên kết ing click trên trang trả về từ cuộc gọi post hoạt động, nhưng tôi thực sự không thể truy cập vào nơi tôi cần mà không cần JavaScript. Và tất nhiên tôi đã thực hiện thành công trên trình duyệt với cùng một thông tin đăng nhập.

Tôi đang làm gì sai?

Trả lời

12

Đồng ý điều này có thể giúp bạn - trước hết bạn đang sử dụng phiên bản cơ giới nào? Bạn cần phải xác định, nếu vấn đề này là do các tập tin cookie được ghi đè/làm sạch bằng cách cơ giới hóa giữa các yêu cầu hoặc nếu các cookie sai/không được thiết lập ở nơi đầu tiên. Bạn có thể làm điều đó bằng cách thêm một số puts @agent.cookie_jar.jar giữa hai yêu cầu, để xem những gì được lưu trữ.

Nếu vấn đề ghi đè của nó, bạn có thể giải quyết vấn đề bằng cách thu thập cookie từ yêu cầu đầu tiên và áp dụng chúng cho yêu cầu thứ hai. Có rất nhiều cách để làm điều này:

Một cách là chỉ cần làm một temp_jar = agent.cookie_jar.jar một sau đó chỉ cần đi qua mỗi cookie và thêm nó một lần nữa bằng cách sử dụng phương pháp .add

TUY NHIÊN - cách đơn giản nhất là bằng cách chỉ cần cài đặt 2.1 mới nhất phát hành cơ giới hóa (nhiều bản sửa lỗi), bởi vì sau đó bạn sẽ có thể làm điều đó rất đơn giản. Để cài đặt mới nhất làm một gem install mechanize --pre và chắc chắn rằng để thoát khỏi phiên bản cũ của cơ giới hóa gem uninstall mechanize 'some_version' sau này, bạn chỉ có thể làm như sau:

require 'rubygems' 
require 'nokogiri' 
require 'mechanize' 

@agent = Mechanize.new 

page = @agent.post('http://<url>.com/user_session', { 
             'authenticity_token' => '<token>', 
             'user_session[login]' => '<login>', 
             'user_session[password]' => '<password>', 
             'user_session[remember_me]' => '0', 
             'commit' => 'Login' 
}) 
temp_jar = @agent.cookie_jar 
#Do whatever you need an use the cookies again in a new session after that 
@agent = Mechanize.new 
@agent.cookie_jar = temp_jar 

page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1' 
puts page.title 

BTW tài liệu là ở đây http://mechanize.rubyforge.org/index.html

+0

này là khá xấu, tại sao một ví dụ cơ giới mới cần thiết? –

+0

@DitmarWendt đây chỉ là một ví dụ làm thế nào để tái sử dụng các tập tin cookie thu được trước đó sau khi đăng nhập thực hiện. –

Các vấn đề liên quan