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="✓" /></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 ? S'inscrire !</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 Marotte ⛧ . É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 :
?
# Début de réponse
Posté par Marotte ⛧ . É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 claudex . É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
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 claudex . É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 Marotte ⛧ . É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 claudex . Évalué à 4.
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 Marotte ⛧ . É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 claudex . É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 Marotte ⛧ . É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 :
(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 claudex . Évalué à 4.
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.