Downloading gists from Github made simple


GithubGist is a place where you can create a private or a public gist i.e store your files either privately or publicly. Let us assume a scenario where you have written a good number of gists for your project and you want to download a set of them. The only way you can do it using GithubGist is to open each and every individual gist to download ZIP or clone via HTTP or SSH.
This article is all about making the above task simpler. Using the commands below, you can even download gists from other github users excluding the private ones until you know their password.

We will be using requests package for this propose. It is an awesome package to send HTTP requests with minimal code.

Installation

1. Download the package from PyPI via terminal using pip3
Syntax:

pip3 install requests

Note: To become a root user, run the following command:

sudo pip3 install requests

Python3 script
The script can not run on an online IDE and therefore you can click here to see how it works.

filter_none

edit
close

play_arrow

link
brightness_4
code

import requests
import os
  
def create_directory(dirname):
    #Creates a new directory if a directory with dirname does not exist
  
    try:
        os.stat(dirname)
    except:
        os.mkdir(dirname)
  
def show(obj):
    #Displays the items in the obj
  
    for i in range(len(obj)):
        print(str(i)+': '+str(obj[i]))
  
def auth():
    #Asks for the user details
  
    ask_auth = input("Do you want to download gists from your account
                               ? Type 'yes' or 'no': ")
    if(ask_auth=="yes"):
        user = input("Enter your username: ")
        password = input("Enter your password: ")
        request = requests.get('https://api.github.com/users/'+user+'/gists'
                                             , auth=(user, password))
    elif(ask_auth=="no"):
        user = input("Enter username: ")
        request = requests.get('https://api.github.com/users/'
                                                       +user+'/gists')
    return [ask_auth, user, request]
  
def load(request):
   #Loads the files and the gist urls
  
   output = request.text.split(",")
   gist_urls = []
   files = []
   for item in output:
       if "raw_url" in item:
           gist_urls.append(str(item[11:-1]))
       if "filename" in item:
           files.append(str(item.split(":")[1][2:-1]))
   return [gist_urls, files]
  
def write_gist(filename, text):
    #Writes text(gist) to filename
  
    fp = open(filename, 'w')
    fp.write(text)
    fp.close()
  
def download(permission, user, request, fileno):
    #Loads and writes all the gists to <em>dirname</em>
  
    if(permission == "yes" or permission == "no"):
        gist_urls, files = load(request)
        dirname = user+"'s_gists/"
        create_directory(dirname)
        if(fileno[1] == "all"):
            for i in range(len(gist_urls)):
                gist = requests.get(gist_urls[i])
                write_gist(dirname+files[i], gist.text)
        else:
            for i in range(1,len(fileno)):
                gist = requests.get(gist_urls[int(fileno[i])])
                write_gist(dirname+files[int(fileno[i])], gist.text)
  
def detailed(urls, pos):
    #Prints out the contents of a file
  
    gist = requests.get(urls[int(pos)])
    print(gist.text)
  
def main():
    #Authenticates and downloads gists according to user's choice
    #Commands:
    #show: To show all the available gists with their assigned gistno
    #download all: To download all the available gists
    #download gistno(s): To download gist(s) assigned to gistno(s)
    #detailed gistno: To print content of gist assigned to gistno
    #exit: To exit the script
  
    ask_auth, user, request = auth()
    urls, files = load(request)
    try:
        while(1):
            command = input("Enter your command: ")
            if("download" in command):
                download(ask_auth, user, request, command.split(" "))
            elif("detailed" in command):
                detailed(urls, command.split(" ")[1])
            elif(command == "show"):
                show(files)
            elif(command == "exit"):
                return
    except:
        pass
  
if(__name__ == '__main__'):
    main()

chevron_right


Explanation
GithubGist API stores information about each user at http://api.github.com/users/username/gists.

  • Send a HTTP request to the above url to retrieve information about the user.
  • Search for the raw_url of every available gist and sent HTTP requests to retrieve the information about them.
  • Manipulated the information to your needs.

This article is contributed by Sri Sanketh Uppalapati. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up


Article Tags :

2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.