【问题标题】:Python urllib2 HTTPBasicAuthHandlerPython urllib2 HTTPBasicAuthHandler
【发布时间】:2025-12-12 03:25:01
【问题描述】:

代码如下:

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 语句。

我如何知道用户名/密码是否不正确。

我认为该功能会超时,但这会将所有错误甚至互联网速度变慢都变成身份验证错误。

【问题讨论】:

    标签: python urllib2


    【解决方案1】:

    它应该会抛出一个错误,更准确地说是一个 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
    

    我刚刚在这里测试过,效果很好

    【讨论】:

    • 是的,它有效。但是当我密码不正确时它会停止。它不会抛出任何异常。只是继续处理 feed= URL.urlopen('mail.google.com/mail/feed/atom')
    • 您可以检查您的网络设置(也许您使用了一个在 401 上发疯的怪异代理?)。我在这里测试了它,使用谷歌提要、正确的用户名和错误的密码,并且 sn-p 工作正常,它失败但不会进入无限处理。