posta differenza parametri di modulo tra Firefox e Ruby Mechanize
-
24-09-2019 - |
Domanda
Sto cercando di capire se mechanize invia corretta postale di query .
Voglio accedere ad un forum (si veda html sorgente, mechanize log nella mia altra questione) ma ho ancora una volta solo la pagina di login. Se si guarda in esso posso vedere che Firefox invia post con parametri come
auth_username=myusername&auth_password=mypassword&auth_login=Login
, ma il mio script invia
auth_username=radek&auth_password=mypassword
è che ok o la parte &auth_login=Login
deve essere presente?
Quando ho provato ad aggiungere utilizzando login_form['auth_login'] = 'Login'
ho ottenuto un gems/mechanize-0.9.3/lib/www/mechanize/page.rb:13 in
meta errore ': metodo non definito search' for nil:NilClass (NoMethodError)
Mi sembra che auth_login è un'organizzazione senza pulsante di forma un campo (non so se è importante)
[#<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">}>
]
Il mio script è la seguente
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) }
Si possono trovare più codice, html, My altra questione correlata log in con il browser e poi rubino / mechanize prende sopra?
Soluzione
assenza di un parametro confrontarle firefox in POST causato mechanize non connettervi. Aggiunta nuovo parametro risolto questo problema. Quindi mi sembra che il server web richiede parametro &auth_login=Login
di essere in POST.
Si può leggere come aggiungere nuovo campo Mechanize modulo in un'altra domanda.