2011-02-03 78 views
8

我用这一个砰地撞着墙头。我一直在尝试每个示例,阅读我在网上可以找到的有关使用urllib2进行基本http授权的每一个最后一点,但是我无法弄清楚是什么导致了我的具体错误。urllib2基本认证怪物

添加到无奈的是,代码工作的一个页面,而尚未另一个。登录www.mysite.com/adm的登录变得非常顺利。它认证没有问题。然而,如果我更改地址为“http://mysite.com/adm/items.php?n=201105 & C = 200”我收到此错误:

<h4 align="center" class="teal">Add/Edit Items</h4> 
<p><strong>Client:</strong> </p><p><strong>Event:</strong> </p><p class="error">Not enough information to complete this task</p> 

<p class="error">This is a fatal error so I am exiting now.</p> 

搜索谷歌已经导致零信息这个错误。

ADM的是框架集页面,我不知道这是相关的。

下面是当前的代码:

import urllib2, urllib 
import sys 

import re 
import base64 
from urlparse import urlparse 

theurl = 'http://xxxxxmedia.com/adm/items.php?n=201105&c=200' 
username = 'XXXX' 
password = 'XXXX' 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, theurl,username,password) 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 

opener = urllib2.build_opener(authhandler) 

urllib2.install_opener(opener) 

pagehandle = urllib2.urlopen(theurl) 

url = 'http://xxxxxxxmedia.com/adm/items.php?n=201105&c=200' 
values = {'AvAudioCD': 1, 
      'AvAudioCDDiscount': 00, 'AvAudioCDPrice': 50, 
      'ProductName': 'python test', 'frmSubmit': 'Submit' } 

#opener2 = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 

这只是众多版本我试过之一。我已经跟踪了Urllib2手册中的所有示例,但仍然收到相同的错误。

任何人都可以指出我做错了什么?

+1

它看起来像你的代码工作,但不是你连接到的网站。它在浏览器中工作吗?由于页面包含框架,你看过它的源代码吗? – 2011-02-03 06:41:56

+0

是的,它在浏览器中工作。我已经检查出它的来源与萤火虫。管理网站使用此样式代码进入html页面: – Zack 2011-02-03 07:27:52

+0

@jd是的,它在浏览器中工作。我已经检查出它的来源与萤火虫。我不完全确定要寻找什么。我注意到我可以在每个页面上使用python进行身份验证,除了那些在地址IE中有参数的页面。 ..dia.com/ADM/items.php?N = 201105&amp; C = 200' 。 – Zack 2011-02-03 07:37:25

回答

2

大约一年前,我去救援人员到场相同的过程和记录我是如何解决这个问题 - 直接和简单的方法来验证和标准之一。选择你认为合适的。

HTTP Authentication in Python

有一个解释的说明中,在missing urllib2 document

1

从您发布的HTML,它仍然认为你成功进行身份验证,但遇到错误之后,在你的POST请求的处理。我试过了你的URL并且失败了,我得到了一个标准的401页面。

在任何情况下,我建议你尝试再次运行代码,并在Firefox手动执行相同的操作,只是这一次使用Wireshark捕捉交流。您可以在两种情况下获取HTTP请求和响应的全文,并比较差异。在大多数情况下,这会导致你得到错误的根源。

3

今天遇到类似的问题。我在我正在开发的网站上使用基本身份验证,并且无法验证任何用户身份。

这里有一些东西,你可以用它来调试你的问题:

  1. 我用slumber.inhttplib2用于测试目的。我从ipython shell运行,看看我收到了什么回应。
  2. 沉睡者实际上在封面下面使用httplib2,所以他们的行为相似。我使用tcpdump和后来的tcpflow(以更易读的形式显示信息)来查看实际发送和接收的内容。如果您需要GUI,请参阅wireshark或其他选项。
  3. 我测试了我的网站卷曲,当我用我的用户名/密码卷曲它正常工作,并显示请求的页面。但睡眠和httplib2仍然无法正常工作。
  4. 我测试了我的网站和browserspy.dk,看看有什么区别。重要的是browserspy的网站适用于基本身份验证,而我的网站没有,所以我可以在两者之间进行比较。我在很多需要发送HTTP 401 Not Authorized的地方阅读,以便您使用的浏览器或工具可以发送您提供的用户名/密码。但是我不知道的是,你还需要标题中的WWW-Authenticate字段。所以这是缺失的一块。
  5. 是什么原因让这整个情况是奇测试时我就看见httplib2发送基本认证头,与大多数的请求(tcpflow会显示)。事实证明,该库不会在第一个请求上发送用户名/密码认证。如果“状态401”和“WWW验证”是在响应,则凭据在第二次请求和所有的请求从然后在此域发送。

因此,总结一下,您的应用程序可能是正确的,但您可能不会返回客户端发送凭据的标准标头和状态码。使用你的调试工具来找出哪个是哪个。此外,还有对httplib2的调试模式,只要设置httplib2.debuglevel=1使调试信息打印在标准输出。这比使用tcpdump更有用,因为它处于更高级别。

希望这可以帮助别人。

0

我还发现了帕斯曼东西不工作(有时?)。根据这个答案https://stackoverflow.com/a/18592800/623159添加base64用户/通过头为我工作。我访问詹金斯URL都是这个:http:///工作// lastCompletedBuild/testR扩展端口/ API /蟒蛇

这个工作对我来说:

import urllib2 
import base64 

baseurl="http://jenkinsurl" 
username=... 
password=... 

url="%s/job/jobname/lastCompletedBuild/testReport/api/python" % baseurl 

base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') 
request = urllib2.Request(url) 
request.add_header("Authorization", "Basic %s" % base64string) 
result = urllib2.urlopen(request) 
data = result.read() 

这并没有为我工作,错误403每次:

import urllib2 

baseurl="http://jenkinsurl" 
username=... 
password=... 

##urllib2.HTTPError: HTTP Error 403: Forbidden 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, username,password) 
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman))) 
req = urllib2.Request(url) 
result = urllib2.urlopen(req) 
data = result.read()