2013-09-30 3 views
4

J'essaye d'envoyer un POST en utilisant mécaniser cependant mon code ne fonctionnera pas parfois (et je sais pourquoi). J'ai utilisé la mécanisation, le sergé et les demandes. Avec la mécanisation et les twills, ça marche et avec les demandes ça ne l'est pas. Je le fais probablement mal.Envoi d'un POST avec mécanisation et demandes.

Mon code de mécanisation. Les travaux suivants:

#!/usr/bin/env python 
import sys 
import urllib 
import mechanize 
from mechanize import ParseResponse, urlopen, urljoin 
response = urlopen(url) 
forms = ParseResponse(response, backwards_compat=False) 
form = forms[0] 
form["username"] = "avi" 
form["password"] = "stackoverflow" 
urlopen(form.click()) 

Mon code de sergé. Il fonctionne aussi:

import os 
import twill 
from twill.commands import * 
out = open(os.devnull,"w") 
twill.set_output(out) 
go(url) 
formvalue("1", "username", "avi") 
formvalue("1", "password", "stackoverflow") 
submit() 
go(url2) #some protected page 
content = show() 
print 'content is',content[:100] 

D'après ce que je comprends, mécaniser ou twill première obtient la page, remplit le formulaire et envoie le formulaire. Mais le problème ici est, parfois la page cible affiche une page aléatoire, sans aucun formulaire. Dans ce cas, je reçois une erreur, évidemment parce qu'il n'y a pas de formulaire à montrer. Je ne veux pas gérer cette erreur, car je connais déjà l'URL du message. même si une page aléatoire est affichée, après que je clique sur suivant, le même formulaire est chargé. L'URL POST, les champs restent tous identiques. Je voulais donc envoyer la demande POST directement, puisque je connais déjà tous les détails nécessaires. Voici mon code, based on:

browser = mechanize.Browser() 
parameters = {"username" : "avi", 
      "password" : "stackoverflow", 
     } 
data = urllib.urlencode(parameters) 
browser.open(post_url,data) 
cool = browser.open(post_url + '%s' % data).read() 
print cool 

Je reçois une erreur:

urllib2.URLError: <urlopen error [Errno 61] Connection refused> 

J'ai essayé même chose avec les demandes. Mais je reçois la même erreur que ci-dessus. Voici le code:

import requests 
from requests import session 
payload = { 'username': 'avi','password': 'stackoverflow'} 
url1 = 'http://example.com/login.php' 
url2 = 'http://example.com/protected.php' 

with session() as c: 
    c.post(url1, data=payload) 
    c.get(url2) 

Je fourré ici et là, lisez quelques plus de code disponible en ligne et je pense qu'il ne fonctionne pas parce que, pour éviter les CSRF. Je suis donc allé même avec twill, fait showforms et ai vu il y a une certaine valeur avec jeton:

enter image description here

Voici ce que je veux:

  1. Do POST avec mécaniser et demandes (sans téléchargement la première page)
  2. Comment gérer les jetons CSRF?
  3. Comment déboguer 'erreur urlopen [Errno 61] Connexion refusée'

Répondre

1

Vous doivent récupérer la page du formulaire afin d'obtenir les cookies de session et le jeton CSRF.

L'erreur de connexion refusée est peut-être due au fait que vous avez été bloqué par le site en raison de la publication sur la page de connexion par des moyens automatisés.

+1

Je ne suis pas capable de le faire aussi: http: // pastie.org/8367073 Je reçois la même erreur – avi

+0

@avi sonne comme si votre adresse IP était bloquée. Vous devriez essayer d'un autre hôte ou obtenir une nouvelle adresse IP (c'est-à-dire réinitialiser votre routeur adsl). – Rolando

+0

J'ai essayé, mais pas de succès. Et aussi mon autre code avec twill fonctionne bien – avi

3

Je l'ai utilisé le code ci-dessous avec succès:

params = {u'user_login': self.USER, u'password':self.PASSWORD} 
data = urllib.urlencode(params) 
request = mechanize.Request(loginURL) 
response = mechanize.urlopen(request, data=data) 

Pour traiter la question jeton CSRF, j'ai ajouté la ligne ci-dessous pour mon contrôleur:

skip_before_filter :verify_authenticity_token, :only => [:create] 

Pour garder la session entre les demandes , J'utilise un cookieJar. Mais vous pouvez récupérer le jeton CSRF de votre requête et le conserver dans votre application, en l'ajoutant à chaque nouvelle requête.