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 :

Mogę ręcznie uruchomić moją pracę dzwoniąc/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=offlinei 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!

questionAnswers(1)

yourAnswerToTheQuestion