X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/5a412b39408a2154c0f3537eb0b7f681d5744af5..c2176d4e0365bb0764ff6962721053acaa1d1e39:/twitter/oauth2.py diff --git a/twitter/oauth2.py b/twitter/oauth2.py index a71bab1..9b4d846 100644 --- a/twitter/oauth2.py +++ b/twitter/oauth2.py @@ -1,17 +1,20 @@ """ -Visit the Twitter developer page and create a new application: +Twitter only supports the application-only flow of OAuth2 for certain +API endpoints. This OAuth2 authenticator only supports the application-only +flow right now. + +To authenticate with OAuth2, visit the Twitter developer page and create a new +application: https://dev.twitter.com/apps/new This will get you a CONSUMER_KEY and CONSUMER_SECRET. -Twitter only supports the application-only flow of OAuth2 for certain -API endpoints. This OAuth2 authenticator only supports the application-only -flow right now. If twitter supports OAuth2 for other endpoints, this -authenticator may be modified as needed. +Exchange your CONSUMER_KEY and CONSUMER_SECRET for a bearer token using the +oauth2_dance function. -Finally, you can use the OAuth2 authenticator to connect to Twitter. In -code it all goes like this:: +Finally, you can use the OAuth2 authenticator and your bearer token to connect +to Twitter. In code it goes like this:: twitter = Twitter(auth=OAuth2(bearer_token=BEARER_TOKEN)) @@ -30,6 +33,20 @@ except ImportError: from base64 import b64encode from .auth import Auth +def write_bearer_token_file(filename, oauth2_bearer_token): + """ + Write a token file to hold the oauth2 bearer token. + """ + oauth_file = open(filename, 'w') + print(oauth2_bearer_token, file=oauth_file) + oauth_file.close() + +def read_bearer_token_file(filename): + """ + Read a token file and return the oauth2 bearer token. + """ + f = open(filename) + return f.readline().strip() class OAuth2(Auth): """ @@ -42,22 +59,16 @@ class OAuth2(Auth): consumer_secret if you are requesting a bearer_token. Otherwise you must supply the bearer_token. """ - self.bearer_token = None - self.consumer_key = None - self.consumer_secret = None - - if bearer_token: - self.bearer_token = bearer_token - elif consumer_key and consumer_secret: - self.consumer_key = consumer_key - self.consumer_secret = consumer_secret - else: + self.bearer_token = bearer_token + self.consumer_key = consumer_key + self.consumer_secret = consumer_secret + + if not (bearer_token or (consumer_key and consumer_secret)): raise MissingCredentialsError( 'You must supply either a bearer token, or both a ' 'consumer_key and a consumer_secret.') def encode_params(self, base_url, method, params): - return urlencode(params) def generate_headers(self): @@ -66,25 +77,18 @@ class OAuth2(Auth): b'Authorization': 'Bearer {0}'.format( self.bearer_token).encode('utf8') } - - elif self.consumer_key and self.consumer_secret: - + else: headers = { b'Content-Type': (b'application/x-www-form-urlencoded;' b'charset=UTF-8'), - b'Authorization': 'Basic {0}'.format( - b64encode('{0}:{1}'.format( + b'Authorization': 'Basic {}'.format( + b64encode('{}:{}'.format( quote(self.consumer_key), quote(self.consumer_secret)).encode('utf8') ).decode('utf8') ).encode('utf8') } - - else: - raise MissingCredentialsError( - 'You must supply either a bearer token, or both a ' - 'consumer_key and a consumer_secret.') - + print(headers) return headers