Forum général.hors-sujets Poster sur la tribune en Python (3)

Posté par  . Licence CC By‑SA.
Étiquettes :
-1
8
juil.
2014

Bonjour,

Je souhaite programmer un bot pour la tribune. Récupérer les posts ne me pose pas de problème mais la méthode à employer pour poster représente pour moi un travail que je ne crois pas pouvoir réaliser seul.

Dans un premier temps je n'essaye pas de poster mais de récupérer l'index de la tribune en étant authentifié.

Voici le code que je test, c'est inspiré d'un exemple trouvé sur stackoverflow (pour les commentaires…) :

from http.client import HTTPSConnection
from base64 import b64encode

from config import *
from log    import *

#This sets up the https connection
c = HTTPSConnection(NAME)
#we need to base 64 encode it 
#and then decode it to acsii as python 3 stores it as a byte string
auth = LOGIN+":"+PASS
auth_b = bytes(auth, "utf-8")
userAndPass = b64encode(auth_b).decode("ascii")
headers = { 'Authorization' : 'Basic %s' %  userAndPass }
#then connect
c.request('GET', '/'+PAGE, headers=headers)
#get the response back
res = c.getresponse()
# at this point you could check the status etc
# this gets the page text
data = res.read()

print (headers)
print (res.headers)
print (data.decode("utf-8"))

Les variables LOGIN & PASS sont mes identifiant (créés pour l'occasion…) sur le site linuxfr.org

le reste des variables utilisées :

NAME  = "linuxfr.org"
PAGE  = "board"

et voici la sortie (tronquée) produite par celui-ci :

{'Authorization': 'Basic R3J1bXB5QmVhcjo0N2F2MTI='}
Server: nginx/1.2.1
Date: Tue, 08 Jul 2014 20:42:21 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=5
Status: 200 OK
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Served-By: 26038
X-Revision: 02ef1c2697abd7765483ff8c897fea909d8aa2f7
ETag: "3ef6beb60f30f90505ea5b18a3b25c7f"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 07c874a9-5664-45fb-a9b7-f17a02ec8c20
X-Runtime: 0.069802
X-Content-Type-Options: nosniff


<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Tribune - LinuxFr.org</title>
<link href="/assets/application-fcac7918b49e67d32db2e90c444fcd8b.css" rel="stylesheet" />
[…]
<div class="login box">
<h1>Se connecter</h1>
<script>
  if (location.protocol == 'http:') {
    document.write('<a class="insecure" title="Accès en clair, non sécurisé" href="https://' + location.hostname + location.pathname + '">Accès en clair (http)</a>');
  } else {
    document.write('<a class="secure" title="Accès sécurisé">Accès sécurisé (https)</a>');
  }
</script>
<div class="new_content">
<a href="/proposer-un-contenu">Proposer un contenu</a>
</div>
<form accept-charset="UTF-8" action="/compte/connexion" class="new_account" id="new_account_sidebar" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /></div><p>
<label for="account_login_sidebar">Identifiant</label>
<input id="account_login_sidebar" name="account[login]" placeholder="Identifiant" required="required" size="20" type="text" />
</p>
<p>
<label for="account_password_sidebar">Mot de passe</label>
<input id="account_password_sidebar" name="account[password]" placeholder="Mot de passe" required="required" size="20" type="password" />
</p>
<p>
<input name="account[remember_me]" type="hidden" value="0" /><input id="account_remember_me_sidebar" name="account[remember_me]" type="checkbox" value="1" />
<label for="account_remember_me_sidebar">Connexion automatique</label>
</p>
<p>
<input id="account_submit_sidebar" name="commit" type="submit" value="Se connecter" />
</p>
</form>


<ul>
<li><a href="/compte/inscription">Pas de compte&nbsp;? S'inscrire&nbsp;!</a></li>
</ul>
</div>
[…]

Si on regarde le code HTML renvoyé on voit que le formulaire de connexion est présenté, ce qui signifie que mon client n'est pas authentifié.

Comment dois-je m'y prendre ?

Je suppose qu'il me faut gérer les cookies afin de m'authentifier.

J'attends vos commentaires avec impatience.

  • # Question subsidiaire

    Posté par  . Évalué à 2.

    Est-ce que d'un point de vue sécurité je prends le risque de ma faire hijacker ma session en postant en clair la réponse du serveur, notamment :

    ETag: "3ef6beb60f30f90505ea5b18a3b25c7f"
    

    ?

  • # Début de réponse

    Posté par  . Évalué à 2.

    Je pense que j'ai un début de réponse pour les cookies : https://linuxfr.org/wiki/tribune :)

    • [^] # Re: Début de réponse

      Posté par  . Évalué à 3.

      Oui, il faut gérer les cookies pour poster sur le site. Mais ce n'est qu'un header de la requête post, ce n'est pas compliqué à gérer. Tu change ta ligne de header en

      headers = { 'Authorization' : 'Basic %s' %  userAndPass, 'Cookie' :  'linuxfr.org_session=%s' % cookie }

      Et ça devrait marcher.

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Début de réponse

        Posté par  . Évalué à 3.

        Et tu n'as pas besoin de la partie Authorization en fait.

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: Début de réponse

          Posté par  . Évalué à 2.

          Il faut bien que j'envoie mes identifiants à un moment ou un autre pour que le serveur m'envoie mon cookie de session, non ?

          J'ai rien compris ?

          • [^] # Re: Début de réponse

            Posté par  . Évalué à 4.

            Il faut bien que j'envoie mes identifiants à un moment ou un autre pour que le serveur m'envoie mon cookie de session, non ?

            Oui, mais ça ne se fait pas avec de l'Auth Basic mais en remplissant le formulaire de login. Il s'agit donc d'un POST avec le login, le mot de passe et peut-être quelques autres paramètres.

            « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

            • [^] # Re: Début de réponse

              Posté par  . Évalué à 2.

              OK ! Merci je crois que j'ai compris. Je vais tester ça quand j'aurai un peu de temps.

              • [^] # Re: Début de réponse

                Posté par  . Évalué à 3.

                Je te conseil l'onglet réseau du débugger intégré à ton navigateur favoris. Ça te permettra de générer facilement des requêtes correctes.

                « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

      • [^] # Re: Début de réponse

        Posté par  . Évalué à 2.

        Merci pour ta réponse. J'ai fait quelques tests, j'ai encore des questions :)

        Je suppose qu'en me connectant avec mon brouteur sur linuxfr.org je vais pouvoir récupérer la valeur du cookie linuxfr.org_session et ainsi pouvoir l'utiliser pour les entêtes que j'envoie. Cependant cela ne me satisfait pas. Je ne veux pas avoir à faire cela (me connecter manuellement pour récupérer le cookie) pour que mon programme fonctionne. D'une part parce que j'imagine que cette valeur est amenée à changer et d'autre part parce que je voudrais bien pouvoir tout faire en python…

        Donc, ce que je voudrais faire :

        1. Faire une première requête afin de récupérer la valeur du cookie
        2. Utiliser cette valeur pour ma requête POST

        (je verrai éventuellement plus tard pour conserver l'authentification entre les requêtes, je vais peut-être aussi m'orienter vers la bibliothèque « Request » plutôt « http.client », à voir…)

        Ce que je ne comprends pas c'est pourquoi dans les headers que m'envoie le serveur il n'y a pas de champ « Set-Cookie ».

        • [^] # Re: Début de réponse

          Posté par  . Évalué à 4.

          Ce que je ne comprends pas c'est pourquoi dans les headers que m'envoie le serveur il n'y a pas de champ « Set-Cookie ».

          Parce que tu n'es pas loggué.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.