Advertisement
codemonkey

JtvClient.py

Oct 11th, 2011
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.93 KB | None | 0 0
  1. from oauth import OAuthConsumer, OAuthRequest, OAuthToken, OAuthSignatureMethod_HMAC_SHA1
  2. import httplib
  3.  
  4. # # Usage:
  5. #
  6. # # Two-legged (for making requests that don't require a user, like /stream/summary.json or /user/create/LOGIN.xml):
  7. # client = JtvClient('XXXXXXXX', 'XXXXXXXXXXXXXXXXXXX')
  8. # response = client.get('/stream/summary.xml')
  9. # print response.read()
  10. #
  11. # # Three-legged (after authenticating a user, for making requests on that user's behalf like /clip/create.xml or channel/update/LOGIN.json):
  12. # token = OAuthToken('XXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXX') # These are the user's access token and access secret
  13. # client = JtvClient('XXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXX') # These are your application key and secret
  14. # response = client.post('/user/update/LOGIN.xml', {'title': 'NEW TITLE'}, token)
  15. # print response.read()
  16. #
  17. # # Authenticating a user (for getting an access token you can use for three-legged oauth):
  18. # client = JtvClient('XXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXX') # These are your application key and secret
  19. # request_token, url = client.make_request_token_and_authorization_url("http://www.example.com/on_user_authorized")
  20. # save_token_to_db(request_token)
  21. # redirect_to_or_open_page_in_web_browser(url)
  22. # # later, in your handler for requests to /on_user_authorized
  23. # request_token = lookup_token_in_db_by_key(request['oauth_token'])
  24. # access_token = client.exchange_request_token_for_access_token(request_token)
  25. # response = client.get('/account/whoami.xml', access_token).read()
  26. # whoami = re.compile(r'<login>(\w+)<\/login>').search(response).group(1)
  27. # client.post('/channel/update.xml' % whoami, {'title': 'NEW TITLE FOR %s' % whoami}, access_token)
  28.  
  29.  
  30. class JtvClient(object):
  31.     # consumer_key, consumer_secret are your api key and secret as strings
  32.     def __init__(self, consumer_key, consumer_secret):
  33.         self.consumer = OAuthConsumer(consumer_key, consumer_secret)
  34.         self.host = 'api.justin.tv'
  35.         self.port = 80
  36.         if self.port == 80:
  37.             self.authority = self.host
  38.         else:
  39.             self.authority = "%s:%d" % (self.host, self.port)
  40.  
  41.     # path is the path to the resource you wish to access in the REST API, without the leading /api
  42.     # token is an OAuthToken from the oauth library
  43.     def get(self, path, token=None, prefix="/api"):
  44.         url = "http://%s%s%s" % (self.host, prefix, path)
  45.         request = OAuthRequest.from_consumer_and_token(
  46.             self.consumer,
  47.             token,
  48.             http_method='GET',
  49.             http_url=url
  50.         )
  51.         return self._send_request(request, token)
  52.  
  53.     # path is the path to the resource you wish to access in the REST API, without the leading /api
  54.     # post_params is a dictionary of key-value pairs to be serialized into the post body
  55.     # token is an OAuthToken from the oauth library
  56.     def post(self, path, post_params, token=None, prefix="/api"):
  57.         url = "http://%s%s%s" % (self.host, prefix, path)
  58.         request = OAuthRequest.from_consumer_and_token(
  59.             self.consumer,
  60.             token,
  61.             http_method='POST',
  62.             http_url=url,
  63.             parameters=post_params
  64.         )
  65.         return self._send_request(request, token)
  66.  
  67.     # Create a request token and authorization url that will redirect the user to callback_url when they authorize the application
  68.     # returns a [auth_url:string, token:OAuthToken] array where the token is current unauthorized
  69.     # The callback_url will be redirected_to on success with ?oauth_token=XXXXXXXXXXX, so save the token returned here to
  70.     # some persistent store (like a database), and you can mark it as valid when the callback succeeds
  71.     # After you get a validated request token, you can exchange it for an access token (see exchange_request_token_for_access_token)
  72.     def make_request_token_and_authorization_url(self, callback_url):
  73.         response = self.get("/oauth/request_token", prefix="").read()
  74.         token = OAuthToken.from_string(response)
  75.         request = OAuthRequest.from_token_and_callback(token=token, callback=callback_url, http_url='http://%s/oauth/authorize' % self.authority)
  76.         return [token, request.to_url()]
  77.  
  78.     # Exchange a validated request token for an access token
  79.     def exchange_request_token_for_access_token(self, request_token):
  80.         response = self.get("/oauth/access_token", request_token, prefix="").read()
  81.         return OAuthToken.from_string(response)
  82.  
  83.     def _send_request(self, request, token=None):
  84.         request.sign_request(OAuthSignatureMethod_HMAC_SHA1(), self.consumer, token)
  85.         conn = self._get_conn()
  86.         if request.http_method == 'POST':
  87.             conn.request('POST', request.http_url, body=request.to_postdata())
  88.         else:
  89.             conn.request('GET', request.http_url, headers=request.to_header())
  90.         return conn.getresponse()
  91.  
  92.     def _get_conn(self):
  93.         return httplib.HTTPConnection("%s:%d" % (self.host, self.port))
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement