Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'str' does not support the buffer interface Python 3 error for oauth

import json
import gspread
from oauth2client.client import SignedJwtAssertionCredentials

json_key = json.load(open('Crowds-9569176f5988.json'))
scope = ['https://spreadsheets.google.com/feeds']

credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)
#gc = gspread.authorize(credentials)

Error:

Traceback (most recent call last):   File "C:\Users\sony\Desktop\Python\new.py", line 8, in <module>
    credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)   File "C:\Python34\lib\site-packages\oauth2client\util.py", line 137, in positional_wrapper
    return wrapped(*args, **kwargs)   File "C:\Python34\lib\site-packages\oauth2client\client.py", line 1469, in
__init__
    self.private_key = base64.b64encode(private_key)   File "C:\Python34\lib\base64.py", line 62, in b64encode
    encoded = binascii.b2a_base64(s)[:-1] TypeError: 'str' does not support the buffer interface

I tried encode the string using .encode() but gspread.authorize() doesn't support such a type. This is [documentation][1] which is apparently not of much help. I am using Python 3.4. I think the documentation code works only for version before 3.

EDIT:

credentials = SignedJwtAssertionCredentials.from_json(json_key['client_email'], json_key['private_key'], scope)

Traceback (most recent call last): File "C:\Users\sony\Desktop\Python\new.py", line 9, in credentials = SignedJwtAssertionCredentials.from_json(json_key['client_email'], json_key['private_key'], scope) TypeError: from_json() takes 2 positional arguments but 4 were given [Finished in 1.0s with exit code 1]

[1]: http://gspread.readthedocs.org/en/latest/oauth2.html

credentials = SignedJwtAssertionCredentials.from_json(json_key)

Traceback (most recent call last): File "C:\Users\sony\Desktop\Python\new.py", line 8, in credentials = SignedJwtAssertionCredentials.from_json(json_key) File "C:\Python34\lib\site-packages\oauth2client\client.py", line 1479, in from_json data = json.loads(s) File "C:\Python34\lib\json__init__.py", line 312, in loads s.class.name)) TypeError: the JSON object must be str, not 'dict'

like image 538
Abhishek Bhatia Avatar asked Apr 29 '15 19:04

Abhishek Bhatia


2 Answers

You are using Python3.x, where string is not the same type as for Python 2.x. You need to cast it to bytes (encode it).

Here is simple solution that works well for me:

credentials = SignedJwtAssertionCredentials(
            json_key['client_email']
            , bytes(json_key['private_key'], 'UTF-8')
            , scope)
like image 101
tworec Avatar answered Sep 30 '22 01:09

tworec


There is a solution in this bug report but I have not tried it myself. https://github.com/burnash/gspread/issues/224

like image 42
sup Avatar answered Sep 30 '22 01:09

sup