Implementing Twitter authorization in Pylons is easy as butter, I will show you how to do it in the next steps.
Download python-twitter and install it
https://code.google.com/p/python-twitter
python setup.py build
python setup.py install
Download and install dependencies
https://github.com/simplegeo/python-oauth2
http://code.google.com/p/httplib2/
http://cheeseshop.python.org/pypi/simplejson
Now you’re almost there. There’s a file called get_access_token.py that you need to call in order to obtain the Twitter session secret_token, but I decided to create a class based from that file instead. Save this class on your project lib folder as twittertoken.py.
import os
import sys
# parse_qsl moved to urlparse module in v2.6
try:
from urlparse import parse_qsl
except:
from cgi import parse_qsl
import oauth2 as oauth
REQUEST_TOKEN_URL = 'https://api.twitter.com/oauth/request_token'
ACCESS_TOKEN_URL = 'https://api.twitter.com/oauth/access_token'
AUTHORIZATION_URL = 'https://api.twitter.com/oauth/authorize'
SIGNIN_URL = 'https://api.twitter.com/oauth/authenticate'
class GenerateToken(object):
def __init__(self,consumer_key=None,consumer_secret=None):
if consumer_key is None or consumer_secret is None:
raise TokenError('please add a consumer key and secret')
else:
signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1()
self.oauth_consumer = oauth.Consumer(key=consumer_key, secret=consumer_secret)
self.oauth_client = oauth.Client(self.oauth_consumer)
def getrequestTokenURL(self):
resp, content = self.oauth_client.request(REQUEST_TOKEN_URL, 'GET')
if resp['status'] != '200':
raise TokenError('Invalid response from Twitter')
else:
request_token = dict(parse_qsl(content))
pieces = {
'url' : "%s?oauth_token=%s" % (AUTHORIZATION_URL, request_token['oauth_token']),
'token_secret': request_token['oauth_token_secret']
}
return pieces
def authRequest(self,oauth_token=None,oauth_token_secret=None,oauth_verifier=None):
token = oauth.Token(oauth_token,oauth_token_secret)
token.set_verifier(oauth_verifier)
oauth_client = oauth.Client(self.oauth_consumer, token)
resp, content = oauth_client.request(ACCESS_TOKEN_URL, method='POST', body='oauth_verifier=%s' % oauth_verifier)
access_token = dict(parse_qsl(content))
if resp['status'] != '200':
raise TokenError('The request for a Token %s did not succeed: %s' % (access_token,resp['status']) )
else:
auth = {
'access_token' : access_token['oauth_token'],
'access_token_secret' : access_token['oauth_token_secret'],
}
return auth
class TokenError(Exception):
'''Base class for Token errors'''
@property
def message(self):
'''Returns the first argument used to construct this error.'''
return self.args[0]
Usage
create a controller in this case I’ll create an account controller
paster controller account
import twitter
import PRJNAME.lib.twittertoken as twittertoken
def twitter_auth(self):
token = twittertoken.GenerateToken(consumer_key=config['twitter.key'], consumer_secret=config['twitter.secret'])
request_token = token.getrequestTokenURL()
#save the token secret it will be used to generate the user's access_token and and access_secret
session['token_secret'] = request_token['token_secret']
session.save()
# redirect to twitter screen
return redirect(url(request_token['url']))
def twitter_preferences(self):
params = request.params
twittertoken.GenerateToken(consumer_key=config['twitter.key'], consumer_secret=config['twitter.secret'])
auth = twittertoken.authRequest(oauth_token=params.get('oauth_token'),oauth_token_secret=session.get('token_secret'),oauth_verifier=params.get('oauth_verifier'))
if auth['access_token'] and auth['access_token_secret']:
#save to db or get user friend list
for u in api.GetFriends():
log.debug(u.name)
I hope it helps to someone looking to implement Twitter on their Pylons projects.