Como evitar "Falha ao recuperar o token de acesso: {" error ":" invalid_grant "}" em tarefas cron off-line do GAE?

Este post é um followup paraComo tornar as operações 'access_type = offline' / somente servidor OAuth2 no GAE / Python. ohttp = credentials.authorize(httplib2.Http()) parte não falha mais ao testar, mas parece que ainda acontece quando executada pelo cron do GAE, onde não é possível atualizar meuaccess_token :

Eu posso executar manualmente meu trabalho chamando/fetch, diga às 11:45.Agendando imediatamente um/cronfetch trabalho às 11:55 funciona então, sem nenhumaaccess_token questão.

Mas então, eu acordei esta manhã vendo que omesmo /cronfetch tarefa (mesmo, exceto o tempo, que é 01:00 para a minha tarefa diária sem teste) falhou:

I 2013-06-10 05:53:51.324 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-06-10 05:53:51.325 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 05:53:51.327 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus
I 2013-06-10 05:53:51.397 Refreshing due to a 401
I 2013-06-10 05:53:51.420 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-06-10 05:53:51.421 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 05:53:51.421 Refreshing access_token
I 2013-06-10 05:53:51.458 Failed to retrieve access token: { "error" : "invalid_grant" }
I 2013-06-10 05:53:51.468 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-06-10 05:53:51.468 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 05:53:51.471 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 05:53:51.471 get: Got type <class 'oauth2client.appengine.CredentialsModel'>
E 2013-06-10 05:53:51.480 invalid_grant Traceback (most recent call last): File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in

esteOcorreu um erro "invalid_grant" na atualização do token mensagem da lista de discussão (+Então poste 1, Então poste 2, Então poste 3) parece semelhante ao meu problema, mas parece estar acontecendo com umaccess_type=online símbolo. No meu caso eu uso apenas o padrãoaccess_type=offlinee vejo o"Realize estas operações quando não estiver usando o aplicativo" mencionar no pedido de acesso inicial.

Eu apenas re-agendar uma execução cron às 08:25 (tomando cuidado para não iniciar uma execução manual) com declarações de impressão de depuração que eu enviei para o GitHub para você. Aqui está o que eu recebo, é semelhante, mas não é idêntico (note as poucas últimas linhas parecem ordenadas incorretamente, eu definitivamente não estou fazendo coisas OAuth2 emcreate_playlist até que todas as fontes sejam lidas). Então, ignorando a ordem distorcida (GAE logging artefato?), Pareceminhahttp = credentials.authorize(Http()) chamarcreate_playlist(self), atualmente na linha 144 está errado:

    ...
    E 2013-06-10 08:26:12.817 http://www.onedayonemusic.com/page/2/ : found embeds ['80wWl_s-HuQ', 'kb1Nu75l1vA', 'kb1Nu75l1vA', 'RTWcNRQtkwE', 'RTWcNRQtkwE', 'ZtDXezAhes8', 'ZtDXezAhes8', 'cFGxNJhKK9c', 'cFGxNJhKK9c'
    I 2013-06-10 08:26:14.019 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
    I 2013-06-10 08:26:14.020 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
    I 2013-06-10 08:26:14.022 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus
    I 2013-06-10 08:26:14.100 Refreshing due to a 401
    I 2013-06-10 08:26:14.105 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
    I 2013-06-10 08:26:14.106 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
    I 2013-06-10 08:26:14.106 Refreshing access_token
    E 2013-06-10 08:26:18.994 Deadline exceeded while waiting for HTTP response from URL: https://accounts.google.com/o/oauth2/token Traceback (most recent call last): File "/pyt
    E 2013-06-10 08:26:18.996 http://www.onedayonemusic.com/page/3/ : found embeds ['80wWl_s-HuQ', '6VNu2MLdE0c', '6VNu2MLdE0c', 'YwQilKbK9Mk', 'YwQilKbK9Mk', 'KYdB3rectmc', 'KYdB3
    E 2013-06-10 08:26:18.996 crawl_videos end
    E 2013-06-10 08:26:18.996 create_playlist start
    E 2013-06-10 08:26:18.996 create_playlist got creds
    E 2013-06-10 08:26:18.996 create_playlist authorized creds

→ Por que o cron job funciona 5min após uma execução manual, mas falha 6 horas depois? Eu pensei que o token de atualização nunca expirou. O que estou fazendo de errado?

Note que este é o meu primeiro trabalho no GAE, e o meu segundo programa em Python, a revisão geral do código / conselho é muito bem-vindo, mas por favor seja gentil :)

O código está ativadoGitHub e minha instância pode ser alcançada emdailygrooves.org. Obrigado pela ajuda!

questionAnswers(1)

yourAnswerToTheQuestion