Open In App

Downloading gists from Github made simple

Improve
Improve
Like Article
Like
Save
Share
Report


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.




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()


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.


Last Updated : 29 Sep, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads