2010-07-03 7 views
6

J'essaie de récupérer le Gmail atom feed à partir d'une application python utilisant OAuth. J'ai une application de travail qui télécharge le flux Google Reader, et je pense que devrait simplement être une question de changer la portée et les URL de flux. Après avoir remplacé les URL, je peux toujours obtenir des jetons Demande et Accès, mais lorsque j'essaie de récupérer le flux à l'aide du jeton Access, j'obtiens une erreur "401 Non autorisé". Voici mon programme de test simple:Accéder au flux atomique Gmail à l'aide de 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 

Vous remarquerez que j'utilise « anonyme/anonyme » comme ma clé OAuth/secret, comme mentionné dans le Google documents for unregistered applications. Cela fonctionne bien pour google reader, donc je ne vois pas pourquoi cela ne devrait pas fonctionner pour Gmail. Est-ce que quelqu'un a une idée de pourquoi cela pourrait ne pas fonctionner, ou comment je pourrais y remédier? Merci.

+0

Y at-il une raison pour laquelle vous implémentez vous-même? Consultez http://libgmail.sourceforge.net/. De toute façon ce n'est pas une réponse à ta question alors voilà dans un commentaire! – alecwh

+1

@alecwh: libgmail semble exiger que mon programme connaisse le nom d'utilisateur et le mot de passe de l'utilisateur. J'essaie d'éviter cela si je peux, c'est pourquoi je veux utiliser oauth. – Will

Répondre

3

Vous pouvez essayer d'accéder aux serveurs IMAP de Google avec OAuth au lieu d'utiliser le flux ATOM. Après un peu googler j'ai trouvé this:

« soutient Gmail OAuth sur IMAP et SMTP via une norme qu'ils appellent XOAUTH Cela vous permet d'authentifier contre les serveurs IMAP de Gmail et SMTP en utilisant un jeton et secret OAuth. . Il a aussi l'avantage de permettre vous d'utiliser des bibliothèques SMTP de vanille et IMAP . le paquet python-oauth2 fournit à la fois les bibliothèques IMAP et SMTP qui mettent en œuvre XOAUTH et envelopper imaplib.IMAP4_SSL et smtplib.SMTP. Cette permet vous vous connectez à Gmail avec les informations d'identification OAuth en utilisant les bibliothèques standard Python . "

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

+0

Merci. Cela ressemble à ce dont j'ai besoin. Je ne suis pas sûr de savoir pourquoi le flux gmail ne fonctionne pas, mais de toute façon il semble que ce soit un citoyen de seconde classe dans les API gdata. – Will

+0

Pas de problème! Heureux d'aider. – alecwh

Questions connexes