I am working on converting an existing program from Python2 to Python3. One of the methods in the program authenticates the user with a remote server. It will prompt the user to enter in a password.
def _handshake(self):
timestamp = int(time.time())
token = (md5hash(md5hash((self.password).encode('utf-8')).hexdigest()
+ str(bytes('timestamp').encode('utf-8'))))
auth_url = "%s/?hs=true&p=1.2&u=%s&t=%d&a=%s&c=%s" % (self.name,
self.username,
timestamp,
token,
self.client_code)
response = urlopen(auth_url).read()
lines = response.split("\n")
if lines[0] != "OK":
raise ScrobbleException("Server returned: %s" % (response,))
self.session_id = lines[1]
self.submit_url = lines[3]
The problem with this method is that after the integer is converted to a string, it needs to be encoded. But as far as I can tell, it is already encoded? I found this question but I was having a hard time applying that to the context of this program.
This is the line giving me problems.
+ str(bytes('timestamp').encode('utf-8'))))
TypeError: string argument without an encoding
I have tried playing around with alternate ways of doing this, all with varying types of errors.
+ str(bytes('timestamp', 'utf-8'))))
TypeError: Unicode-objects must be encoded before hashing
+ str('timestamp', 'utf-8')))
TypeError: decoding str is not supported
I'm still getting started learning Python (but I have beginner to intermediate knowledge of Java), so I am not completely familiar with the language yet. Does anyone have any thoughts on what this issue might be?
Thanks!
This error is due to how you create bytes in python 3.
You will not do
bytes("bla bla")
but justb"blabla"
or you need to specify an encoding type likebytes("bla bla","utf-8")
because it needs to know what was the original encoding before turning it into an array of numbers.Then the error
Should disappear.
You have either bytes or str. If you have a bytes value and you want to turn it in str you should do:
And it will return you a str.
I hoped it help ! Have a nice day !