#!/usr/bin/env python import argparse import os.path import re import requests import sys parser = argparse.ArgumentParser(description='paste a file to gist') parser.add_argument('filename', metavar='file', type=str, nargs='?', help='file to paste; if not specified, read from stdin') parser.add_argument('--language', '-l', dest='language', help='the language to use (default: Text if stdin, autodetect based on extension otherwise)') args = parser.parse_args() rs = requests.Session() if args.filename is None: args.filename = '' f = sys.stdin if args.language is None: args.language = 'Text' else: f = open(args.filename, 'r') args.filename = os.path.basename(args.filename) if args.language is None: r = rs.get('https://gist.github.com/languages/detect', params={'name': args.filename}) if type(r.json) == dict: args.language = r.json['language'] # old requests behavior else: args.language = r.json()['language'] # new requests behavior r = rs.get('https://gist.github.com/') # also gets _gist_session cookie match = re.search('', r.content) csrf_token = match.group(1) content = f.read() data = { 'gist[description]': '', 'gist[files][][content]': content, 'gist[files][][language]': args.language, 'gist[files][][name]': args.filename, 'gist[files][][oid]': '', 'gist[public]': 0, 'indent': 'Tabs', 'authenticity_token': csrf_token, } r = rs.post('https://gist.github.com/gists', data=data, allow_redirects=False) if 'location' in r.headers: print r.headers['location'] else: print r.headers['status'] print '\n' + r.content