Разница в параметрах формы записей между Firefox и Ruby Mechanize - PullRequest
0 голосов
/ 02 февраля 2010

Я пытаюсь выяснить, если механизатор отправляет правильный почтовый запрос .

Я хочу войти на форум (см. html source, механизировать журнал в моем другом вопросе), но я снова получаю только страницу входа.При просмотре я вижу, что Firefox отправляет сообщение с параметрами, такими как

auth_username=myusername&auth_password=mypassword&auth_login=Login, но мой скрипт отправляет

auth_username=radek&auth_password=mypasswordэто нормально или часть &auth_login=Login должна присутствовать?

Когда я пытался добавить ее, используя login_form['auth_login'] = 'Login', я получил ошибку gems/mechanize-0.9.3/lib/www/mechanize/page.rb:13 in meta ': неопределенный метод search' for nil:NilClass (NoMethodError)

Itмне кажется, что auth_login - это кнопка формы, а не поле (я не знаю, имеет ли это значение)

[#<WWW::Mechanize::Form
 {name nil}
 {method "POST"}
 {action
  "http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1"}
 {fields
  #<WWW::Mechanize::Form::Field:0x36946c0 @name="auth_username", @value="">
  #<WWW::Mechanize::Form::Field:0x369451c @name="auth_password", @value="">}
 {radiobuttons}
 {checkboxes}
 {file_uploads}
 {buttons
  #<WWW::Mechanize::Form::Button:0x36943b4
   @name="auth_login",
   @value="Login">}>
]

Мой скрипт выглядит следующим образом

  require 'rubygems'
  require 'mechanize'
    require 'logger'

  agent = WWW::Mechanize.new {|a| a.log = Logger.new("loginYOTA.log") }

agent.follow_meta_refresh = true #Mechanize does not follow meta refreshes by default, we need to set that option.

page = agent.get("http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1")

login_form = page.form_with(:method => 'POST')  #works

puts login_form.buttons.inspect
puts page.forms.inspect
STDIN.gets

  login_form.fields.each { |f| puts "#{f.name} : #{f.value}" }  
#STDIN.gets
login_form['auth_username'] = 'myusername'
login_form['auth_password'] = 'mypassword'
  login_form['auth_login'] = 'Login'
STDIN.gets  
page = agent.submit login_form
#Display message if logged in

puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div/strong").xpath('text()').to_s.strip
  puts
puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div").xpath('text()').to_s.strip

output = File.open("login.html", "w") {|f| f.write(page.parser.to_html) }

Вы можете найти больше кода, html, войдите в мой другой связанный вопрос войдите в систему с помощью браузера, а затем ruby ​​/ mechanize перехватит его?

1 Ответ

0 голосов
/ 03 февраля 2010

отсутствие одного параметра сравнивать с firefox в POST приводило к тому, что механизация не входила в систему. Добавление нового параметра решило эту проблему.Поэтому мне кажется, что веб-серверу требуется параметр &auth_login=Login, чтобы быть в POST.

Вы можете прочитать , как добавить новое поле для механизации формы в другом вопросе.

...