Skip to content
This repository was archived by the owner on Apr 3, 2022. It is now read-only.

Commit 6bd4418

Browse files
Henrik LiedHenrik Lied
authored andcommitted
First commit
0 parents  commit 6bd4418

File tree

9 files changed

+741
-0
lines changed

9 files changed

+741
-0
lines changed

README

Whitespace-only changes.

twitter_app/__init__.py

Whitespace-only changes.

twitter_app/models.py

Whitespace-only changes.

twitter_app/oauth.py

Lines changed: 524 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!DOCTYPE html>
2+
3+
<html>
4+
<head>
5+
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
6+
<title>Twitter Example</title>
7+
<style>
8+
#wrap {
9+
width: 600px;
10+
margin: 1em auto;
11+
font-family: Helvetica, Arial, sans-serif;
12+
}
13+
</style>
14+
</head>
15+
16+
<body>
17+
<div id="wrap">
18+
<h1>Twitter oAuth example</h1>
19+
20+
21+
{% block content %}
22+
<p><a href="auth/">Authenticate on Twitter</a></p>
23+
{% endblock %}
24+
25+
</div>
26+
</body>
27+
</html>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{% extends "twitter_app/base.html" %}
2+
3+
{% block content %}
4+
<h2>Here comes your friends:</h2>
5+
<ul>
6+
{% for json in users %}
7+
{% for twitter in json %}
8+
<li><a href="http://twitter.com/{{ twitter.screen_name }}">{{ twitter.screen_name }}</a></li>
9+
{% endfor %}
10+
{% endfor %}
11+
</ul>
12+
{% endblock %}

twitter_app/urls.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from django.conf.urls.defaults import *
2+
3+
from twitter_app.views import *
4+
5+
urlpatterns = patterns('twitter_app.views',
6+
url(r'^$',
7+
view=main,
8+
name='twitter_oauth_main'),
9+
10+
url(r'^auth/$',
11+
view=auth,
12+
name='twitter_oauth_auth'),
13+
14+
url(r'^return/$',
15+
view=return_,
16+
name='twitter_oauth_return'),
17+
18+
url(r'^list/$',
19+
view=friend_list,
20+
name='twitter_oauth_friend_list'),
21+
22+
url(r'^clear/$',
23+
view=unauth,
24+
name='twitter_oauth_unauth'),
25+
)

twitter_app/utils.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import oauth
2+
from django.conf import settings
3+
4+
5+
signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
6+
7+
SERVER = getattr(settings, 'OAUTH_SERVER', 'twitter.com')
8+
REQUEST_TOKEN_URL = getattr(settings, 'OAUTH_REQUEST_TOKEN_URL', 'https://%s/oauth/request_token' % SERVER)
9+
ACCESS_TOKEN_URL = getattr(settings, 'OAUTH_ACCESS_TOKEN_URL', 'https://%s/oauth/access_token' % SERVER)
10+
AUTHORIZATION_URL = getattr(settings, 'OAUTH_AUTHORIZATION_URL', 'http://%s/oauth/authorize' % SERVER)
11+
12+
CONSUMER_KEY = getattr(settings, 'CONSUMER_KEY', 'YOUR_KEY')
13+
CONSUMER_SECRET = getattr(settings, 'CONSUMER_SECRET', 'YOUR_SECRET')
14+
15+
# We use this URL to check if Twitters oAuth worked
16+
TWITTER_CHECK_AUTH = 'https://twitter.com/account/verify_credentials.json'
17+
TWITTER_FRIENDS = 'https://twitter.com/statuses/friends.json'
18+
19+
def request_oauth_resource(consumer, url, access_token, parameters=None, signature_method=signature_method):
20+
"""
21+
usage: request_oauth_resource( consumer, '/url/', your_access_token, parameters=dict() )
22+
Returns a OAuthRequest object
23+
"""
24+
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
25+
consumer, token=access_token, http_url=url, parameters=parameters,
26+
)
27+
oauth_request.sign_request(signature_method, consumer, access_token)
28+
return oauth_request
29+
30+
31+
def fetch_response(oauth_request, connection):
32+
url = oauth_request.to_url()
33+
connection.request(oauth_request.http_method, url)
34+
response = connection.getresponse()
35+
s = response.read()
36+
return s
37+
38+
def get_unauthorised_request_token(consumer, connection, signature_method=signature_method):
39+
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
40+
consumer, http_url=REQUEST_TOKEN_URL
41+
)
42+
oauth_request.sign_request(signature_method, consumer, None)
43+
resp = fetch_response(oauth_request, connection)
44+
token = oauth.OAuthToken.from_string(resp)
45+
return token
46+
47+
48+
def get_authorisation_url(consumer, token, signature_method=signature_method):
49+
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
50+
consumer, token=token, http_url=AUTHORIZATION_URL
51+
)
52+
oauth_request.sign_request(signature_method, consumer, token)
53+
return oauth_request.to_url()
54+
55+
def exchange_request_token_for_access_token(consumer, connection, request_token, signature_method=signature_method):
56+
oauth_request = oauth.OAuthRequest.from_consumer_and_token(
57+
consumer, token=request_token, http_url=ACCESS_TOKEN_URL
58+
)
59+
oauth_request.sign_request(signature_method, consumer, request_token)
60+
resp = fetch_response(oauth_request, connection)
61+
return oauth.OAuthToken.from_string(resp)
62+
63+
def is_authenticated(consumer, connection, access_token):
64+
oauth_request = request_oauth_resource(consumer, TWITTER_CHECK_AUTH, access_token)
65+
json = fetch_response(oauth_request, connection)
66+
if 'screen_name' in json:
67+
return json
68+
return False
69+
70+
def get_friends(consumer, connection, access_token, page=0):
71+
"""Get friends on Twitter"""
72+
oauth_request = request_oauth_resource(consumer, TWITTER_FRIENDS, access_token, {'page': page})
73+
json = fetch_response(oauth_request, connection)
74+
return json

twitter_app/views.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import oauth, httplib, simplejson, time, datetime
2+
3+
from django.http import *
4+
from django.shortcuts import render_to_response
5+
from django.core.urlresolvers import reverse
6+
7+
from twitter_app.utils import *
8+
9+
CONSUMER = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
10+
CONNECTION = httplib.HTTPSConnection(SERVER)
11+
12+
13+
def main(request):
14+
if request.session.has_key('access_token'):
15+
return HttpResponseRedirect(reverse('twitter_oauth_friend_list'))
16+
else:
17+
return render_to_response('twitter_app/base.html')
18+
19+
def unauth(request):
20+
response = HttpResponseRedirect(reverse('twitter_oauth_main'))
21+
request.session.clear()
22+
return response
23+
24+
def auth(request):
25+
"/auth/"
26+
token = get_unauthorised_request_token(CONSUMER, CONNECTION)
27+
auth_url = get_authorisation_url(CONSUMER, token)
28+
response = HttpResponseRedirect(auth_url)
29+
request.session['unauthed_token'] = token.to_string()
30+
return response
31+
32+
def return_(request):
33+
"/return/"
34+
unauthed_token = request.session.get('unauthed_token', None)
35+
if not unauthed_token:
36+
return HttpResponse("No un-authed token cookie")
37+
token = oauth.OAuthToken.from_string(unauthed_token)
38+
if token.key != request.GET.get('oauth_token', 'no-token'):
39+
return HttpResponse("Something went wrong! Tokens do not match")
40+
access_token = exchange_request_token_for_access_token(CONSUMER, CONNECTION, token)
41+
response = HttpResponseRedirect(reverse('twitter_oauth_friend_list'))
42+
request.session['access_token'] = access_token.to_string()
43+
return response
44+
45+
def friend_list(request):
46+
users = []
47+
48+
access_token = request.session.get('access_token', None)
49+
if not access_token:
50+
return HttpResponse("You need an access token!")
51+
token = oauth.OAuthToken.from_string(access_token)
52+
53+
# Check if the token works on Twitter
54+
auth = is_authenticated(CONSUMER, CONNECTION, token)
55+
if auth:
56+
# Load the credidentials from Twitter into JSON
57+
creds = simplejson.loads(auth)
58+
name = creds.get('name', creds['screen_name']) # Get the name
59+
60+
# Get number of friends. The API only returns 100 results per page,
61+
# so we might need to divide the queries up.
62+
friends_count = str(creds.get('friends_count', '100'))
63+
pages = int( (int(friends_count)/100) ) + 1
64+
pages = min(pages, 10) # We only want to make ten queries
65+
66+
67+
68+
for page in range(pages):
69+
friends = get_friends(CONSUMER, CONNECTION, token, page+1)
70+
71+
# if the result is '[]', we've reached the end of the users friends
72+
if friends == '[]': break
73+
74+
# Load into JSON
75+
json = simplejson.loads(friends)
76+
77+
users.append(json)
78+
79+
return render_to_response('twitter_app/list.html', {'users': users})

0 commit comments

Comments
 (0)