Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2997 connectés 

  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Problème de connection à site web

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de connection à site web

n°1566020
esox_ch
Posté le 28-05-2007 à 09:20:58  profilanswer
 

Bonjour,
 
Je suis en train d'écrire un petit script ruby qui doit se connecter automatiquement à une URL et me donner le code HTML de la page
Ce que je fais de la manière suivante :  
 

Code :
  1. require 'net/http'
  2. require 'uri'
  3. res = Net::HTTP.post_form(URI.parse('https://www.site.com?uri=argument'),
  4.                                {'field1'=>'no',
  5.                                 'field2'=>'mobile',
  6.                                 'field3'=>'/do/now',
  7.                                 })
  8. puts res.body


 
Avec ruby1.8 j'obtiens l'erreur :  

Citation :


$ ruby test.rb  
/usr/lib/ruby/1.8/net/http.rb:2019:in `read_status_line': wrong status line: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">" (Net::HTTPBadResponse)
        from /usr/lib/ruby/1.8/net/http.rb:2006:in `read_new'
        from /usr/lib/ruby/1.8/net/http.rb:1047:in `request'
        from /usr/lib/ruby/1.8/net/http.rb:405:in `post_form'
        from /usr/lib/ruby/1.8/net/http.rb:543:in `start'
        from /usr/lib/ruby/1.8/net/http.rb:404:in `post_form'
        from test.rb:4


 

Citation :


Avec ruby1.9
$ ruby1.9 test.rb  
/usr/lib/ruby/1.9/net/http.rb:1473:in `sprintf': invalid value for Integer: "/" (ArgumentError)


Et si j'enlève l'élément "field3" de l'array ça tombe sur l'erreur de ruby 1.8
 
Est-ce que qqn pourrait m'éclairer? Parce que je comprend pas trop où est-ce que je me plante


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
mood
Publicité
Posté le 28-05-2007 à 09:20:58  profilanswer
 

n°1566092
masklinn
í dag viðrar vel til loftárása
Posté le 28-05-2007 à 12:05:48  profilanswer
 

Chez moi ça marche en tapant sur le login de HFR


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1566102
esox_ch
Posté le 28-05-2007 à 12:27:43  profilanswer
 

Salut,
 
Je viens de tester avec plusieurs sites et obtiens cette erreur uniquement quand il faut utiliser https et non http ... Pourtant dans la doc je n'ai rien vu qui dise qu'on peut pas utiliser ça pour du https (sinon je comprend pas trop l'utilité de la methode use_ssl?)

n°1566120
Kid_Paddle
Posté le 28-05-2007 à 13:05:04  profilanswer
 

Code :
  1. require 'net/https'
  2.  
  3. http = Net::HTTP.new('www.site.com', 443)
  4. http.use_ssl = true
  5. http.start do |http|
  6.  req = Net::HTTP::Get.new('/')
  7.  res = http.request(req)
  8.  puts res.body
  9. end


faut faire avec un truc de ce genre


Message édité par Kid_Paddle le 28-05-2007 à 15:45:10
n°1566124
esox_ch
Posté le 28-05-2007 à 13:18:19  profilanswer
 

irb(main):001:0> require 'net/https'
LoadError: no such file to load -- net/https
        from (irb):1:in `require'
        from (irb):1
 
En googlant j'ai pas trouvé où télécharger ça ... Car NET/HTTPS ne semble pas exister dans le package par defaut de Ruby (à en croire la doc)

n°1566144
Kid_Paddle
Posté le 28-05-2007 à 14:09:32  profilanswer
 

http://www.ruby-doc.org/core/classes/Net/HTTP.html tout en haut (c'est dans l'api core)
mais effectivement, la doc est pas très explicite, et ça n'apparait pas dans la doc de l'api standart :/

n°1566192
esox_ch
Posté le 28-05-2007 à 15:05:45  profilanswer
 

Effectivement c'est moyen :/
Mais ça marche toujours pas :/ :
 

Code :
  1. irb(main):001:0> require 'net/https'
  2. => true
  3. irb(main):002:0>  http = Net::HTTP.new('sourceforge.net/projects/e17genmenu/index.php',443)
  4. => #<Net::HTTP sourceforge.net/projects/e17genmenu/index.php:443 open=false>
  5. irb(main):003:0>    http.use_ssl = true
  6. => true
  7. irb(main):004:0>    http.start
  8. SocketError: getaddrinfo: Name or service not known
  9.         from /usr/lib/ruby/1.8/net/http.rb:560:in `initialize'
  10.         from /usr/lib/ruby/1.8/net/http.rb:560:in `open'
  11.         from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
  12.         from /usr/lib/ruby/1.8/timeout.rb:48:in `timeout'
  13.         from /usr/lib/ruby/1.8/timeout.rb:76:in `timeout'
  14.         from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
  15.         from /usr/lib/ruby/1.8/net/http.rb:553:in `do_start'
  16.         from /usr/lib/ruby/1.8/net/http.rb:548:in `start'
  17.         from (irb):4


Message édité par esox_ch le 28-05-2007 à 15:10:22

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1566202
Kid_Paddle
Posté le 28-05-2007 à 15:15:35  profilanswer
 

normal, le constructeur de Net::HTTP prends en paramètre le serveur
donc tu dois faire :

Code :
  1. require 'net/https'
  2. http = Net::HTTP.new('sourceforge.net', 443)
  3. http.use_ssl = true
  4. http.get('/projects/e17/genmenu/index.php')

n°1566212
esox_ch
Posté le 28-05-2007 à 15:25:43  profilanswer
 

D'accord compris, merci beaucoup
Par contre pour que ça marche j'ai du remplacer :

Code :
  1. request = Net::HTTP::Get.new('/mapage.php')
  2.      res = http.get(request)


 
Par
 

Code :
  1. res = http.get('/mapage.php')


 
Maintenant ça marche nikel, merci. Je vais m'attaquer à l'envoi du formulaire maintenant, en espérant que ça se passe sans trop de problèmes

n°1566225
Kid_Paddle
Posté le 28-05-2007 à 15:34:20  profilanswer
 

les 2 sont valables, la première permet simplement d'utiliser l'authentificaiton http ;)
edit : en fait, c'est parcequ'il fallait faire

Code :
  1. res = http.request(request)


Message édité par Kid_Paddle le 28-05-2007 à 15:34:59
mood
Publicité
Posté le 28-05-2007 à 15:34:20  profilanswer
 

n°1566295
esox_ch
Posté le 28-05-2007 à 17:18:42  profilanswer
 

Donc nouveau problème :/
J'arrive à envoyer correctement les informations avec post + form_data mais voilà le site me renvoie un cookie afin de m'identifier, et apparemment Ruby ne le stoque pas (j'ai testé en local un petit script php qui me l'a confirmé). Comment faire pour que si le serveur envoie un cookie à ruby, il le stoque et l'utilise dans le get suivant?
Ce que j'essaie de faire là en fait est d'émuler le comportement d'un navigateur normal afin d'automatiser certaines procédures

n°1566297
phosphorel​oaded
Posté le 28-05-2007 à 17:23:14  profilanswer
 

libcurl pour Ruby? :D
Ca existe en standalone, en PHP et d'autres. Pour Ruby je sais pas et je sais pas si c'est utile mais c'est une lib bien répandue en tout cas.


Message édité par phosphoreloaded le 28-05-2007 à 17:23:58
n°1566308
esox_ch
Posté le 28-05-2007 à 17:39:32  profilanswer
 

J'avais cherché mais j'avais lu sur un forum que ruby savait faire pareil mais en mieux ...

n°1566314
IrmatDen
Posté le 28-05-2007 à 17:48:40  profilanswer
 

Salut,
 
Pour ce qui est de la navigation, j'ai opté pour mechanize qui se base sur hpricot. Peut-être l'un des 2 te suffira?

n°1566321
esox_ch
Posté le 28-05-2007 à 18:02:17  profilanswer
 

Ok merci...
Là je tente de voir si j'y arrive avec Curl vu que j'avais déjà utilisé avant, après si je m'en sors pas j'irai voir mechanize ou hpricot ... Quels sont leurs benefices face à libcurl au fait?

n°1566327
IrmatDen
Posté le 28-05-2007 à 18:13:08  profilanswer
 

Je ne connais libcurl qu'en C, donc je sais pas si c'est très correct comme comparaison :D
mechanize te permet d'obtenir quasiment le comportement d'un navigateur. Tu peux poster des formulaires très simplement, et si tu as besoin de parser la page à la recherche d'une info bien précise, tu peux te baser sur hpricot avec ses xpath.
Libcurl telle que je la connais est beaucoup plus bas niveau.

 

Exemple d'un code que j'utilise:

Code :
  1. $agent = WWW::Mechanize.new
  2.  class LoginPage
  3.    @@UrlExtension = '?page=login/index'
  4.    @@LoginFormName = 'form'
  5.    @@Identifier = 'Login'
  6.    
  7.    # Try to log into <mysite> using the login and password provided as parameters
  8.    # Return true if successful, false otherwise
  9.    def login
  10.      li = LoginInfo.instance
  11.      
  12.      # load and fill the login form
  13.      ## Le couple (BASE_URL + @@UrlExtension) forme une extension https tout ce qu'il y a de plus classique
  14.      page = $agent.get(BASE_URL + @@UrlExtension)
  15.  
  16.      # je récupère et remplit le formulaire
  17.      login_form = page.form(@@LoginFormName)
  18.      login_form.user_name = li.login
  19.      login_form.user_pass = li.password
  20.  
  21.      # et je soumets
  22.      testPage = $agent.submit(login_form)
  23.      
  24.      # Look if there still is the 'Login' button after submit, thus proving that login was unsuccessful
  25.      if isLoginPage(testPage)
  26.          puts 'Error: can\'t login in <mysite>'
  27.          Process.exit
  28.      end
  29.      
  30.      # Reaching this statement means we succesfully logged in
  31.      return true
  32.    end # login Function
  33.    
  34.    # Return true if the page parameter is a login page, false otherwise
  35.    def isLoginPage(page)
  36.      testSubmitValue = (page/'/html/body/form/table/tr[4]/td/input')
  37.      if testSubmitValue.any?
  38.        if testSubmitValue.first['value'] = @@Identifier
  39.          return true
  40.        end
  41.      end
  42.      
  43.      # Reaching this statement means the page doesn't contain the login button
  44.      return false
  45.    end # isLoginPage function
  46.    
  47.  end # LoginPage class


Les lignes les plus pertinentes sont celles qui utilisent $agent qui représente le "navigateur". Par contre, je ne te garantis pas que ce code soit très clean niveau Ruby vu que je debute et que j'ai du mal avec certains concepts ;)

 

Edit: oups, une info qui traîne...


Message édité par IrmatDen le 28-05-2007 à 18:13:44
n°1566330
esox_ch
Posté le 28-05-2007 à 18:25:33  profilanswer
 

je suis en train de lire la doc pour mechanize (qui fourni même un mini tuto :D) et effectivement c'est exactement ce que je cherchais ... Je pensais même pas que quelqu'un c'était amusé à faire un truc de ce genre ...  
Merci beaucoup

n°1566365
esox_ch
Posté le 28-05-2007 à 20:11:01  profilanswer
 

Je suis en train de tester mechanize et effectivement c'est super.
Il y a juste un truc que j'arrive pas à comprendre, c'est l'utilisation de set_fields().
J'ai plusieurs champs et aimerais éviter de devoir me taper X fois la ligne form.noDuChamp = valeur , apparemment set_fields sert justement à ça ... Mais quand j'essaie de faire  

Code :
  1. dataToSubmit = {
  2.                              'champ.1'='test',
  3.                              'champ.2'='test'
  4. }
  5. myform.set_fields(dataToSubmit)


 
Il crie .. Est-ce  que tu sais pourquoi?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°1566376
IrmatDen
Posté le 28-05-2007 à 20:25:18  profilanswer
 

Je ne me suis pas servi de cette fonction, mais je pense que c'est juste dû à la syntaxe utilisé pour le tableau. Ce devrait plutôt être quelque chose comme ça:

Code :
  1. dataToSubmit = {
  2.    'champ.1'=>'test',
  3.    'champ.2'=>'test'
  4. }
  5.    
  6. myform.set_fields(dataToSubmit)
 


Edit: c'est moi ou le texte entre quote n'est pas compté comme texte par le parser??


Message édité par IrmatDen le 28-05-2007 à 20:25:56
n°1566392
esox_ch
Posté le 28-05-2007 à 21:08:07  profilanswer
 

C'est une faute d'écriture, j'ai effectivement mis des => dans le tableau. Par contre je viens de trouver comment ça marche :
 

Code :
  1. dataToSubmit = {
  2. :champ => 'test',
  3. :champ1 => 'test1'
  4. }
  5. myform.set_fields(dataToSubmit)


Maintenant 2 questions :  
1: Pourquoi :champ et pas 'champ' ? J'ai beau regarder le code de set_fields je ne comprend pas
2: Comment je fais si j'ai un field qui s'appelle champ.1 pour qu'il n'interprete pas le point comme le signe orienté objet?
 
Merci

n°1566393
IrmatDen
Posté le 28-05-2007 à 21:10:12  profilanswer
 

Désolé, tu dépasses le peu que je sais de cette lib [:ddr555]

n°1566411
masklinn
í dag viðrar vel til loftárása
Posté le 28-05-2007 à 21:52:09  profilanswer
 

esox_ch a écrit :

C'est une faute d'écriture, j'ai effectivement mis des => dans le tableau. Par contre je viens de trouver comment ça marche :
 

Code :
  1. dataToSubmit = {
  2. :champ => 'test',
  3. :champ1 => 'test1'
  4. }
  5. myform.set_fields(dataToSubmit)


Maintenant 2 questions :  
1: Pourquoi :champ et pas 'champ' ? J'ai beau regarder le code de set_fields je ne comprend pas


Tu peux pas utiliser les deux indifférement?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1566418
esox_ch
Posté le 28-05-2007 à 22:23:39  profilanswer
 

Si mais ça marche quand même pas si je fais champ.2 ... Le fait de le mettre entre '' n'est pas censé dire à l'interpréteur qu'il ne faut pas considérer ça comme du ruby mais comme un string (comme en php quoi) ?

n°1566420
masklinn
í dag viðrar vel til loftárása
Posté le 28-05-2007 à 22:27:41  profilanswer
 

esox_ch a écrit :

Si mais ça marche quand même pas si je fais champ.2 ... Le fait de le mettre entre '' n'est pas censé dire à l'interpréteur qu'il ne faut pas considérer ça comme du ruby mais comme un string (comme en php quoi) ?


Si, après il est possible qu'il balance un #to_sym mais ça ne devrait pas poser de problème.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1566438
Kid_Paddle
Posté le 28-05-2007 à 23:07:20  profilanswer
 

masklinn a écrit :

Tu peux pas utiliser les deux indifférement?


ça c'est uniquement dans Rails avec des HashWithIndifferentAccess ;)

n°1566451
esox_ch
Posté le 28-05-2007 à 23:37:15  profilanswer
 

Code :
  1. irb(main):020:0> login_form.set_fields('test.1'=>"0" )
  2. NoMethodError: undefined method `value=' for nil:NilClass
  3.         from /usr/lib/ruby/1.8/mechanize/form.rb:269:in `set_fields'
  4.         from /usr/lib/ruby/1.8/mechanize/form.rb:262:in `each'
  5.         from /usr/lib/ruby/1.8/mechanize/form.rb:262:in `set_fields'
  6.         from (irb):20


 
Où est-ce que je me plante?

n°1568332
esox_ch
Posté le 31-05-2007 à 22:38:49  profilanswer
 

Donc au final je suis arrivé à me connecter convenablement  
 
(pour le problème que j'ai eu au post plus haut, j'ai vu que le champs en question était facultatif ... Je chercherai comment le faire passer quand j'aurai le temps :D)
 
Par contre j'ai un autre petit soucis. Voilà ce que me répond le serveur quand j'envoie le form avec FF :
 

Code :
  1. HTTP/1.x 200 OK
  2. Date: Thu, 31 May 2007 20:30:39 GMT
  3. Server: Apache
  4. Content-Type: text/html; charset=utf-8
  5. X-ContentSig: adsasdfasgkls ejjklsdfcvjklflvgjdbvklgjdfkljbgxfcv
  6. Content-Length: 23485
  7. Cache-Control: private
  8. newphoton.pmb: iQA/AwUAQsLG7k24PFrR40f5EQI2AwCglW5KqxaC1+K55Ls8I9/10v5rlJwAnjksEnObcO0wsyhSJRwDCah2J9+l
  9. X-AspNet-Version: 1.1.4322
  10. X-Rim-Content-Location: /appdata/rim/idlescreen/carrier/idle
  11. X-Powered-By: ASP.NET
  12. Keep-Alive: timeout=5, max=10
  13. Connection: Keep-Alive


 
Ce qui m'embête surtout c'est le newphoton.pmb ... Parce que après cette page mon FF se balade sur 2 autres pages tout seul en ramassant plusieurs cookies à la chaine avant d'arriver à la page qui m'interesse .... Et bien entendu Mechanize se perd en route ... À votre avis ce pmb peut être une fausse image envoyée au navigateur qui, une fois loadée, lui fait faire les redirections ?

n°1568882
KangOl
Profil : pointeur
Posté le 02-06-2007 à 00:53:39  profilanswer
 

voici comment j'ai fait pour récupérer un cookie avec Net::HTTP  
(snippet de login sur un punbb)
 

Code :
  1. http = Net::HTTP.new(SERVER)
  2. login_url = "#{SUBDIR}login.php?action=in";
  3.  
  4. # POST request -> logging in
  5.  
  6. login_qs = "form_sent=1&redirect_url=index.php&req_username=#{LOGIN}&req_password=#{PASS}"
  7. headers = {
  8.  'Content-Type' => 'application/x-www-form-urlencoded'
  9. }
  10.  
  11. resp, data = http.post(login_url, login_qs, headers)
  12. cookie = resp.response['set-cookie'];
  13.  
  14. if cookie.nil?
  15.     puts 'Oops ! bad password or login.'
  16.     exit 0;
  17. end;
  18.  
  19. headers['Cookie'] = cookie
  20.  
  21. # we are now logged...
  22. puts "logged on #{SERVER} as #{LOGIN}"
  23. puts

n°1568899
esox_ch
Posté le 02-06-2007 à 08:28:17  profilanswer
 

Oui mais les cookies sont bien mémorisés (Mechanize s'en occupe et ça a l'air de marcher comme il faut)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ruby/Rails

  Problème de connection à site web

 

Sujets relatifs
Petite horloge toute con sur un site[Résolu] problème avec Switch et MySQL
Problème de requetes imbriquéesProbleme de configuration PHP pour fonction exec("")
[RESOLU] Problème avec la fonction mail()probleme egalité de deux double
Problème d'ajout dans un arrayLimitation de connection
Probleme d'utilisation de l'API C de mysql sous linuxProblème de connection/session avec un site
Plus de sujets relatifs à : Problème de connection à site web


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR