Forum Programmation.python Authentification HTTP

Posté par  .
Étiquettes : aucune
0
5
mai
2009
Bonjour,

J'essaye de récupérer le contenu d'une page qui requiert une authentification HTTP.

La première méthode ne fonctionne pas. Pourtant, je l'ai trouvé plusieurs fois sur le net et surtout dans le livre "Programmation Python" de Tarek Ziadé.

La méthode 2, elle fonctionne correctement.

Du coup, je me pose la question suivante: est ce que la méthode 1 est mauvaise, obsolète (le livre est un peu vieux mais je croyais que si cela fonctionnait en 2.3 cela fonctionnait en 2.5) ou tout simplement j'ai fait du grand n'importe quoi ?

Méthode 1:

baseurl = 'localhost/gestion_site/'
baseurlwithoutproto = 'localhost/gestion_site/'
myurl = 'localhost/gestion_site/index.php'
username = 'mathieu'
password = 'mathieu'

handler = urllib2.HTTPBasicAuthHandler()
handler.add_password(None, baseurlwithoutproto, username, password)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(myurl)
for line in pagehandle.readlines()[:5]:
print line

Méthode 2:

baseurl = 'localhost/gestion_site/'
baseurlwithoutproto = 'localhost/gestion_site/'
myurl = 'localhost/gestion_site/index.php'
username = 'mathieu'
password = 'mathieu'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, baseurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler,urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(myurl)
for line in pagehandle.readlines()[:5]:
print line

Merci de votre aide.

A bientôt.
  • # j'utilise plutôt mechanize et beautifulsoup un exemple

    Posté par  (site web personnel) . Évalué à 2.

    Un extrait de code (largement améliorable...) qui marchait il n'y a pas longtemps (le site est en maintenance aujourd'hui)


    # -*- coding: utf-8 -*-
    import smtplib
    import mechanize, cookielib, re, sys
    from optparse import OptionParser

    from urllib2 import HTTPError, URLError
    import urllib, socket
    import BeautifulSoup

    def stat(date, verbose):
    br = mechanize.Browser()
    if verbose:
    br.set_debug_redirects(True)
    br.set_debug_http(True)
    br.addheaders = [ ('User-agent', 'Firefox') ]
    try:
    br.open("http://blogiwi.com")

    #except URLError, res:(site en maintenance)
    # email['Subject']='probleme lors de la connexion sur http://hydro.blogiwi.com'

    except IOError, e:
    send('x@gmail.com','x@gmail.com')
    if hasattr(e, 'reason'):
    print 'Nous avons échoué à joindre le serveur.'
    print 'Raison: ', e.reason
    elif hasattr(e, 'code'):
    print 'Le serveur n\'a pu satisfaire la demande.'
    print 'Code d\' erreur : ', e.code

    # print res.code, res.msg
    # print res.read()
    br.select_form(nr=0)
    br["pseudo"] = "hydro"
    br["mdp"] = "motdepassedehydro"
    try:
    response1 = br.submit()
    except HTTPError, res:
    email['Subject']='probleme lors de la connexion avec le couple user pass '
    send('x@gmail.com','x@gmail.com')
    print res.code, res.msg
    print res.read()
    content = response1.read()
    try:
    response2 = br.follow_link(text='Gestion')
    except HTTPError, res:
    email['Subject']='probleme lors de la connexion sur le lien Gestion'
    send('x@gmail','x@gmail.com')
    print res.code, res.msg
    print res.read()

    # ...







    html = response5.read()
    s = BeautifulSoup.BeautifulSoup(html)
    for tr in s.fetch('tr')[1:]:
    # print t
    td = tr.fetch('td')[0]
    if td.string is None:
    cg=td.childGenerator()
    cg.next()
    print cg.next().string[2:-1]
    else:
    print td.string
    response5.close()

    def main():
    timeout = 30
    socket.setdefaulttimeout(timeout)

    cookiejar = cookielib.CookieJar()

    parser = OptionParser()
    parser.add_option("-f", "--file", dest="filename",
    help="write report to FILE", metavar="FILE")
    parser.add_option("-d", "--date", dest="date",
    help="report for this day")
    parser.add_option("-t", "--timeout", dest="timeout",type="int",default=30,
    help="socket timeout in seconds")
    parser.add_option("-q", "--quiet",
    action="store_false", dest="quiet", default=True,
    help="don't print status messages to stdout")
    parser.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False,
    help="make lots of noise [default]")


    (options, args) = parser.parse_args()
    filename = options.filename
    date = options.date
    verbose = options.verbose
    quiet = options.quiet
    timeout = options.timeout

    print ' date vaut : ',date
    print ' verbose vaut : ',verbose
    print ' timeout vaut : ',timeout


    stat(date, verbose)

    if __name__ == '__main__':
    main()

    ウィズコロナ

  • # peut-être le pourquoi du comment ?

    Posté par  (site web personnel) . Évalué à 2.

    Sur cet article, je pense que tu trouveras la réponse à ta question.

    http://www.voidspace.org.uk/python/articles/authentication.s(...)
  • # Merci pour ses informations.

    Posté par  . Évalué à 1.

    A reprenant tout à zéro, j'ai trouvé mon problème:

    base_url doit contenir le http://
    realm ne doit pas être None

    handler = urllib2.HTTPBasicAuthHandler()
    handler.add_password(realm='Acces restreint', uri= baseurl, user=username, passwd=password)
    opener = urllib2.build_opener(handler, urllib2.HTTPHandler(debuglevel=1))
    print opener.open(myurl).read()

    Du coup, cela fonctionne !!!

    Merci pour votre aide et désolé pour le bruit.

    A bientôt !

Suivre le flux des commentaires

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