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类型。
答案 0 :(得分:1)
您的数据是一个字符串,但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()
关闭响应对象。