2017-07-11 81 views
3

我試圖登錄到使用下面的代碼使用Python中urllib網站的urllib:登錄網站使用,而不是http.client

import urllib.parse 
import urllib.request 
headers = {"Content-type": "application/x-www-form-urlencoded"} 
payload = urllib.parse.urlencode({"username": "USERNAME-HERE", 
            "password": "PASSWORD-HERE", 
            "redirect": "index.php", 
            "sid": "", 
            "login": "Login"}).encode("utf-8") 
request = urllib.request.Request("https://osu.ppy.sh/forum/ucp.php?mode=login", payload, headers) 
response = urllib.request.urlopen(request) 
data = response.read() 

# print the HTML after the request 
print(bytes(str(data), "utf-8").decode("unicode_escape")) 

我知道,一個共同的建議是隻使用請求庫,並且我嘗試了這一點,但我特別想知道如何在不使用請求的情況下執行此操作。

我正在尋找可以用下面的代碼,成功登錄到使用http.client站點複製行爲:

import urllib.parse 
import http.client 
headers = {"Content-type": "application/x-www-form-urlencoded"} 
payload = urllib.parse.urlencode({"username": "USERNAME-HERE", 
            "password": "PASSWORD-HERE", 
            "redirect": "index.php", 
            "sid": "", 
            "login": "Login"}) 
conn = http.client.HTTPSConnection("osu.ppy.sh") 
conn.request("POST", "/forum/ucp.php?mode=login", payload, headers) 
response = conn.getresponse() 
data = response.read() 

# print the HTML after the request 
print(bytes(str(data), "utf-8").decode("unicode_escape")) 

在我看來,該urllib代碼不是「提供」的有效載荷,而http.client代碼是。

我似乎能夠「傳遞」有效載荷,因爲提供了錯誤的密碼,並且用戶名可以保證來自服務器的響應,但是提供正確的用戶名和密碼似乎沒有效果。

任何見解?我可以忽略一些東西嗎

+0

我想你的代碼運行,我得到預期的結果(您指定的密碼不正確...) 。這意味着有效載荷已交付。如果填寫正確的用戶名/密碼,你會得到什麼迴應? – Qeek

+1

@Qeek我也看到你提到的行爲,但是當給出正確的用戶名和密碼時,該網站仍然表現得像我還沒有登錄(「Welcome,guest!」而不是「Welcome,!」)。也許在初始有效載荷交付後登錄不會持久?我需要使用Cookie嗎? –

回答

2

添加cookie罐,並採取了標題爲它們不需要與urllib

import http.cookiejar 
import urllib.parse 
import urllib.request 

jar = http.cookiejar.CookieJar() 
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar)) 

payload = urllib.parse.urlencode({"username": "USERNAME-HERE", 
            "password": "PASSWORD-HERE", 
            "redirect": "index.php", 
            "sid": "", 
            "login": "Login"}).encode("utf-8") 
response = opener.open("https://osu.ppy.sh/forum/ucp.php?mode=login", payload) 
data = response.read() 

# print the HTML after the request 
print(bytes(str(data), "utf-8").decode("unicode_escape"))