twitter.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. '''
  2. twitter.py contains a handful of methods for interacting
  3. with Twitter data and returning the responses as JSON.
  4. '''
  5. import urlparse
  6. import oauth2 as oauth
  7. import requests
  8. import base64, random
  9. import urllib
  10. import binascii
  11. import time, collections, json, hmac, hashlib
  12. import simplejson as json2
  13. request_token_url = 'https://api.twitter.com/oauth/request_token'
  14. access_token_url = 'https://api.twitter.com/oauth/access_token'
  15. authorize_url = 'https://api.twitter.com/oauth/authorize'
  16. class TwitterOauthClient(object):
  17. '''
  18. Python Client for Twitter API.
  19. '''
  20. oauth_token = None
  21. oauth_token_secret = None
  22. def __init__(self, consumer_key, consumer_secret, access_token, access_token_secret):
  23. '''
  24. Parameters:
  25. consumer_key: String
  26. - The consumer_key from registering application
  27. on Instagram.
  28. consumer_secret: String
  29. - The consumer_secret from registering application
  30. on Instagram.
  31. '''
  32. self.consumer_key = consumer_key
  33. self.consumer_secret = consumer_secret
  34. self.access_token = access_token
  35. self.access_token_secret = access_token_secret
  36. self.consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret)
  37. def get_authorize_url(self):
  38. '''
  39. Obtained oauth_token and oauth_token_secret from request_token_url,
  40. returns an authorize url.
  41. From the redirect url, we obtain the oauth verifier.
  42. '''
  43. client = oauth.Client(self.consumer)
  44. resp, content = client.request(request_token_url, 'GET')
  45. if int(resp['status']) != 200:
  46. raise Exception('Invalid response %s' %resp['status'])
  47. request_token = dict(urlparse.parse_qsl(content))
  48. #temporary
  49. self.oauth_token = request_token['oauth_token']
  50. self.oauth_token_secret = request_token['oauth_token_secret']
  51. print self.oauth_token
  52. #link to authorize app access twitter data and return to twitter api example page
  53. link = authorize_url+"?oauth_token="+self.oauth_token+"&redirect_uri=http%3A%2F%2Flocalhost%3A8000/hackathon/twitter/"
  54. return link
  55. def get_access_token_url(self, oauth_verifier):
  56. token = oauth.Token(self.oauth_token, self.oauth_token_secret)
  57. token.set_verifier(oauth_verifier)
  58. client = oauth.Client(self.consumer, token)
  59. resp, content = client.request(access_token_url, 'POST')
  60. if int(resp['status']) != 200:
  61. raise Exception('Invalid response %s' %resp['status'])
  62. print content
  63. access_token = dict(urlparse.parse_qsl(content))
  64. #permanent
  65. self.oauth_token = access_token['oauth_token']
  66. self.oauth_token_secret = access_token['oauth_token_secret']
  67. self.user_id = access_token['user_id']
  68. self.username = access_token['screen_name']
  69. def get_trends_available(self):
  70. method = "get"
  71. link ='https://api.twitter.com/1.1/trends/available.json'
  72. oauth_parameters = get_oauth_parameters(
  73. self.consumer_key,
  74. self.access_token
  75. )
  76. oauth_parameters['oauth_signature'] = generate_signature(
  77. method,
  78. link,
  79. oauth_parameters,
  80. self.consumer_key,
  81. self.consumer_secret,
  82. self.access_token_secret
  83. )
  84. headers = {'Authorization': create_auth_header(oauth_parameters)}
  85. req = requests.get(link, headers=headers)
  86. print req.status_code
  87. if int(req.status_code) != 200:
  88. raise Exception('Invalid response %s' %req.status_code)
  89. content = json2.loads(req.content)[0]
  90. print content
  91. def percent_encode(string):
  92. '''
  93. Percent encode strings.
  94. '''
  95. return urllib.quote(string, safe='~')
  96. def get_nonce():
  97. '''
  98. Generate unique token per request.
  99. '''
  100. n = base64.b64encode(''.join([str(random.randint(0, 9)) for i in range(24)]))
  101. return n
  102. def generate_signature(method, url, oauth_parameters, oauth_consumer_key, oauth_consumer_secret, oauth_token_secret=None, status=None):
  103. '''
  104. Generate signature.
  105. '''
  106. parameters = urllib.urlencode(collections.OrderedDict(sorted(oauth_parameters.items())))
  107. #Create your Signature Base String
  108. signature_base_string = ( method.upper() + '&' + percent_encode(str(url)) + '&' + percent_encode(parameters))
  109. #Get the signing key
  110. signing_key = create_signing_key(oauth_consumer_secret, oauth_token_secret)
  111. return calculate_signature(signing_key, signature_base_string)
  112. def calculate_signature(signing_key, signature_base_string):
  113. '''
  114. Calculate signature using HMAC-SHA1 hashing algorithm.
  115. '''
  116. hashed = hmac.new(signing_key, signature_base_string, hashlib.sha1)
  117. sig = binascii.b2a_base64(hashed.digest())[:-1]
  118. return percent_encode(sig)
  119. def create_signing_key(oauth_consumer_secret, oauth_token_secret):
  120. '''
  121. Creates a key to sign the request with.
  122. '''
  123. signing_key = percent_encode(oauth_consumer_secret) + '&' + percent_encode(oauth_token_secret)
  124. return signing_key
  125. def create_auth_header(parameters):
  126. '''
  127. Format authorization header with oath parameters.
  128. '''
  129. ordered_parameters = collections.OrderedDict(sorted(parameters.items()))
  130. auth_header = ('%s="%s"' % (k, v) for k, v in ordered_parameters.iteritems())
  131. return "OAuth " + ', '.join(auth_header)
  132. def get_oauth_parameters(consumer_key, access_token):
  133. '''
  134. Returns parameters for making requests.
  135. '''
  136. oauth_parameters = {
  137. 'oauth_timestamp': str(int(time.time())),
  138. 'oauth_signature_method': "HMAC-SHA1",
  139. 'oauth_version': "1.0",
  140. 'oauth_token': access_token,
  141. 'oauth_nonce': get_nonce(),
  142. 'oauth_consumer_key': consumer_key
  143. }
  144. return oauth_parameters