Access an Atom Gmail feed using OAuth

I am trying to grab a Gmail atom feed from a python application using OAuth. I have a working application that downloads the Google Reader feed, and I think it's just a matter of changing the scope and URL of the feed. After replacing the URLs, I can still successfully get the Request and Access tokens, but when I try to grab the feed using the access token, I get the "401 Unauthorized" error. Here is my simple test program:

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 

You will notice that I use "anonymous / anonymous" as my OAuth key / secret, as stated in Google docs for unregistered applications . This works great for a Google reader, so I see no reason why it shouldn't work in Gmail. Does anyone have an idea why this might not work, or how can I solve the problem? Thanks.

+6
python oauth gmail gdata
source share
1 answer

You might want to try accessing Google’s IMAP servers using OAuth instead of using the ATOM feed. After a little googling, I found this :

"Gmail supports OAuth through IMAP and SMTP through a standard that they call XOAUTH. It allows you to authenticate against Gmail IMAP and SMTP servers using the OAuth token and secret. It also has the added benefit of using vanilla SMTP and IMAP libraries. The python-oauth2 package provides "IMAP and SMTP libraries that implement XOAUTH and complete imaplib.IMAP4_SSL and smtplib.SMTP. This allows you to connect to Gmail with OAuth credentials using standard Python."

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

+3
source share

All Articles