2011-02-03 54 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()