Skip to content

Instantly share code, notes, and snippets.

@stefanotorresi
Last active August 29, 2015 14:15
Show Gist options
  • Save stefanotorresi/90b81b50fb0ac0057501 to your computer and use it in GitHub Desktop.
Save stefanotorresi/90b81b50fb0ac0057501 to your computer and use it in GitHub Desktop.
Github token retriever script in python
#!/usr/bin/env python
import requests
import getpass
import json
class GithubTokenRetriever:
url = 'https://api.github.com/authorizations'
def __init__(self, username = '', password = '', note = '', otp = ''):
self.user = {
'username': username if username else raw_input('Github username: '),
'password': password if password else getpass.getpass('Github password: '),
'otp': otp,
}
self.payload = { 'note': note if note else raw_input('Note (optional): ') }
def retrieve(self):
response = self._requestToken()
if not self.user['otp'] \
and response.status_code == 401 \
and response.headers.get('X-GitHub-OTP', '').startswith('required'):
self.user['otp'] = raw_input('Github one-time password: ')
response = self._requestToken() # request the token again, using the OTP this time
self.user.clear()
if response.status_code >= 400:
msg = response.json().get('message', 'Unknown error')
raise Exception(msg, response.status_code)
return response.json().get('token')
def _requestToken(self):
response = requests.post(
self.url,
auth = (self.user.get('username'), self.user.get('password')),
data = json.dumps(self.payload),
headers = { 'X-GitHub-OTP': self.user.get('otp') }
)
return response
def run():
import sys
try:
retriever = GithubTokenRetriever()
token = retriever.retrieve()
print "Here is your access token:", token
except KeyboardInterrupt:
print
sys.exit(1)
except Exception as ex:
message, code = ex.args
print '\nError %s: %s' % (code, message), '\n'
run()
if __name__ == '__main__':
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment