Il s'agit de se connecter une première fois au serveur de listes, pour initier le processus d'authentification.
sympa_session
, et le sauvegarder pour plus tardlxml.html
)Connexion
)1: #!/usr/bin/python 2: 3: import urllib 4: import sys 5: import lxml 6: import lxml.html 7: 8: url="https://listes.example.com/sympa" 9: 10: # on charge l'url du site 11: f=urllib.urlopen(url) 12: 13: if f.code != 200: 14: print "Erreur %s"%f.code 15: 16: print "code: %s"%f.code 17: print "url finale : %s"%f.url 18: print "headers : %s"%f.headers 19: 20: # on récupère le cookie de Sympa 21: sympa_cookie=f.headers.getheader('Set-Cookie') 22: print "Le cookie obtenu est : %s"%sympa_cookie 23: 24: # on analyse le code avec lxml et on passe l'url d'origine 25: doc=lxml.html.document_fromstring(f.read(),base_url=url) 26: 27: # on récupère le premier formulaire 28: form=doc.forms[0] 29: 30: print "Contenu du formulaire : %s"%lxml.html.tostring(form) 31: # on soumet le formulaire 32: # clic sur connexion 33: result = lxml.html.submit_form(form) 34: 35: print "code: %s"%result.code 36: print "url finale : %s"%result.url 37: print "headers : %s"%result.headers
Comme on vient de le voir, le module urllib suit tout seul les redirections. Par contre, il ne sait pas gérer les Cookies. Nous allons voir comment utiliser urllib2 et cookielib pour gérer les cookies.
Lancez deux requètes successives à la page https://listes.example.com/sympa et affichez le cookie sympa_session.
1: import urllib2 2: 3: url="https://listes.example.com/sympa" 4: 5: f=urllib2.urlopen("https://listes.example.com/sympa") 6: print f.headers.getheader('Set-Cookie') 7: f.close() 8: 9: f=urllib2.urlopen("https://listes.example.com/sympa") 10: print f.headers.getheader('Set-Cookie') 11: f.close()
Recommencez en ajoutant la gestion des cookies à urllib2.
1: import urllib2 2: import cookielib 3: 4: url="https://listes.example.com/sympa" 5: cj=cookielib.CookieJar() 6: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 7: urllib2.install_opener(opener) 8: 9: f=urllib2.urlopen("https://listes.example.com/sympa") 10: print f.headers.getheader('Set-Cookie') 11: f.close() 12: 13: f=urllib2.urlopen("https://listes.example.com/sympa") 14: print f.headers.getheader('Set-Cookie') 15: f.close() 16: 17: for cookie in cj: 18: print "%s=%s"%(cookie.name,cookie.value)
La page obtenue en 1 contient plusieurs formulaires.
Nous allons soumettre le formulaire fm1
contenu dans cette page, après avoir rempli les champs contenus dans le fichier cas_credential.yaml.
1: username: leonardo.davinci 2: password: joconde
Affichez l'URL finale obtenue et les headers.
1: import urllib 2: import urllib2 3: import cookielib 4: import sys 5: import re 6: import lxml 7: import lxml.html 8: import yaml 9: 10: # une fonction pour que lxml.html utilise nos paramètres d'urllib2 plutôt que les paramètres par défaut 11: def open_url(method, url, values): 12: if not url: 13: raise ValueError("cannot submit, no URL provided") 14: if method == 'GET': 15: if '?' in url: 16: url += '&' 17: else: 18: url += '?' 19: url += urllib.urlencode(values) 20: data = None 21: else: 22: data = urllib.urlencode(values) 23: return urllib2.urlopen(url,data) 24: 25: 26: url="https://listes.example.com/sympa" 27: 28: cj=cookielib.CookieJar() 29: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 30: 31: urllib2.install_opener(opener) 32: 33: # on installe nos paramètres dans lxml.html 34: lxml.html.open_http_urllib=open_url 35: 36: r1=urllib2.urlopen(url) 37: # on récupère le cookie de Sympa 38: sympa_cookie=r1.headers.getheader('Set-Cookie') 39: # on analyse le code avec lxml et on passe l'url d'origine 40: doc=lxml.html.document_fromstring(r1.read(),base_url=url) 41: # on récupère le premier formulaire 42: form=doc.forms[0] 43: 44: # on soumet le formulaire 45: result = lxml.html.submit_form(form) 46: 47: #print result 48: print "code: %s"%result.code 49: print "headers: %s"%result.headers 50: 51: cas_cookie=result.headers.getheader('Set-Cookie') 52: 53: for form in lxml.html.parse(result).getroot().forms: 54: if 'id' in form.fields: 55: if form.fields['id']=="fm1": 56: break 57: 58: # on lit les données d'authentiification dans le fichier cas_credential.yaml 59: source_yaml=open('cas_credential.yaml') 60: credentials=yaml.load(source_yaml.read()) 61: for i in credentials.keys(): 62: form.fields[i]=credentials[i] 63: 64: result = lxml.html.submit_form(form) 65: 66: # on recupere les cookies ! 67: 68: print "code %s"%result.code 69: print "url %s"%result.url 70: print "headers : %s"%result.headers
Nous sommes authentifiés sur le server sympa !
Pour le vérifier, on va extraire de la page retournée le contenu de la division id=Identity
, qui doit contenir l'identité du visiteur.
Affichez également les valeurs de tous les cookies obtenus.
1: import urllib 2: import urllib2 3: import cookielib 4: import sys 5: import re 6: import lxml 7: import lxml.html 8: import yaml 9: 10: # une fonction pour que lxml.html utilise nos paramètres d'urllib2 plutôt que les paramètres par défaut 11: def open_url(method, url, values): 12: if not url: 13: raise ValueError("cannot submit, no URL provided") 14: if method == 'GET': 15: if '?' in url: 16: url += '&' 17: else: 18: url += '?' 19: url += urllib.urlencode(values) 20: data = None 21: else: 22: data = urllib.urlencode(values) 23: return urllib2.urlopen(url,data) 24: 25: 26: url="https://listes.example.com/sympa" 27: 28: cj=cookielib.CookieJar() 29: opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 30: 31: urllib2.install_opener(opener) 32: 33: # on installe nos paramètres dans lxml.html 34: lxml.html.open_http_urllib=open_url 35: 36: r1=urllib2.urlopen(url) 37: # on récupère le cookie de Sympa 38: sympa_cookie=r1.headers.getheader('Set-Cookie') 39: # on analyse le code avec lxml et on passe l'url d'origine 40: doc=lxml.html.document_fromstring(r1.read(),base_url=url) 41: # on récupère le premier formulaire 42: form=doc.forms[0] 43: 44: # on soumet le formulaire 45: result = lxml.html.submit_form(form) 46: 47: #print result 48: print "code: %s"%result.code 49: print "headers: %s"%result.headers 50: 51: cas_cookie=result.headers.getheader('Set-Cookie') 52: 53: for form in lxml.html.parse(result).getroot().forms: 54: if 'id' in form.fields: 55: if form.fields['id']=="fm1": 56: break 57: 58: # on lit les données d'authentiification dans le fichier cas_credential.yaml 59: source_yaml=open('cas_credential.yaml') 60: credentials=yaml.load(source_yaml.read()) 61: for i in credentials.keys(): 62: form.fields[i]=credentials[i] 63: 64: result = lxml.html.submit_form(form) 65: 66: tree=lxml.html.parse(result).getroot() 67: print (tree.xpath('//div[@id="Identity"]')[0]).text 68: 69: # on recupere les cookies ! 70: for cookie in cj: 71: print cookie.name+"="+cookie.value