Python urllib2 HTTP基本认证处理器

2 投票
1 回答
9369 浏览
提问于 2025-04-16 00:12

这里是代码:

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

它运行得很好。唯一的问题是,当使用错误的用户名或密码时,打开网址 @

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

需要很长时间,根本没有任何错误提示,只是一直在执行这个打开网址的操作。

我该怎么知道用户名或密码是否不正确呢?

我想到了给这个功能设置一个超时,但这样的话,所有的错误,包括网络慢的情况,都会被当作认证错误。

1 个回答

3

这段代码应该会抛出一个错误,更准确地说是一个urllib2.HTTPError,错误代码是401。下面有一些调整过的代码供你参考。我保留了你原来的try/except结构,但其实不要使用通用的except语句,只捕捉你预期可能发生的错误!

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

我刚在这里测试过,运行得很好。

撰写回答