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()
再次关闭响应对象。
关于python - POST 数据应该是字节或字节的可迭代对象。它不能是 str 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28850421/