Python urllib2 HTTPBasicAuthHandler - PullRequest
2 голосов
/ 20 июня 2010

Вот код:

import urllib2 as URL

def get_unread_msgs(user, passwd):
    auth = URL.HTTPBasicAuthHandler()
    auth.add_password(
            realm='New mail feed',
            uri='https://mail.google.com',
            user='%s'%user,
            passwd=passwd
            )
    opener = URL.build_opener(auth)
    URL.install_opener(opener)
    try:
        feed= URL.urlopen('https://mail.google.com/mail/feed/atom')
        return feed.read()
    except:
        return None

Работает просто отлично.Единственная проблема заключается в том, что когда используется неправильное имя пользователя или пароль, для открытия URL-адреса всегда требуется @

feed= URL.urlopen('https://mail.google.com/mail/feed/atom')

. Он не выдает никаких ошибок, просто продолжайте выполнять оператор urlopen навсегда.

Как я могу узнать, что имя пользователя / пароль неверны.

Я подумал о таймауте для функции, но тогда это превратит всю ошибку и даже медленный интернет в ошибку аутентификации.

1 Ответ

3 голосов
/ 20 июня 2010

Это должно выдать ошибку, точнее urllib2.HTTPError, с полем кода, установленным в 401, вы можете увидеть некоторый адаптированный код ниже.Я оставил вашу общую структуру try / кроме, но на самом деле, не используйте общие, кроме операторов, поймайте только то, что вы ожидаете, что может произойти!

def get_unread_msgs(user, passwd):
    auth = URL.HTTPBasicAuthHandler()
    auth.add_password(
            realm='New mail feed',
            uri='https://mail.google.com',
            user='%s'%user,
            passwd=passwd
            )
    opener = URL.build_opener(auth)
    URL.install_opener(opener)
    try:
        feed= URL.urlopen('https://mail.google.com/mail/feed/atom')
        return feed.read()
    except HTTPError, e:
        if e.code == 401:
            print "authorization failed"            
        else:
            raise e # or do something else
    except: #A general except clause is discouraged, I let it in because you had it already
        return None

Я только что протестировал здесь, отлично работает

...