Python urllib2 HTTPPasswordMgr不工作-未发送凭据错误

Python urllib2 HTTPPasswordMgr不工作-未发送凭据错误,python,curl,urllib2,httplib,Python,Curl,Urllib2,Httplib,以下python curl调用具有以下成功结果: >>> import subprocess >>> args = [ 'curl', '-H', 'X-Requested-With: Demo', 'https://username:password@qualysapi.qualys.com/qps/rest/3.0/count/was/webapp' ] >>> xml_output =

以下python curl调用具有以下成功结果:

>>> import subprocess
>>> args = [
        'curl',
        '-H', 'X-Requested-With: Demo',
        'https://username:password@qualysapi.qualys.com/qps/rest/3.0/count/was/webapp' ] 
>>> xml_output = subprocess.check_output(args).decode('utf-8')
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
138   276    0   276    0     0    190      0 --:--:--  0:00:01 --:--:--   315
>>> xml_output
u'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://qualysapi.qualys.com/qps/xsd/3.0/was/webapp.xsd">\n<responseCode>SUCCESS</responseCode>\n  <count>33</count>\n</ServiceResponse>'
导入子流程 >>>args=[ "卷曲",, '-H',X-request-With:Demo', 'https://username:password@qualysapi.qualys.com/qps/rest/3.0/count/was/webapp'] >>>xml_output=子流程。检查_输出(args)。解码('utf-8') %总接收百分比%x平均速度时间电流 数据加载上载总左速度 138 276 0 276 0 0 190 0 --:--:-- 0:00:01 --:--:-- 315 >>>xml_输出 u'\n\n成功\n 33\n' 不幸的是,此调用未成功转换为urllib2。我收到另一个XML响应,指出用户未提供授权凭据:

>>> import urllib2
>>> # Create a password manager.
... password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
>>> # Add the username and password.
... top_level_url = 'https://qualysapi.qualys.com'
>>> password_mgr.add_password(None, top_level_url, username, password)
>>> handler = urllib2.HTTPBasicAuthHandler(password_mgr)
>>> opener = urllib2.build_opener(handler)
>>> urllib2.install_opener(opener)
>>> headers = {'X-Requested-With':'Demo'}
>>> uri = 'https://qualysapi.qualys.com/qps/rest/3.0/count/was/webapp'
>>> req = urllib2.Request(uri,None,headers)
>>> result = urllib2.urlopen(req)
>>> result
'<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://qualysapi.qualys.com/qps/xsd/3.0/was/webapp.xsd">\n  <responseCode>INVALID_CREDENTIALS</responseCode>\n  <responseErrorDetails>\n    <errorMessage>User did not supply any authentication headers</errorMessage>\n  </responseErrorDetails>\n</ServiceResponse>'
导入urllib2 >>>#创建密码管理器。 ... 密码\u mgr=urllib2.HTTPPasswordMgrWithDefaultRealm() >>>#添加用户名和密码。 ... 顶级https://qualysapi.qualys.com' >>>密码管理器添加密码(无、顶级url、用户名、密码) >>>handler=urllib2.HTTPBasicAuthHandler(密码\u mgr) >>>opener=urlib2.build\u opener(处理程序) >>>urllib2.install_opener(opener) >>>headers={'X-request-With':'Demo'} >>>乌里https://qualysapi.qualys.com/qps/rest/3.0/count/was/webapp' >>>请求(uri、无、头) >>>结果=urllib2.urlopen(req) >>>结果 “\n无效\u凭据\n\n用户未提供任何身份验证头\n\n” 顺便说一下,我收到了与httplib相同的错误消息:

>>> import httplib, base64
>>> auth = 'Basic ' + string.strip(base64.encodestring(username + ':' + password))
>>> h = httplib.HTTPSConnection('qualysapi.qualys.com')
>>> h.request("GET", "/qps/rest/3.0/count/was/webapp/")
>>> r1 = h.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> data1
'<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://qualysapi.qualys.com/qps/xsd/3.0/was/webapp.xsd">\n  <responseCode>INVALID_CREDENTIALS</responseCode>\n  <responseErrorDetails>\n    <errorMessage>User did not supply any authentication headers</errorMessage>\n  </responseErrorDetails>\n</ServiceResponse>'
导入httplib,base64 >>>auth='Basic'+string.strip(base64.encodestring(用户名+':'+密码)) >>>h=httplib.HTTPSConnection('qualysapi.qualys.com') >>>h.request(“GET”、“/qps/rest/3.0/count/was/webapp/”) >>>r1=h.getresponse() >>>打印r1.status,r1.reason 200行 >>>data1=r1.read() >>>数据1 “\n无效\u凭据\n\n用户未提供任何身份验证头\n\n” 我知道httplib和urllib2只有在将SSL编译到socket中时才能工作,而SSL是编译到socket的模块中的。事实上,我已经成功地将urllib2用于不同API上的其他调用。问题被隔离到这个特定的API

urllib2(和httplib)与curl有什么不同

注意:所有示例中使用的用户名和密码都相同

更新:

问题在于基本身份验证密码管理器。当我手动添加基本授权标头时,urllib2 cal工作:

>>> import base64
>>> base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
>>> req.add_header("Authorization", "Basic %s" % base64string)
>>> # Make request to fetch url.
... result = urllib2.urlopen(req)
>>> # Read xml results.
... xml = result.read()
>>> xml
'<?xml version="1.0" encoding="UTF-8"?>\n<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://qualysapi.qualys.com/qps/xsd/3.0/was/webapp.xsd">\n  <responseCode>SUCCESS</responseCode>\n  <count>33</count>\n</ServiceResponse>'
导入base64 >>>base64string=base64.encodestring(“%s:%s%”(用户名、密码))[:-1] >>>请求添加标题(“授权”,“基本%s”%base64string) >>>#请求获取url。 ... 结果=urllib2.urlopen(req) >>>#读取xml结果。 ... xml=result.read() >>>xml “\n\n成功\n 33\n”
尝试设置用户代理,可能这就是干扰的原因。urllib2将自己标识为
Python urllib/x.y
(其中x和y是Python发行版的主要版本号和次要版本号,例如
Python urllib/2.5
),这可能是导致站点阻止您请求的原因。看看他们的robots.txt。。下面是一个关于设置用户代理的示例,以便将脚本标识为浏览器:

import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()

问题是,根据HTTP标准,Python库首先发送未经验证的请求,然后只有在401重试的情况下才发送正确的凭据。如果。。。如果服务器不执行“完全标准的身份验证”,那么库将无法工作


在第一次尝试时,此特定API不会以401未经授权响应,它用一个XML响应进行响应,其中包含一条消息,说明凭据未使用200 OK响应代码发送。

谢谢,但这会导致相同的响应
\n无效\u凭据\n\n用户未提供任何身份验证头\n\n
。上面注释中使用的代码:
头={'X-request-With':'Demo','User-Agent':'Mozilla/4.0(兼容;MSIE 5.5;Windows NT)}