Last active
August 29, 2015 14:15
-
-
Save stefanotorresi/90b81b50fb0ac0057501 to your computer and use it in GitHub Desktop.
Github token retriever script in python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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: | |
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