簡體   English   中英

POST數據應為字節或字節可迭代。 不能是str類型

[英]POST data should be bytes or an iterable of bytes. It cannot be of type str

def login(self):
    url = 'https://login.facebook.com/login.php?login_attempt=1'
    data = "locale=en_US&non_com_login=&email="+self.email+"&pass="+self.password+"&lsd=20TOl"
    usock = self.opener.open('http://www.facebook.com')
    usock = self.opener.open(url, data)
    if "Logout" in usock.read():
        print("Logged in.")
    else:
        print("failed login")
        print(usock.read())
        sys.exit()

您能告訴我錯誤的原因和原因嗎?

POST數據應為字節或字節可迭代。 它不能是str類型。

您的數據是一個字符串,但是urllib要求它是一個bytes對象,因為它是以原始形式發送的,沒有對信息進行編碼。 您可以通過兩種方法解決此問題:

您可以通過調用str.encode將字符串轉換為字節對象。 默認情況下,這將使用UTF8編碼,因此它應適用於大多數服務器:

usock = self.opener.open(url, data.encode())

另一種方法是直接以字節為單位指定數據。 要創建字節字符串,只需在文字前面加上b

data = b"This is some bytes data"

由於您在此處串聯不同的事物,因此第一種選擇更加容易,因為您不需要對串聯字符串的每個部分進行編碼。

順便說一句。 您兩次調用opener.open ,一次不使用數據,一次使用數據。 您可能應該刪除第一個電話。 除非您當然想收集一些初始Cookie或其他東西,否則在這種情況下,您至少應該使用usock.close()再次關閉響應對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM