2015-06-18 5 views
0

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

Я создал учетную запись службы 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() 
+0

Если вместо использования 'gspread.Client (auth = OAuth2_credentials, http_session = persistent_session)' я просто использую 'gspread.authorize (OAuth_credentials)', тогда я получаю клиент электронной таблицы, который не пуст. –

+0

Я думаю, что есть ошибка в 'gspread.Client', но я не могу поднимать проблемы на github repo https://github.com/burnash/gspread. –

ответ

0

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

0

Я не слишком хорошо знаком с этим, но у меня была аналогичная ошибка. Вы должны попытаться загрузить ключ 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) 

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

+0

Вот как мой код подключения сейчас. Поэтому я думаю, что мы можем сказать, что это бессрочно работает. Но, как представляется, существует непредсказуемое и неожиданное поведение в целом, потому что если вы вместо этого используете 'gspread.Client (auth = , http_session = <постоянный HTTP-сеанс>)' для создания клиента/соединения, то он, похоже, работает, в том, что есть клиент, но все его методы таблиц/рабочих таблиц терпят неудачу и генерируют ошибки синтаксического анализа XML. –