Jak uniknąć 'Nie można pobrać tokena dostępu: {„błąd”: „invalid_grant”}' w zadaniach cron offline GAE?
Ten wpis jest kontynuacjąJak wykonać operacje „access_type = offline” / tylko OAuth2 na serwerze na GAE / Python. Thehttp = credentials.authorize(httplib2.Http())
część nie kończy się niepowodzeniem podczas testowania, ale wydaje się, że nadal działa, gdy jest uruchamiany przez cron GAE, gdzie nie jest w stanie odświeżyć mojegoaccess_token
:
/fetch
, powiedzmy o 11:45.Planowanie natychmiastowe/cronfetch
wtedy praca o 11:55, bezaccess_token
kwestia.Ale obudziłem się dziś rano, widząc, żepodobnie /cronfetch
zadanie (z wyjątkiem czasu, który jest o 01:00 dla mojego nie-testowego zadania dziennego) nie powiodło się:
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
ToUzyskanie błędu „invalid_grant” podczas odświeżania tokena wiadomość z listy mailingowej (+SO post 1, SO post 2, SO post 3) wyglądają podobnie do mojego problemu, ale wydaje się, że dzieje się to za pomocąaccess_type=online
znak. W moim przypadku używam tylko domyślnegoaccess_type=offline
i widzę„Wykonaj te operacje, gdy nie korzystam z aplikacji” wspomnieć w początkowym żądaniu dostępu.
Po prostu ponownie zaplanowałem uruchomienie crona o 08:25 (uważając, aby nie uruchomić instrukcji ręcznej) z instrukcjami drukowania debugowania, które zatwierdziłem dla GitHub. Oto co otrzymuję, jest podobny, ale nie identyczny (uwaga: kilka ostatnich linii wydaje się niepoprawnie uporządkowanych, zdecydowanie nie robię rzeczy OAuth2 wcreate_playlist
aż wszystkie źródła zostaną odczytane). Wygląda na to, że ignorując zniekształcony porządek (artefakt rejestrowania GAE?)mójhttp = credentials.authorize(Http())
przywołaćcreate_playlist(self)
, obecnie w linii 144 jest źle:
...
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
→ Dlaczego praca crona działa 5 minut po uruchomieniu ręcznym, ale kończy się 6 godzin później? Myślałem, że token odświeżania nigdy nie wygasł. Co ja robię źle?
Zauważ, że jest to moja pierwsza praca w GAE, a mój drugi program w Pythonie w ogóle, ogólne recenzje / porady dotyczące kodu są bardzo mile widziane, ale proszę bądź delikatny :)
Kod jest włączonyGitHub a moja instancja może być osiągnięta nadailygrooves.org. Dzięki za pomoc!