1

Я реализовал здесь код python на основе документации, чтобы получить доступ к электронной таблице, доступной по общедоступной ссылке. Работает один раз в час. Если я исполняю несколько секунд после того, как успех, я получаю сообщение об ошибке:Доступ к электронной таблице Google из Google Appengine с учетной записью службы: работа один раз в час

Error opening spreadsheet no element found: line 1, column 0 

Предположение: Маркер доступа имеет срок действия 1 час. Таким образом, appengine перейдет к обновлению токена через час, сбросив все.

Вопрос: Этот код запрашивает новый токен для каждого запроса. И что же мне делать ? Сохранить токен? Когда я пытаюсь token_to_blob, чтобы сохранить токен, я получаю сообщение об ошибке: Scope undefined

Заранее благодарим за вашу помощь!

try : 
     credentials = AppAssertionCredentials(scope=('https://www.googleapis.com/auth/drive','https://spreadsheets.google.com/feeds','https://docs.google.com/feeds')) 
     logging.info("credentials") 
     http_auth = credentials.authorize(httplib2.Http()) 
     authclient = build('oauth2','v2',http=http_auth) 
     auth2token = gdata.gauth.OAuth2TokenFromCredentials(credentials) 
    except Exception as details: 
     logging.error("Error Google credentials %s"%details) 
     return "Error" 

    try : 
     gd_client = gdata.spreadsheets.client.SpreadsheetsClient() 
     gd_client = auth2token.authorize(gd_client) 
     feed = gd_client.GetListFeed(<spreadsheetKey>,1) 
    except Exception as details: 
     logging.error("Error opening spreadsheet %s"%details) 
     return "Error" 
+1

Посмотрите на gspread, благодаря которому очень легко получить доступ к электронной таблице, используя учетную запись sevice. – voscausa

+0

Можете ли вы сначала определить, откуда исходит ошибка «элемент не найден»? Попробуйте взглянуть на [это] (http://stackoverflow.com/questions/30920529/python-problems-accessing-a-google-spreadsheet-using-an-oauth-2-0-service-clie) и посмотреть, помогает ли он – SwagBomb

+0

Спасибо - элемент не найден из пустого ответа из-за неправильных параметров аутентификации, даже если электронная таблица является общедоступной – Benoit

ответ

1

я, наконец, объявил полномочия & лексема как глобальные. В этом случае он работал для нескольких последующих запросов, но через 1 час токен был недействительным.

Я тестировал метод access_token_expired, но этот метод всегда возвращал false.

Итак, я, наконец, систематически выполняю обновление, и оно работает. Не элегантный, но функциональный. Другой вариант - сохранить время следующего обновления и обновить только через 1 час.

Ваши комментарии могут быть использованы для элегантных альтернатив.

Я не пробовал gspread, так как остальная часть кода уже была функциональна для gdata.spreadsheets, но, возможно, мне следовало бы это сделать.

from oauth2client.contrib.appengine import AppAssertionCredentials 
from oauth2client.client import Credentials 
from oauth2client.service_account import ServiceAccountCredentials 
from googleapiclient.discovery import build 
import httplib2 

global credentials 
global auth2token 
try : 
    credentials = AppAssertionCredentials(scope=('https://www.googleapis.com/auth/drive','https://spreadsheets.google.com/feeds','https://docs.google.com/feeds')) 
    http_auth = credentials.authorize(httplib2.Http()) 
    authclient = build('oauth2','v2',http=http_auth) 
    auth2token = gdata.gauth.OAuth2TokenFromCredentials(credentials) 
except Exception as details: 
    logging.error("Error Google credentials %s"%details) 

class importFromSpreadsheet(webapp2.RequestHandler): 
    def __importFromSpreadsheet(self,u): 
     try : 
      credentials._refresh(httplib2.Http()) 
     except Exception as details: 
      logging.error("Error refreshing Google credentials %s"%details) 
... 
     try : 
      gd_client = gdata.spreadsheets.client.SpreadsheetsClient() 
      gd_client = auth2token.authorize(gd_client) 
      feed = gd_client.GetListFeed(u,1) 
     except Exception as details: 
      logging.error("Error opening 1st spreadsheet %s"%details) 
      return "Error" 

 Смежные вопросы

  • Нет связанных вопросов^_^