- Author:
- henriklied
- Posted:
- March 3, 2009
- Language:
- Python
- Version:
- 1.0
- Score:
- 9 (after 9 ratings)
UPDATE: A more complete example is up on GitHub
Based around Simon Willison's Fire Eagle oAuth, this will allow you to develop Twitter oAuth applications (…that is – if you're in the closed beta)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | import oauth, httplib, simplejson, time, datetime
from django.http import *
from django.conf import settings
from django.shortcuts import render_to_response
SERVER = getattr(settings, 'OAUTH_SERVER', 'twitter.com')
REQUEST_TOKEN_URL = getattr(settings, 'OAUTH_REQUEST_TOKEN_URL', 'https://%s/twitter_app/request_token' % SERVER)
ACCESS_TOKEN_URL = getattr(settings, 'OAUTH_ACCESS_TOKEN_URL', 'https://%s/twitter_app/access_token' % SERVER)
AUTHORIZATION_URL = getattr(settings, 'OAUTH_AUTHORIZATION_URL', 'http://%s/twitter_app/authorize' % SERVER)
CONSUMER_KEY = getattr(settings, 'CONSUMER_KEY', 'YOUR_CONSUMER_KEY')
CONSUMER_SECRET = getattr(settings, 'CONSUMER_SECRET', 'YOUR_CONSUMER_SECRET')
# We use this URL to check if Twitters oAuth worked
TWITTER_CHECK_AUTH = 'https://twitter.com/account/verify_credentials.json'
TWITTER_FRIENDS = 'https://twitter.com/statuses/friends.json'
connection = httplib.HTTPSConnection(SERVER)
consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
# Shortcut around oauth.OauthRequest
def request(url, access_token, parameters=None):
"""
usage: request( '/url/', your_access_token, parameters=dict() )
Returns a OAuthRequest object
"""
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
consumer, token=access_token, http_url=url, parameters=parameters,
)
oauth_request.sign_request(signature_method, consumer, access_token)
return oauth_request
def fetch_response(oauth_request, connection):
url = oauth_request.to_url()
connection.request(oauth_request.http_method,url)
response = connection.getresponse()
s = response.read()
return s
def get_unauthorised_request_token():
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
consumer, http_url=REQUEST_TOKEN_URL
)
oauth_request.sign_request(signature_method, consumer, None)
resp = fetch_response(oauth_request, connection)
token = oauth.OAuthToken.from_string(resp)
return token
def get_authorisation_url(token):
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
consumer, token=token, http_url=AUTHORIZATION_URL
)
oauth_request.sign_request(signature_method, consumer, token)
return oauth_request.to_url()
def exchange_request_token_for_access_token(request_token):
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
consumer, token=request_token, http_url=ACCESS_TOKEN_URL
)
oauth_request.sign_request(signature_method, consumer, request_token)
resp = fetch_response(oauth_request, connection)
return oauth.OAuthToken.from_string(resp)
def is_authenticated(access_token):
oauth_request = request(TWITTER_CHECK_AUTH, access_token)
json = fetch_response(oauth_request, connection)
if 'screen_name' in json:
return json
return False
def get_friends(access_token):
"""Get friends on Twitter"""
oauth_request = request(TWITTER_FRIENDS, access_token, {'page': page})
json = fetch_response(oauth_request, connection)
return json
### DJANGO VIEWS BELOW THIS LINE
def main(request):
if request.get_host().startswith('www.') or '/labs/followers/' in request.path: # Should really be middleware
return HttpResponseRedirect("http://fourmargins.com/labs/following/")
if request.session.has_key('access_token'):
return HttpResponseRedirect('/list/')
else:
return render_to_response('oauth/base.html')
def unauth(request):
response = HttpResponseRedirect('/')
request.session.clear()
return response
def auth(request):
"/auth/"
token = get_unauthorised_request_token()
auth_url = get_authorisation_url(token)
response = HttpResponseRedirect(auth_url)
request.session['unauthed_token'] = token.to_string()
return response
def return_(request):
"/return/"
unauthed_token = request.session.get('unauthed_token', None)
if not unauthed_token:
return HttpResponse("No un-authed token cookie")
token = oauth.OAuthToken.from_string(unauthed_token)
if token.key != request.GET.get('oauth_token', 'no-token'):
return HttpResponse("Something went wrong! Tokens do not match")
access_token = exchange_request_token_for_access_token(token)
response = HttpResponseRedirect('/list/')
request.session['access_token'] = access_token.to_string()
return response
def get_friends(request):
users = []
access_token = request.session.get('access_token', None)
if not access_token:
return HttpResponse("You need an access token!")
token = oauth.OAuthToken.from_string(access_token)
# Check if the token works on Twitter
auth = is_authenticated(token)
if auth:
# Load the credidentials from Twitter into JSON
creds = simplejson.loads(auth)
name = creds.get('name', creds['screen_name']) # Get the name
# Get number of friends. The API only returns 100 results per page,
# so we might need to divide the queries up.
friends_count = str(creds.get('friends_count', '100'))
pages = int( (int(friends_count)/100) ) + 1
pages = min(pages, 10) # We only want to make ten queries
for page in range(pages):
friends = get_friends(token, page+1)
# if the result is '[]', we've reached the end of the users friends
if friends == '[]': break
# Load into JSON
json = simplejson.loads(friends)
users.append(json)
return render_to_response('oauth/list.html', {'users': users})
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 1 week ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 6 months ago
Comments
Hi,
I am getting the following error while trying to connect to twitter.com
Exception Type: error Exception Value:
(111, 'Connection refused')
Exception Location: /usr/lib/python2.6/socket.py in create_connection, line 514
Also, I am working behind proxy. How can I access twitter.com using oauth if I am working behind proxy?
thanks ashwin
#
Please login first before commenting.