Python — проблемы с доступом к электронной таблице Google с помощью клиента службы OAuth 2.0

У меня есть электронная таблица Google, к которой я пытаюсь получить доступ через небольшой клиент службы Python OAuth 2.0, который я пишу, используя gspread и oauth2client.

Я создал учетную запись службы OAuth 2.0 в Google Developers Console и поделился электронной таблицей с этим электронным письмом, предоставив клиенту/приложению доступ к ней, и поместил файл ключа JSON, содержащий учетные данные, в небольшой тестовый скрипт. Хотя я могу создать объект учетных данных OAuth 2.0 и даже получить клиент электронной таблицы, при вызове openall() на клиенте возникает ошибка синтаксического анализа XML:

File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/gspread/client.py", line 214, in openall
  feed = self.get_spreadsheets_feed()
File "/Library/Python/2.7/site-packages/gspread/client.py", line 230, in get_spreadsheets_feed
  return ElementTree.fromstring(r.read())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1301, in XML
  return parser.close()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1654, in close
  self._raiseerror(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
  raise err
xml.etree.ElementTree.ParseError: no element found: line 1, column 0

Вот код:

import gspread
from gspread import Client
from gspread.httpsession import HTTPSession
from oauth2client.client import SignedJwtAssertionCredentials

OAuth2_JSON_key = {
  "client_auth_scope": "https://spreadsheets.google.com/feeds",
  "myspreadsheet_keys":
  {
    "myspreadsheet_key": "XXXX"
  },
  "private_key_id": "XXXX",
  "private_key": "XXXX",
  "client_email": "[email protected]",
  "client_id": "XXXXgkcvcke.apps.googleusercontent.com",
  "client_type": "service_account"
}

OAuth2_credentials = SignedJwtAssertionCredentials(
    OAuth2_JSON_key['client_email'],
    OAuth2_JSON_key['private_key'],
    OAuth2_JSON_key['client_auth_scope']
)

persistent_session = HTTPSession(headers={'Connection':'Keep-Alive'})

spreadsheet_client = gspread.Client(
    auth=OAuth2_credentials,
    http_session=persistent_session
)

spreadsheets = spreadsheet_client.openall()

person Community    schedule 18.06.2015    source источник
comment
Если вместо использования gspread.Client(auth=OAuth2_credentials,http_session=persistent_session) я просто использую gspread.authorize(OAuth_credentials), то я получаю непустой клиент электронной таблицы.   -  person    schedule 19.06.2015
comment
Я думаю, что в gspread.Client есть ошибка, но я не могу поднимать проблемы в репозитории github github.com/burnash/gspread .   -  person    schedule 19.06.2015


Ответы (2)


Я не слишком знаком с этим, но у меня была похожая ошибка. Вы должны попробовать загрузить ключ json из консоли разработчика Google и запустить это:

json_key = json.load(open('****.json'))  #Downloaded from google
credentials = SignedJwtAssertionCredentials(json_key['client_email'],   json_key['private_key'], scope)
gc = gspread.authorize(credentials)

Я не получаю никаких ошибок при доступе к своим электронным таблицам таким образом. Не забудьте поделиться своими электронными таблицами с электронной почтой вашего клиента.

person Ilya L.    schedule 19.06.2015
comment
Вот как теперь выглядит мой код подключения. Так что я думаю, мы можем сказать, что это определенно работает. Но в целом, по-видимому, наблюдается какое-то непредсказуемое и неожиданное поведение, потому что, если вы вместо этого используете gspread.Client(auth=<OAuth2 credentials>, http_session=<persistent HTTP session>) для создания клиента/соединения, тогда он работает, поскольку клиент есть, но все его методы электронной таблицы/рабочей таблицы терпят неудачу и генерируют синтаксический анализ XML ошибки. - person ; 20.06.2015

Из того, что я вижу, использование insert_row с методом gpsread.Client() вызывает проблемы. Я переключил код обратно на gspread.authorize(), и он отлично работает.

person Community    schedule 26.06.2015