2010-07-03 5 views
6

Ich versuche, die Gmail atom feed aus einer Python-Anwendung mit OAuth greifen. Ich habe eine funktionierende Anwendung, die den Google Reader-Feed herunterlädt, und ich denke, dass einfach eine Frage der Änderung des Umfangs und Feed-URLs sein sollte. Nach dem Ersetzen der URLs kann ich noch immer Request- und Access-Token erhalten, aber wenn ich versuche, den Feed mit dem Access-Token zu greifen, erhalte ich den Fehler "401 Unauthorized". Hier ist mein einfaches Testprogramm:Zugriff auf Gmail-Atom-Feed mit OAuth

import urlparse 
import oauth2 as oauth 

scope = "https://mail.google.com/mail/feed/atom/" 
sub_url = scope + "unread" 

request_token_url = "https://www.google.com/accounts/OAuthGetRequestToken?scope=%s&xoauth_displayname=%s" % (scope, "Test Application") 
authorize_url = 'https://www.google.com/accounts/OAuthAuthorizeToken' 
access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken' 

oauth_key = "anonymous" 
oauth_secret = "anonymous" 

consumer = oauth.Consumer(oauth_key, oauth_secret) 
client = oauth.Client(consumer) 

# Get a request token. 
resp, content = client.request(request_token_url, "GET") 
request_token = dict(urlparse.parse_qsl(content)) 

print "Request Token:" 
print " - oauth_token  = %s" % request_token['oauth_token'] 
print " - oauth_token_secret = %s" % request_token['oauth_token_secret'] 
print 

# Step 2: Link to web page where the user can approve the request token. 
print "Go to the following link in your browser:" 
print "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token']) 
print 

raw_input('Press enter after authorizing.') 

# Step 3: Get access token using approved request token 
token = oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret']) 
client = oauth.Client(consumer, token) 

resp, content = client.request(access_token_url, "POST") 
access_token = dict(urlparse.parse_qsl(content)) 

print "Access Token:" 
print " - oauth_token  = %s" % access_token['oauth_token'] 
print " - oauth_token_secret = %s" % access_token['oauth_token_secret'] 
print 

# Access content using access token 
token = oauth.Token(access_token['oauth_token'], access_token['oauth_token_secret']) 
client = oauth.Client(consumer, token) 

resp, content = client.request(sub_url, 'GET') 
print content 

Sie werden bemerken, dass ich ‚anonym/anonymous‘ als meine OAuth Schlüssel/geheimen bin mit, wie in den Google documents for unregistered applications erwähnt. Das funktioniert gut für Google Reader, daher sehe ich keinen Grund, warum es nicht für Google Mail funktionieren sollte. Hat jemand eine Idee, warum das nicht funktionieren könnte oder wie ich es beheben könnte? Vielen Dank.

+0

Gibt es einen Grund, warum Sie diese selbst implementieren? Schauen Sie sich http://libgmail.sourceforge.net/ an. Wie auch immer, dies ist keine Antwort auf Ihre Frage, also hier ist es in einem Kommentar! – alecwh

+1

@alecwh: libgmail scheint zu erfordern, dass mein Programm den Benutzernamen und das Passwort des Benutzers kennt. Ich versuche das zu vermeiden, wenn ich kann, weshalb ich oauth benutzen möchte. – Will

Antwort

3

Sie können versuchen, auf die IMAP-Server von Google mit OAuth zuzugreifen, anstatt den ATOM-Feed zu verwenden. Nach ein wenig Googeln fand ich this:

„Gmail unterstützt OAuth über IMAP und SMTP über einen Standard sie XOAUTH nennen Auf diese Weise können Sie gegen die Google Mail-IMAP und SMTP-Server mit ein OAuth-Token und geheim authentifizieren. . Es hat auch den zusätzlichen Vorteil, dass Sie Vanille-SMTP und IMAP Bibliotheken verwenden. Das python-oauth2 Paket beide IMAP und SMTP-Bibliotheken bietet die XOAUTH und wickeln imaplib.IMAP4_SSL und smtplib.SMTP. Diese implementieren erlaubt Sie können eine Verbindung mit Gmail mit OAuth-Anmeldeinformationen herstellen, indem Sie die Python-Standardbibliotheken verwenden. "

von http://github.com/simplegeo/python-oauth2

+0

Danke. Das sieht aus wie ich brauche. Ich bin mir nicht sicher, warum der Google Mail-Feed nicht funktioniert, aber anscheinend ist er in den gdata-APIs sowieso Bürger zweiter Klasse. – Will

+0

Kein Problem! Freue mich zu helfen. – alecwh