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:
Voici ce que je veux:
- Do POST avec mécaniser et demandes (sans téléchargement la première page)
- Comment gérer les jetons CSRF?
- Comment déboguer 'erreur urlopen [Errno 61] Connexion refusée'
Je ne suis pas capable de le faire aussi: http: // pastie.org/8367073 Je reçois la même erreur – avi
@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
J'ai essayé, mais pas de succès. Et aussi mon autre code avec twill fonctionne bien – avi