2014-05-10 63 views
6

與Python混淆,我試圖使用這個https://updates.opendns.com/nic/update?hostname=,當你到達URL將提示用戶名和密碼。我一直環顧四周,我發現了一些關於密碼管理器,所以我想出了這個:Python處理URL的用戶名和密碼

urll = "http://url.com" 
username = "username" 
password = "password" 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 

passman.add_password(None, urll, username, password) 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 

urllib2 = urllib2.build_opener(authhandler) 

pagehandle = urllib.urlopen(urll) 

print (pagehandle.read()) 

這所有的作品,但它促使通過命令行的用戶名和口令,要求用戶的交互。我希望它自動輸入這些值。我究竟做錯了什麼?

回答

2

您要求的網址是「限制」。

如果你試試這個代碼,它會告訴你:

import urllib2 
theurl = 'https://updates.opendns.com/nic/update?hostname=' 
req = urllib2.Request(theurl) 
try: 
    handle = urllib2.urlopen(req) 
except IOError, e: 
    if hasattr(e, 'code'): 
     if e.code != 401: 
      print 'We got another error' 
      print e.code 
     else: 
      print e.headers 
      print e.headers['www-authenticate'] 

您應該添加授權頭。 有關詳細信息看看到:http://www.voidspace.org.uk/python/articles/authentication.shtml

而另一個代碼示例: http://code.activestate.com/recipes/305288-http-basic-authentication/

如果你想發送POST請求,試試吧:

import urllib 
import urllib2 
username = "username" 
password = "password" 
url = 'http://url.com/' 
values = { 'username': username,'password': password } 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
result = response.read() 
print result 

注:這是隻是一個如何發送POST請求到URL的例子。

+0

雅,這沒有工作......它給了我一個401錯誤... –

+0

@AnthonyHonciano小心用戶名和密碼(字典鍵)應該是你的輸入元素的名稱。你的表格是否有其他領域?你可以將你的表單代碼粘貼到你的狀態中嗎? (更新你的狀態)。 401意味着未經授權。 – Mortezaipo

+0

沒有形式,就是這樣。我只是爲自己構建個人更新程序。所以我會讓腳本像這樣運行,我運行python腳本。 另外是的,我知道「用戶名和密碼」將需要不同的實際帳戶信息。 –

1

我還沒有在一段時間與蟒蛇玩,但試試這個:

urllib.urlopen("http://username:[email protected]/path") 
+0

雅,Python不因爲符號的...我已經嘗試了許多方法來使用URL這樣。沒有成功 –

+0

這對工作得很好喜歡我。 – Banjocat

+2

由於密碼已打開供讀者查看,因此這是一種添加到腳本中的不安全方法。然而,這對我在內部網絡上運行的某些腳本來說非常有用。 – Arjun

7

您可以改用requests。代碼很簡單,只要:

import requests 
url = 'https://updates.opendns.com/nic/update?hostname=' 
username = 'username' 
password = 'password' 
print(requests.get(url, auth=(username, password)).content)