2010-02-01 8 views
0

J'essaie de comprendre si mécanisée envoie correcte post-requête. Je veux me connecter à un forum (s'il vous plaît voir html source, mechanize log dans mon autre question) mais je reçois seulement la page de connexion à nouveau. Lorsque l'on regarde dans ce que je peux voir que Firefox envoie après avec des paramètres commela différence de paramètres post-forme entre Firefox et Ruby Mechanize

auth_username=myusername&auth_password=mypassword&auth_login=Login mais mon script envoie

auth_username=radek&auth_password=mypassword est ok ou que la partie &auth_login=Login doit être présent?

Quand j'ai essayé d'ajouter à l'aide login_form['auth_login'] = 'Login' je suis une erreur gems/mechanize-0.9.3/lib/www/mechanize/page.rb:13 in méta ': méthode non définie search' for nil:NilClass (NoMethodError)

Il me semble que auth_login est un bouton de formulaire et non un champ (je ne sais pas si ça compte)

[#<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">}> 
] 

mon script est le suivant

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) } 

Vous pouvez trouver plus de code, html, connectez-vous dans mon autre relat ed question

Répondre

0

l'absence d'un paramètre comparer à firefox dans le POST causé mécanisé de ne pas se connecter. Ajout d'un nouveau paramètre résolu ce problème. Donc, il me semble que le serveur web nécessite un paramètre &auth_login=Login pour être en POST.

Vous pouvez lire how to add new field to mechanize form dans une autre question.