gist 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env python
  2. import argparse
  3. import os.path
  4. import re
  5. import requests
  6. import sys
  7. parser = argparse.ArgumentParser(description='paste a file to gist')
  8. parser.add_argument('filename', metavar='file', type=str, nargs='?',
  9. help='file to paste; if not specified, read from stdin')
  10. parser.add_argument('--language', '-l', dest='language',
  11. help='the language to use (default: Text if stdin, autodetect based on extension otherwise)')
  12. args = parser.parse_args()
  13. rs = requests.Session()
  14. if args.filename is None:
  15. args.filename = ''
  16. f = sys.stdin
  17. if args.language is None:
  18. args.language = 'Text'
  19. else:
  20. f = open(args.filename, 'r')
  21. args.filename = os.path.basename(args.filename)
  22. if args.language is None:
  23. r = rs.get('https://gist.github.com/languages/detect', params={'name': args.filename})
  24. if type(r.json) == dict:
  25. args.language = r.json['language'] # old requests behavior
  26. else:
  27. args.language = r.json()['language'] # new requests behavior
  28. r = rs.get('https://gist.github.com/') # also gets _gist_session cookie
  29. match = re.search('<meta content="([A-Za-z0-9+/]+=*)" name="csrf-token" />', r.content)
  30. csrf_token = match.group(1)
  31. content = f.read()
  32. data = {
  33. 'gist[description]': '',
  34. 'gist[files][][content]': content,
  35. 'gist[files][][language]': args.language,
  36. 'gist[files][][name]': args.filename,
  37. 'gist[files][][oid]': '',
  38. 'gist[public]': 0,
  39. 'indent': 'Tabs',
  40. 'authenticity_token': csrf_token,
  41. }
  42. r = rs.post('https://gist.github.com/gists', data=data, allow_redirects=False)
  43. if 'location' in r.headers:
  44. print r.headers['location']
  45. else:
  46. print r.headers['status']
  47. print '\n' + r.content