2012-12-06 409 views
4

我正在尋找一種很好的方法來檢索我的聯繫人的每個電子郵件地址從谷歌帳戶爲Python中的「桌面」應用程序。Google聯繫人API - Auth2.0

第一次,我通過谷歌代碼創建了一個應用程序。我切換Google Plus API,檢索我的大部分用戶數據,但不是我的任何聯繫人。

我開始調查了,發現了很多東西,但其中大部分已經過時了。

我發現取回我的聯繫人的好方法,使用GDATA庫,但我賦予它一個完整的讀/寫訪問,通過https://www.google.com/m8/feeds沒有反饋。

self.gd_client = gdata.contacts.client.ContactsClient(source='MyAppliName') 
self.gd_client.ClientLogin(email, password, self.gd_client.source) 

根據官方的「谷歌接觸的API」谷歌組,遷移到計算器,只讀訪問被打破。

順便說一句,我不是「相信我的申請一個巨大的風扇,我用只讀訪問,我發誓。」

我發現谷歌的API遊樂場https://developers.google.com/oauthplayground在他們使用的OAuth2.0令牌與大多數API,包括接觸,切換網頁:

谷歌的OAuth 2.0遊樂場請求權限:

  • 管理聯繫人

根據這個操場,可以使用OAuth2.0與谷歌聯繫api,但我不知道如何將https:// www.google.com/m8/feeds添加到我的範圍,它不會沒有出現在名單上。

有沒有其他方法可以做到這一點?

回答

1

請求應該是這樣的:

https://accounts.google.com/o/oauth2/auth? 
scope=https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds& 
state=<myState>& 
redirect_uri=<Redirect URI>& 
response_type=code& 
client_id=<my Client ID>&approval_prompt=force 

這將獲得讀取到用戶的聯繫人/寫訪問。

4

如果這個問題仍然是開放的你,這裏是一些示例代碼如何使用的oauth2和谷歌聯繫人API第3版:

import gdata.contacts.client 
from gdata.gauth import AuthSubToken 
from oauth2client import tools 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.file import Storage 


def oauth2_authorize_application(client_secret_file, scope, credential_cache_file='credentials_cache.json'): 
    """ 
    authorize an application to the requested scope by asking the user in a browser. 

    :param client_secret_file: json file containing the client secret for an offline application 
    :param scope: scope(s) to authorize the application for 
    :param credential_cache_file: if provided or not None, the credenials will be cached in a file. 
     The user does not need to be reauthenticated 
    :return OAuth2Credentials object 
    """ 
    FLOW = flow_from_clientsecrets(client_secret_file, 
            scope=scope) 

    storage = Storage(credential_cache_file) 
    credentials = storage.get() 

    if credentials is None or credentials.invalid: 
     # Run oauth2 flow with default arguments. 
     credentials = tools.run_flow(FLOW, storage, tools.argparser.parse_args([])) 

    return credentials 

SCOPES = ['https://www.google.com/m8/feeds/', 'https://www.googleapis.com/auth/userinfo.email'] 

credentials = oauth2_authorize_application('client-secret.json', scope=SCOPES) 
token_string = credentials.get_access_token().access_token 

# deprecated! 
# auth_token = AuthSubToken(token_string, SCOPES) 

with open('client-secret.json') as f: 
    oauth2_client_secret = json.load(f) 

auth_token = gdata.gauth.OAuth2Token(
    client_id=oauth2_client_secret['web']['client_id'], 
    client_secret=oauth2_client_secret['web']['client_secret'], 
    scope=SCOPES, 
    user_agent='MyUserAgent/1.0', 
    access_token=credentials.get_access_token().access_token, 
    refresh_token=credentials.refresh_token) 


client = gdata.contacts.client.ContactsClient(auth_token=auth_token) 

query = gdata.contacts.client.ContactsQuery() 
+0

+1這一點。我一直在尋找一個很好的例子來說明如何驗證針對Python的Google Contacts API v3的CRUD請求,並且我終於找到了它。謝謝。 – Mario

+0

關於此代碼的一點更新。 AuthSubToken已棄用,但可以使用gdata.gauth.Oaut2Token。我更新了這個例子。 – Paul