2011-04-30 60 views
6

我想寫一個Python腳本來自動登錄到我的寬帶使用計量器帳戶。我從來沒有做過POST提交,我遇到了一些麻煩。Python 3,urllib POST提交

import urllib.request, urllib.parse, urllib.error 
import socket 

try: 
    details = urllib.parse.urlencode({ 'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD' }) 
    url = urllib.request.Request('https://login1.telecom.co.nz/distauth/UI/Login?realm=XtraUsers&goto=https%3A%2F%2Fwww.telecom.co.nz%3A443%2Fjetstreamum%2FxtraSum%3Flink%3Drdt', details) 
    url.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13") 

    responseData = urllib.request.urlopen(url).read().decode('utf8', 'ignore') 
    responseFail = False 

except urllib.error.HTTPError as e: 
    responseData = e.read().decode('utf8', 'ignore') 
    responseFail = False 

except urllib.error.URLError: 
    responseFail = True 

except socket.error: 
    responseFail = True 

except socket.timeout: 
    responseFail = True 

except UnicodeEncodeError: 
    print("[x] Encoding Error") 
    responseFail = True 

print(responseData) 

從我得到的是IDToken1的HTML是用戶名ID和IDToken2是密碼ID。

這裏是我的問題:

  • 當我輸入正確的用戶名和密碼,登錄頁面加載,但:

  • 當我輸入不正確的用戶名或密碼,我得到一頁說:

    此服務器遇到了一個內部錯誤,阻止它履行您的請求。最可能的原因是配置錯誤。請要求管理員在服務器的錯誤日誌中查找消息。

+0

好了,這是非常困難的,沒有看到你正在使用...也許你應該檢查什麼實際上是由您的瀏覽器與Chrome瀏覽器開發實際發送的頁面工具或像Wireshark這樣的數據包嗅探器? – Strayer 2012-10-18 10:12:58

回答

7
details = urllib.parse.urlencode({'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD'}) 

添加以下行:

details = details.encode('UTF-8') 
0

這可能是設計。如果您在瀏覽器中執行操作,會發生什麼?它使用正確的數據的事實意味着你做對了。