=Start=
缘由:
日常使用需要
正文:
参考解答:
#!/usr/bin/env python # coding=utf-8 # Date: 20170601 import sys, os, time, json import errno import argparse import requests reload(sys) sys.setdefaultencoding('utf-8') class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' def make_sure_path_exists(path): try: os.makedirs(path) except OSError as exception: if exception.errno != errno.EEXIST: raise cookie_dict = {} def requests_get(url): try: if cookie_dict: r = requests.get(url, cookies=cookie_dict) else: r = requests.get(url) except requests.exceptions.RequestException as e: return '' return r.text # return a list contains all the username's gists def gists_list(username): result = [] url_user = 'https://api.github.com/users/{0}/gists'.format(username) url_text = requests_get(url_user) user_gists_list = json.loads(url_text) if isinstance(user_gists_list, dict): return [] for item in user_gists_list: # print item.get('id'), item.get('description', '') result.append({item.get('id'): item.get('description', '')}) return result # download the specify gists id into file # PS: if file is too big(>10M), just print file info and don't download def gists_download(id): url_gists = 'https://api.github.com/gists/{0}'.format(id) url_text = requests_get(url_gists) gists_info = json.loads(url_text) if gists_info.get('message', ''): print '{0}{1}{2}\tNot Found'.format(bcolors.FAIL, url_gists, bcolors.ENDC) return files = gists_info.get('files') print 'gists {0} has {1} files in total!'.format(id, len(files)) for item in files: # print files[item].get('filename'), files[item].get('size'), files[item].get('raw_url') if int(files[item].get('size')) > 1024 * 1024 * 10: print files[item].get('filename'), files[item].get('size'), files[item].get('raw_url') continue if not os.path.exists(id): os.makedirs(id) with open('./{0}/{1}'.format(id, files[item].get('filename')), 'wb') as fp: fp.write(requests_get(files[item].get('raw_url'))) print files[item].get('filename'), files[item].get('size'), files[item].get('raw_url') return def main(): parse = argparse.ArgumentParser() parse.add_argument('-i', '--id', required=True, type=str, help='Specify the gists id') parse.add_argument('-u', '--user', type=str, help='Specify the GitHub username') args = parse.parse_args() if len(sys.argv) <= 1: parse.print_help() sys.exit(0) if args.id: if args.user is not None: #因为为args.user设置了「type=str」,所以「args.user的值为None/设定的字符串的值」 for item in gists_list(args.user): if args.id in item: print '{0}{1}{2}'.format(bcolors.OKGREEN, item, bcolors.ENDC) else: print item gists_download(args.id) else: gists_download(args.id) if __name__ == '__main__': time_start = time.time() try: main() except KeyboardInterrupt: print 'Killed by user' sys.exit(0) print "\nSpend {0} seconds.\n".format(time.time() - time_start)
参考链接:
更多参考链接:
=END=