Import kontaktów Google za pomocą oauth2. 0

Jakie są możliwe sposoby importowania kontaktów google za pomocą Pythona i oauth2.0?

Udało nam się uzyskać poświadczenia, a nasza aplikacja prosi o dostęp do kontaktów, ale po otrzymaniu poświadczeń nie mogę znaleźć sposobu na wykrycie interfejsu API kontaktów.

Takie rzeczy jak:

 from apiclient.discover import build
 import httplib2
 http = httplib2.Http()
 #Authorization
 service = build("contacts", "v3", http=http) 

Daje nam UnknownApiNameOrVersion wyjątek. Wygląda na to, że API kontaktów nie znajduje się na liście obsługiwanych API dla apiclient.

Szukam alternatywnych sposobów.
Author: bossylobster, 2012-04-17

2 answers

Google Contacts API nie może być używany z biblioteką google-api-python-client, ponieważ jest to Google Data API, podczas gdy google-api-python-client jest przeznaczony do użytku z API oparte na odkryciach.

Zamiast przechodzić przez wszystkie problemy opisane przez @NikolayFominyh, możesz użyć natywnego wsparcia dla OAuth 2.0 w gdata-python-client.

Aby uzyskać prawidłowy token, postępuj zgodnie z instrukcjami programistów Google post na blogu, aby uzyskać szczegółowy opis proces.

Najpierw Utwórz obiekt tokenowy:

import gdata.gauth

CLIENT_ID = 'bogus.id'  # Provided in the APIs console
CLIENT_SECRET = 'SeCr3Tv4lu3'  # Provided in the APIs console
SCOPE = 'https://www.google.com/m8/feeds'
USER_AGENT = 'dummy-sample'

auth_token = gdata.gauth.OAuth2Token(
    client_id=CLIENT_ID, client_secret=CLIENT_SECRET,
    scope=SCOPE, user_agent=USER_AGENT)
Następnie Autoryzuj swoją aplikację za pomocą tego tokena:]}
APPLICATION_REDIRECT_URI = 'http://www.example.com/oauth2callback'
authorize_url = auth_token.generate_authorize_url(
    redirect_uri=APPLICATION_REDIRECT_URI)

Po wygenerowaniu tego authorize_url, ty (lub użytkownicy Twojej aplikacji) będziesz musiał ją odwiedzić i zaakceptować monit OAuth 2.0. Jeśli jest to w aplikacji internetowej, możesz po prostu przekierować, w przeciwnym razie musisz odwiedzić link w przeglądarce.

Po autoryzacji wymień kod na token:

import atom.http_core

redirect_url = 'http://www.example.com/oauth2callback?code=SOME-RETURNED-VALUE'
url = atom.http_core.ParseUri(redirect_url)
auth_token.get_access_token(url.query)

W przypadku, gdy odwiedziłeś przeglądarkę, musisz skopiować adres URL, na który zostałeś przekierowany do zmiennej redirect_url.

W przypadku, gdy jesteś w aplikacji internetowej, będziesz mógł określić obsługę ścieżki /oauth2callback (na przykład) i po prostu możesz pobrać parametr zapytania code, aby wymienić Kod na token. Na przykład, jeśli używasz WebOb:

redirect_url = atom.http_core.Uri.parse_uri(self.request.uri)

W końcu Autoryzuj swojego klienta tym tokenem:

import gdata.contacts.service

client = gdata.contacts.service.ContactsService(source='appname')
auth_token.authorize(client)

Aktualizacja (12 + miesięcy po oryginalnej odpowiedzi):

Na przemian możesz użyć google-api-python-client wsparcie jak opisałem w blogu .

 21
Author: bossylobster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:59

Ostateczne rozwiązanie było stosunkowo łatwe.

Krok 1 Uzyskaj token oauth2.0. To jest dość udokumentowane w oficjalnych dokumentach: http://code.google.com/p/google-api-python-client/wiki/OAuth2

Krok 2 Teraz mamy token, ale nie możemy odkryć kontaktów API. Można jednak zauważyć, że w OAuth2. 0 playground można importować kontakty. https://code.google.com/oauthplayground/

Możesz znaleźć, że masz token dostępu w poświadczeniach, uzyskanych w Punkt 1. Aby uzyskać dostęp do API kontaktów należy dodać do nagłówków następujące param 'Authorization':'OAuth %s' % access_token

Krok 3 Teraz musisz przejść do Google library token, który będzie kompatybilny z oauth1. 0 token. Można to zrobić za pomocą następującego kodu:

from atom.http import ProxiedHttpClient #Google contacts use this client
class OAuth2Token(object):
    def __init__(self, access_token):
        self.access_token=access_token

    def perform_request(self, *args, **kwargs):
        url = 'http://www.google.com/m8/feeds/contacts/default/full'
        http = ProxiedHttpClient()
        return http.request(
            'GET',
            url,
            headers={
                'Authorization':'OAuth %s' % self.access_token
            }
        )
google = gdata.contacts.service.ContactsService(source='appname')
google.current_token = OAuth2Token(oauth2creds.access_token)
feed = google.GetContactsFeed()
 2
Author: Nikolay Fominyh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 21:35:53