Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"TypeError: string argument without an encoding", but the string is encoded?

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!

like image 225
J.W.F. Avatar asked Jun 02 '16 20:06

J.W.F.


1 Answers

This error is due to how you create bytes in python 3.

You will not do bytes("bla bla") but just b"blabla" or you need to specify an encoding type like bytes("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

TypeError: string argument without an encoding

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:

my_bytes_value.decode("utf-8")

And it will return you a str.

I hoped it help ! Have a nice day !

like image 61
Oekhny Avatar answered Oct 15 '22 11:10

Oekhny