Skip to content

Instantly share code, notes, and snippets.

@PinkyJie
Last active December 17, 2015 01:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PinkyJie/5531435 to your computer and use it in GitHub Desktop.
Save PinkyJie/5531435 to your computer and use it in GitHub Desktop.
a twitter-oauth test user need not to anticipate
import time,random,urllib,urllib2,hmac,hashlib,re
# constants
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
REQUEST_TOKEN_URL = 'https://api.twitter.com/oauth/request_token'
AUTHENTICATE_URL = 'https://api.twitter.com/oauth/authenticate'
AUTHORIZE_URL = 'https://api.twitter.com/oauth/authorize'
ACCESS_TOKEN_URL = 'https://api.twitter.com/oauth/access_token'
CALLBACK_URL = None
USER_NAME = ''
PASSWORD = ''
# utility functions
def qt(s):
return urllib.quote(s, '~')
def str2dict(s):
dic = {}
for param in s.split('&'):
(key, value) = param.split('=')
dic[key] = value
return dic
def dict2str(dic):
return ', '.join(['%s="%s"' % (key, value) for key, value in dic.iteritems()])
def build_header(params,base_url,oauth_token_secret='',method='POST'):
common_params = {
'oauth_consumer_key' : CONSUMER_KEY,
'oauth_version' : '1.0',
'oauth_signature_method' : 'HMAC-SHA1',
'oauth_timestamp' : int(time.time()),
'oauth_nonce' : ('%x' % random.getrandbits(64))
}
params.update(common_params)
if CALLBACK_URL:
params['oauth_callback'] = qt(CALLBACK_URL)
keys = sorted(list(params.keys()))
encoded = qt('&'.join(['%s=%s' % (key, params[key]) for key in keys]))
base_string = '%s&%s&%s' % (method, qt(base_url), encoded)
# print base_string
signing_key = CONSUMER_SECRET + '&' + oauth_token_secret
params['oauth_signature'] = qt(hmac.new(signing_key, base_string, hashlib.sha1).digest().encode('base64')[:-1])
return params
if __name__ == '__main__':
# step 1
print 'STEP 1: get request token'
req1 = urllib2.Request(REQUEST_TOKEN_URL,headers={'Authorization': 'OAuth ' + dict2str(build_header({},REQUEST_TOKEN_URL))})
res1 = urllib2.urlopen(req1,{}).read()
res_dict1 = str2dict(res1)
if res_dict1['oauth_callback_confirmed'] == 'true':
oauth_token = res_dict1['oauth_token']
oauth_token_secret = res_dict1['oauth_token_secret']
print 'SUCCESS:'
print 'oauth_token: ' + oauth_token
print 'oauth_token_secret: ' + oauth_token_secret
# step 2
print 'STEP 2: get PIN code'
redirect_url = AUTHENTICATE_URL + '?oauth_token=' + oauth_token
res_temp = urllib.urlopen(redirect_url).read()
re_token = re.compile(r'<input name="authenticity_token" type="hidden" value="(\w+)" />')
pin_params = {}
pin_params['authenticity_token'] = re_token.findall(res_temp)[0]
pin_params['oauth_token'] = oauth_token
pin_params['session[username_or_email]'] = USER_NAME
pin_params['session[password]'] = PASSWORD
req2 = urllib2.Request(AUTHORIZE_URL, urllib.urlencode(pin_params))
res2 = urllib2.urlopen(req2).read()
re_pin = re.compile(r'<code>(\d*)</code>')
pin_code = re_pin.findall(res2)[0]
print 'SUCCESS:'
print 'pin_code: ' + pin_code
# step 3
print 'STEP 3: get access token'
access_params = {}
access_params['oauth_token'] = oauth_token
access_params['oauth_verifier'] = pin_code
req3 = urllib2.Request(ACCESS_TOKEN_URL,headers={'Authorization': 'OAuth ' + dict2str(build_header(access_params,ACCESS_TOKEN_URL,oauth_token_secret))})
res3 = urllib2.urlopen(req3,{}).read()
res3_dict = str2dict(res3)
access_token = res3_dict['oauth_token']
access_token_secret = res3_dict['oauth_token_secret']
print 'SUCCESS:'
print 'access_token: ' + access_token
print 'access_token_secret: ' + access_token_secret
print 'Your Twitter Name: ' + res3_dict['screen_name']
# test for tweet
TWEET_URL = 'https://api.twitter.com/1/statuses/update.json'
msg = 'Tweet From Python'
tweet_params = {}
tweet_params['oauth_token'] = access_token
tweet_params['status'] = qt(msg.encode('UTF-8'))
tweet_headers = build_header(tweet_params,TWEET_URL,access_token_secret)
del tweet_headers['status']
req4 = urllib2.Request(TWEET_URL, urllib.urlencode({'status':msg.encode('UTF-8')}), {'Authorization':'OAuth ' + dict2str(tweet_headers)})
res4 = urllib2.urlopen(req4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment