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
:
/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=offline
e 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!