Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/12/2014, à 15:38

dva2tlse

[PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Bonjour,
je n'arrive pas à me logger en python à un site web d'où je voudrais par la suite rapatrier quelques informations.
  Il me semble que la partie de page HTML où se tient le formulaire qui attend le login et le mdp est la suivante :

<div class="contentLogin">
        <form action="/login/loginSubmit" method="post" class="memberLogin">
    <table cellpadding="0" cellspacing="0" border="0" >
        <tr>
            <td><label class="color2">Déjà membre</label></td>
            <td>&nbsp;</td>
            <td><input type="text" value="pseudo" class="input" name="login" id="login" /></td>
            <td><input type="password" value="pass" class="input" name="pass" id="pass" /></td>
            <td><input type="submit" value="ok" class="color2 loginSubmit" /></td>
        </tr>
        <tr>
            <td colspan="3"></td>
            <td colspan="2" >
                <a href="#" class="forgotPassword color2" id="forgotPassword">Mot de passe oublié ?</a>
            </td>
        </tr>
    </table>
</form>    </div>

Je veux utiliser le module "requests" du langage python, pour effectuer la requête POST qui devrait me permettre de me connecter au site.
Dans mon code, il y a :

import requests
pars = {'login': 'dva2tlse', 'pass': 'VeryStrong', 'action': 'ChaiPaKoi'}
resp = requests.post("http://www.le_site.com", params=pars)

Mais ça semble ne pas marcher, puisque je ne sais pas quelle action doit être indiqué dans la requête POST. (je ne sais même pas très bien comment utiliser celle ci puisque je ne l'ai jamais fait)
Merci de m'aider à faire fonctionner correctement tout cela,
David

Dernière modification par dva2tlse (Le 31/12/2014, à 15:41)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 29/12/2014, à 16:53

grim7reaper

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Salut,

Je serais toi, je tenterai :

import requests

payload = {'login': 'dva2tlse', 'pass': 'VeryStrong'}
resp = requests.post("http://www.le_site.com/login/loginSubmit", data=payload)

L’attribut action du formulaire c’est où envoyer les données, donc il faut que tu l’ajoutes à ton URL.
Du coup, en arguments tu as seulement login et pass.
Dernière note, il faut pas passer ton payload en tant que params mais en tant que data.

J’espère que ça va fonctionner (pas pu tester vu que je ne sais pas de quel site il s’agit), cela dit il est probable que tu doives aussi jouer avec les cookies pour t’authentifier.

Hors ligne

#3 Le 29/12/2014, à 17:12

dva2tlse

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Oui merci, ça marche comme ça; enfin je me retrouve avec un status_code de 200, après cette opération POST qui devrait me logger sur le site; Y a-t'il un autre moyen d'en être sûr ?
J'ai essayer de lire une autre page, qui requiert que l'on soit loggé, "http://www.le_site.com/friends" mais ça ne donne rien d'intéressant; donc je doute.

EDIT: je ne sais même pas comment aller lire la sous-page interne au site :
au tout début, j'ai :
  resp = requests.get(url) # Sends a GET request. Returns Response object -------------- et ça ne sert peut-être à rien
puis :
resp2 = requests.post("http://example.com/login/loginSubmit", params=pars2)
et enfin
resp3 = requests.get("http://example.com/friends")

Mais comment puis-je vérifier ce qu'il se passe au fur et à mesure ?

EDIT2: je viens de lire la fin de ton post que j'avais zappée, en effet, il me faudra probablement dealer avec les cookies.
Pobablement avec s=requests.session(), mais je ne sais pas encore du tout à quoi ça va ressembler finalement.

Dernière modification par dva2tlse (Le 29/12/2014, à 18:16)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#4 Le 29/12/2014, à 19:10

grim7reaper

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

dva2tlse a écrit :

Oui merci, ça marche comme ça; enfin je me retrouve avec un status_code de 200, après cette opération POST qui devrait me logger sur le site; Y a-t'il un autre moyen d'en être sûr ?

Un bon moyen c’est d’afficher resp.content qui va contenir le code HTML envoyé en réponse (tu peux l’enregistrer dans un fichier puis l’ouvrir avec Firefox (ou autre navigateur Web) pour mieux visualiser).

dva2tlse a écrit :

J'ai essayer de lire une autre page, qui requiert que l'on soit loggé, "http://www.le_site.com/friends" mais ça ne donne rien d'intéressant; donc je doute.

Probablement un problème de cookie alors.

dva2tlse a écrit :

EDIT: je ne sais même pas comment aller lire la sous-page interne au site :
au tout début, j'ai :
  resp = requests.get(url) # Sends a GET request. Returns Response object -------------- et ça ne sert peut-être à rien
puis :
resp2 = requests.post("http://example.com/login/loginSubmit", params=pars2)
et enfin
resp3 = requests.get("http://example.com/friends")

Mais comment puis-je vérifier ce qu'il se passe au fur et à mesure ?

Oui, la première requête me semble inutile.
Attention, dans la seconde tu utilises encore params=.
Pour voir au fur et à mesure, tu peux afficher le content comme je le disais plus haut.

dva2tlse a écrit :

EDIT2: je viens de lire la fin de ton post que j'avais zappée, en effet, il me faudra probablement dealer avec les cookies.
Pobablement avec s=requests.session(), mais je ne sais pas encore du tout à quoi ça va ressembler finalement.

C’est pas si compliqué que ça wink
En gros, il suffit de faire :

r = requests.post("http://example.com/login/loginSubmit", data=pars2)
cookies = r.cookies
r = requests.get("http://example.com/friends", cookies=cookies)

Sinon, je ne sais pas dans quelle mesure ça peut t’aider mais ljere avait fait un script qui, entre autres, se connectait au forum. Ça peut peut-être t’inspirer smile

Hors ligne

#5 Le 30/12/2014, à 11:43

dva2tlse

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Bonjour grimp7reaper,
j'en suis à essayer de lire les réponses qui me reviennent des requêtes POST pour essayer de comprendre ce qu'il se passe. J'ai réussi à en stocker une dans un fichier avec le code suivant, extraordinairement compliqué pour moi : (je ne connais que le fortran)

NomFichier = 'resp2.txt'
# création et ouverture du fichier resp2.txt en mode write 'w' (écriture)
# si le fichier test.txt existe déjà, il est écrasé
Fichier = open(NomFichier, 'w')      # instanciation de l'objet Fichier de la classe file
# écriture dans le fichier avec la méthode write()
Fichier.write(resp2.text.encode('utf8'))
# fermeture du fichier avec la méthode close()
Fichier.close()

Mais ce qu'il se passe quand j'essaye de le lire,

firefox resp2.txt &

hébin je me retrouve avec du code html assez incompréhensible pour moi, qui commence par :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <title>...

Est-ce qu'il faut enlever ou commenter (et comment) la première ligne pour que mon firefox le représente bien comme une page html et que je puisse essayer de comprendre ce qu'il s'est passé ?
Merci de m'aider encore,
David

EDIT À PEINE APRES :
Je suis un gros nââze, mon fichier portait l'extention ".txt" au lieu de ".html", donc FF l'ouvrait comme du texte, GRRR kilekon.

Dernière modification par dva2tlse (Le 30/12/2014, à 12:45)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#6 Le 30/12/2014, à 13:21

grim7reaper

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Oui, il suffit de donner l’extension en .html

Sinon, un autre truc qui me vient à l’esprit c’est que le site tient peut-être compte de l’User-Agent aussi (certains sites font ça).
Par exemple, pour te faire passer pour Iceweasel (le Firefox de Debian), tu peux faire un truc du genre :

user_agent = {'User-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0 Iceweasel/34.0'}
r = requests.post("http://example.com/login/loginSubmit", headers = user_agent, data=pars2)

Si ce n’est pas indiscret, tu essayes de te connecter à quel site (si tu veux/peux pas le dire, pas de problème smile) ?

Hors ligne

#7 Le 31/12/2014, à 10:20

dva2tlse

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Non je ne peux pas répondre parce que j'ai des hackers chinois du FBI qui sont à mes trousses, donc motus...

Par contre, en regardant avec mon firefox la dernière page html que me renvoie le site, je m'aperçois que c'est une page d'erreur qui me demande de remplir les champs "pseudo" et "mot de passe" d'un deuxième formulaire nommé "/login/loginSubmit" (comme le premier, pour lequel j'avais déjà envoyé une requête POST, qui semble n'avoir pas été honorée), et qui est à remplir pour se connecter, en fournissant un "login" et un "pass", comme d'après le code ci dessous que j'ai extrait de la page :

            <td><input type="text" value="pseudo" class="input" name="login" id="login" /></td>
            <td><input type="password" value="pass" class="input" name="pass" id="pass" /></td>

Mais nouveau problème : ma requête est :

resp2 = sess2.post(url2, data=pars2) # Sends a POST request. Returns Response object

avec :

pars2 = dict(login = login, password = password)

Or le formulaire demande une variable nommée "pass" en second, et si je fais la requête POST avec une telle variable "pass" :

pars2 = dict(login = login, pass = password)

Alors le script python ne s'exécute plus pour la raison suivante :

david@test:~/HHH/PYTHON$ python 02AuthCook.py|m
  File "02AuthCook.py", line 30
    pars2 = dict(login = login, pass = password)
                                   ^
SyntaxError: invalid syntax
david@test:~/HHH/PYTHON$ 

Comment lever ce Pb de syntaxe ?
David

EDIT: Ok pour la sytaxe de "password" bien que le formulaire ne demande que "pass", et ça va jusqu'au bout sans erreur de python, mais je ne suis toujours pas loggé sur le site.

EDIT2: C'était juste la syntaxe de mon dictionnaire de valeurs passées à la requête POST qui n'était pas bonne; il fallait mettre :

pars = { 'login': 'dva2tlse', 'pass': password }

Dernière modification par dva2tlse (Le 31/12/2014, à 11:23)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#8 Le 31/12/2014, à 16:18

dva2tlse

Re : [PAS RÉSOLU] Se logger sur un site web en python par une requête POST

Hébé non, en fait le pb n'est pas résolu...
-Il semblerait que le code passe bien la première phase d'identification, puisque la page que j'enregistre après la requête POST d'identification initiale pour pouvoir la consulter à ma guise, me montre bien certaines informations personnelles qui prouvent que je suis bel et bien identifié correctement sur le serveur.
-par contre, je n'ai pas la totalité de la page d'accueil, et lors d'une deuxième requête, par un GET, sur une page interne au site à laquelle je devrais avoir accès maintenant que je suis identifié, je n'en ai qu'une partie également, le fond de page qui dont être constant sur tout le site une fois que l'on est identifié.
Que peut il se passer ?
David

EDIT  jeudi 1er janvier 2015 : (bonne année à tous)

Il me reste à regarder tous les objets "fils" de la page :
À la base j'ai :

password = 'VeryStrong'
sess = requests.Session()
user_agent = {'User-agent': 'Mozilla/5.0'}
pars11 = { 'login': 'dva2tlse', 'pass': password }
url11 = "http://www.truc-truc.com/login/loginSubmit"
resp11 = sess.post(url11, data=pars11) # Sends a POST request. Returns Response object
url12 = "http://www.truc-truc.com/home"
resp12 = sess.get(url12)

Il y a aussi comme "fils" d'un "Response object" comme le sont resp11 et resp12 :
resp11.content
resp11.headers
resp11.read (pas encore sûr que ça existe)
resp11.status_code
resp11.text
resp11.url

EDIT2 :
Peut-être qu'il y a des histoires de redirections que je devrais peut-être autoriser dans des heaaders que j'enverrai chaipakan, mais c'est flou pour moi; qu'en faire ?

Dernière modification par dva2tlse (Le 01/01/2015, à 11:04)


xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne