]> jfr.im git - z_archive/twitter.git/blame - twitter/oauth_dance.py
Merge pull request #226 from hugovk/master
[z_archive/twitter.git] / twitter / oauth_dance.py
CommitLineData
ea5231b2
MV
1from __future__ import print_function
2
ddeba164
MV
3import webbrowser
4import time
1b31d642 5
c2176d4e 6from .api import Twitter, json
f7e63802 7from .oauth import OAuth, write_token_file
c2176d4e 8from .oauth2 import OAuth2, write_bearer_token_file
1b31d642 9
ea5231b2
MV
10try:
11 _input = raw_input
12except NameError:
13 _input = input
14
15
c2176d4e
MV
16def oauth2_dance(consumer_key, consumer_secret, token_filename=None):
17 """
18 Perform the OAuth2 dance to transform a consumer key and secret into a
19 bearer token.
20
21 If a token_filename is given, the bearer token will be written to
22 the file.
23 """
24 twitter = Twitter(
25 auth=OAuth2(consumer_key=consumer_key, consumer_secret=consumer_secret),
26 format="",
27 api_version="")
28 token = json.loads(twitter.oauth2.token(grant_type="client_credentials")
29 .encode("utf8"))["access_token"]
30 if token_filename:
31 write_bearer_token_file(token)
32 return token
ea5231b2 33
1b31d642
MV
34def oauth_dance(app_name, consumer_key, consumer_secret, token_filename=None):
35 """
36 Perform the OAuth dance with some command-line prompts. Return the
37 oauth_token and oauth_token_secret.
38
39 Provide the name of your app in `app_name`, your consumer_key, and
40 consumer_secret. This function will open a web browser to let the
a6a7f763 41 user allow your app to access their Twitter account. PIN
1b31d642
MV
42 authentication is used.
43
44 If a token_filename is given, the oauth tokens will be written to
45 the file.
46 """
652c5402 47 print("Hi there! We're gonna get you all set up to use %s." % app_name)
1b31d642
MV
48 twitter = Twitter(
49 auth=OAuth('', '', consumer_key, consumer_secret),
ea5231b2 50 format='', api_version=None)
1b31d642 51 oauth_token, oauth_token_secret = parse_oauth_tokens(
c0c66ba0 52 twitter.oauth.request_token(oauth_callback="oob"))
f7e63802 53 print("""
1b31d642
MV
54In the web browser window that opens please choose to Allow
55access. Copy the PIN number that appears on the next page and paste or
56type it here:
f7e63802 57""")
f0d38884 58 oauth_url = ('https://api.twitter.com/oauth/authorize?oauth_token=' +
25feb118 59 oauth_token)
f7e63802 60 print("Opening: %s\n" % oauth_url)
dda98f55 61
25feb118
MV
62 try:
63 r = webbrowser.open(oauth_url)
64 time.sleep(2) # Sometimes the last command can print some
65 # crap. Wait a bit so it doesn't mess up the next
66 # prompt.
67 if not r:
68 raise Exception()
69 except:
f7e63802 70 print("""
25feb118
MV
71Uh, I couldn't open a browser on your computer. Please go here to get
72your PIN:
73
f7e63802 74""" + oauth_url)
ea5231b2 75 oauth_verifier = _input("Please enter the PIN: ").strip()
1b31d642
MV
76 twitter = Twitter(
77 auth=OAuth(
ddeba164 78 oauth_token, oauth_token_secret, consumer_key, consumer_secret),
ea5231b2 79 format='', api_version=None)
1b31d642
MV
80 oauth_token, oauth_token_secret = parse_oauth_tokens(
81 twitter.oauth.access_token(oauth_verifier=oauth_verifier))
82 if token_filename:
83 write_token_file(
84 token_filename, oauth_token, oauth_token_secret)
f7e63802
MV
85 print()
86 print("That's it! Your authorization keys have been written to %s." % (
87 token_filename))
ddeba164
MV
88 return oauth_token, oauth_token_secret
89
90def parse_oauth_tokens(result):
91 for r in result.split('&'):
92 k, v = r.split('=')
93 if k == 'oauth_token':
94 oauth_token = v
95 elif k == 'oauth_token_secret':
96 oauth_token_secret = v
1b31d642 97 return oauth_token, oauth_token_secret