J'essaie de vous connecter à un site Web pour effectuer des travaux de bricolage à l'aide de Python et demande une bibliothèque, j'essaie ce qui suit (ce qui ne fonctionne pas):
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}
In [12]: r = requests.post('https://admin.example.com/login.php',headers=headers,data=payload)
Mais bon, obtenir une redirection vers la page de connexion. Dois-je ouvrir une session? est-ce que je fais une mauvaise demande POST, dois-je charger les cookies? ou la session se fait-elle automatiquement? Je suis perdu ici, de l'aide et des explications sont nécessaires.
Le site Web que je tente de connecter est php. Dois-je "capturer le cookie set et définir l'en-tête du cookie"? Si oui, je ne sais pas comment le faire. La page Web est un formulaire avec les éléments suivants (si cela peut aider): entrée: nom d'utilisateur '' mot de passe '' 'id': 'myform', 'action': "login.php
Quelques informations supplémentaires, peut-être que vous pouvez voir ce qui me manque ici ..
In [13]: r.headers
Out[13]: CaseInsensitiveDict({'content-encoding': 'gzip', 'transfer-encoding': 'chunked',
'set-cookie': 'PHPSESSID=v233mnt4malhed55lrpc5bp8o1; path=/',
'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'vary': 'Accept-Encoding', 'server': 'nginx',
'connection': 'keep-alive', 'pragma': 'no-cache',
'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
'date': 'Tue, 24 Dec 2013 10:50:44 GMT', 'content-type': 'text/html'})
In [14]: r.cookies
Out[14]: <<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='PHPSESSID',
value='v233mnt4malhed55lrpc5bp8o1', port=None, port_specified=False, domain='admin.example.com',
domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False,
expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]>
J'apprécierais vraiment l'aide, merci!
mise à jour, avec réponse grâce à atupal:
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'usr','pass':'123'}
link = 'https://admin.example.com/login.php'
session = requests.Session()
resp = session.get(link,headers=headers)
# did this for first to get the cookies from the page, stored them with next line:
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
resp = session.post(link,headers=headers,data=payload,cookies =cookies)
#used firebug to check POST data, password, was actually 'pass', under 'net' in param.
#and to move forward from here after is:
session.get(link)
Vous pouvez utiliser l'objet Session
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}
session = requests.Session()
session.post('https://admin.example.com/login.php',headers=headers,data=payload)
# the session instance holds the cookie. So use it to get/post later.
# e.g. session.get('https://example.com/profile')
Envoyer une demande POST avec le type de contenu = 'formulaire-données':
import requests
files = {
'username': (None, 'myusername'),
'password': (None, 'mypassword'),
}
response = requests.post('https://example.com/abc', files=files)
J'avais des problèmes ici (c'est-à-dire l'envoi de données de formulaire lors du téléchargement d'un fichier) jusqu'à ce que j'utilise ce qui suit:
files = {'file': (filename, open(filepath, 'rb'), 'text/xml'),
'Content-Disposition': 'form-data; name="file"; filename="' + filename + '"',
'Content-Type': 'text/xml'}
C'est l'entrée qui a fini par travailler pour moi. Dans Chrome Outils de développement -> onglet Réseau, j'ai cliqué sur la demande qui m'intéressait. Dans l'onglet En-têtes, il y a une section Données du formulaire, qui affiche à la fois Contenu-Disposition et Contenu- Les en-têtes de type sont définis ici.
Je n'ai PAS eu besoin de définir des en-têtes dans la commande réelle requests.post () pour que cela réussisse (leur inclusion a effectivement causé l'échec)