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})
|
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
#