2010-07-03 13 views
6

Estoy tratando de tomar el Gmail atom feed desde una aplicación de Python usando OAuth. Tengo una aplicación que funciona que descarga el feed de Google Reader, y creo que debería ser simplemente una cuestión de cambiar el alcance y alimentar las URL. Después de reemplazar las URL, todavía puedo obtener tokens de solicitud y acceso con éxito, pero cuando intento capturar la fuente con el token de acceso, aparece un error "401 no autorizado". Aquí está mi programa simple prueba:Acceso a la alimentación de atom de Gmail usando 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 

Se dará cuenta de que estoy usando 'anónimo/anónima' como mi clave OAuth/secreta, como se mencionó en el Google documents for unregistered applications. Esto funciona bien para Google Reader, por lo que no veo ningún motivo por el que no debería funcionar para Gmail. ¿Alguien tiene alguna idea sobre por qué esto podría no funcionar, o cómo podría solucionarlo? Gracias.

+0

¿Existe una razón por la que está implementando esto por sí mismo? Consulte http://libgmail.sourceforge.net/. De todos modos, esta no es una respuesta a tu pregunta, ¡aquí está en un comentario! – alecwh

+1

@alecwh: libgmail parece requerir que mi programa conozca el nombre de usuario y la contraseña del usuario. Estoy tratando de evitar eso si puedo, y es por eso que quiero usar oauth. – Will

Respuesta

3

Es posible que desee intentar acceder a los servidores IMAP de Google con OAuth en lugar de utilizar el feed ATOM. Después de un poco de googling encontré this:

"Gmail es compatible con OAuth sobre IMAP y SMTP a través de una norma que llaman XOAUTH Esto le permite autenticar contra servidores IMAP y SMTP de Gmail usando un token de OAuth y secreto. . se también tiene la ventaja añadida de permitir que de usar SMTP e IMAP vainilla bibliotecas. el paquete python-OAuth2 proporciona tanto IMAP y SMTP bibliotecas que implementan XOAUTH y envolver imaplib.IMAP4_SSL y smtplib.SMTP. Este permite puede conectarse a Gmail con credenciales de OAuth usando las bibliotecas estándar de Python ".

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

+0

Gracias. Esto se ve como lo que necesito. No estoy seguro de por qué el feed de Gmail no funciona, pero de todos modos parece ser un ciudadano de segunda clase en las API de gdata. – Will

+0

¡Ningún problema! Feliz de ayudar. – alecwh

Cuestiones relacionadas