Git

Anbindung an die GitHub-API mit Python 3

Anbindung an die GitHub-API mit Python 3
GitHub als Webanwendung ist eine riesige und komplexe Einheit. Denken Sie an alle Repositorys, Benutzer, Branches, Commits, Kommentare, SSH-Schlüssel und Apps von Drittanbietern, die dazu gehören. Darüber hinaus gibt es mehrere Möglichkeiten, mit ihm zu kommunizieren. Es gibt Desktop-Apps für GitHub, Erweiterungen für Visual Studio Code und Atom Editor, git cli, Android- und iOS-Apps, um nur einige zu nennen.

Die Leute bei GitHub und Entwickler von Drittanbietern können diese Komplexität ohne eine gemeinsame Schnittstelle unmöglich bewältigen. Diese gemeinsame Schnittstelle nennen wir die GitHub-API. Jedes GitHub-Dienstprogramm wie eine CLI, eine Web-Benutzeroberfläche usw. verwendet diese eine gemeinsame Schnittstelle, um Ressourcen zu verwalten (Ressourcen sind Entitäten wie Repositorys, SSH-Schlüssel usw.).

In diesem Tutorial lernen wir ein paar Grundlagen, wie man mit einer API mit GitHub API v3 und Python3 interagiert. Die neueste v4 der GitHub-API erfordert, dass Sie sich mit GraphQL vertraut machen, was zu einer steileren Lernkurve führt. Also bleibe ich bei Version drei, die immer noch aktiv und ziemlich beliebt ist.

So sprechen Sie mit einer Web-API

Web-APIs ermöglichen es Ihnen, alle von einer Web-App wie GitHub angebotenen Dienste programmgesteuert in einer Sprache Ihrer Wahl zu nutzen. Zum Beispiel werden wir Python für unseren Anwendungsfall verwenden, hier. Technisch können Sie alles, was Sie auf GitHub tun, mit der API tun, aber wir werden uns darauf beschränken, nur die öffentlich zugänglichen Informationen zu lesen.

Ihr Python-Programm kommuniziert mit einer API genauso wie Ihr Browser mit einer Website kommuniziert. Das heißt, meist über HTTPS-Anfragen. Diese Anfragen enthalten verschiedene 'Teile', beginnend mit der Methode der Anfrage [GET, POST, PUT, DELETE], der URL selbst, einem Abfragestring, einem HTTP-Header und einem Body oder einer Nutzlast pay. Die meisten davon sind optional. Wir müssen jedoch eine Anfragemethode und die URL angeben, an die wir die Anfrage richten.

Was diese sind und wie sie in einer HTTPS-Anfrage dargestellt werden, werden wir langsam sehen, wenn wir anfangen, Python-Skripte für die Interaktion mit GitHub zu schreiben writing.

Ein Beispiel

Das Hinzufügen von SSH-Schlüsseln zu einem neu erstellten Server ist immer ein umständlicher Prozess. Lassen Sie uns ein Python-Skript schreiben, das Ihre öffentlichen SSH-Schlüssel von GitHub abruft und es der Datei "authorized_keys" auf jedem Linux- oder Unix-Server hinzufügt, auf dem Sie dieses Skript ausführen. Wenn Sie nicht wissen, wie Sie SSH-Schlüssel generieren oder verwenden, finden Sie hier einen hervorragenden Artikel darüber, wie Sie genau das tun können. Ich gehe davon aus, dass Sie Ihre eigenen öffentlichen SSH-Schlüssel erstellt und Ihrem GitHub-Konto hinzugefügt haben.

Eine sehr einfache und naive Python-Implementierung, um die oben beschriebene Aufgabe zu erfüllen, ist wie folgt:

Importanfragen
Importieren von OS
 
# Benutzereingaben erhalten
unix_user = input("Geben Sie Ihren Unix-Benutzernamen ein: ")
github_user = input("Geben Sie Ihren GitHub-Benutzernamen ein: ")
 
# Sicherstellen, dass .ssh-Verzeichnis existiert und öffnet die Datei "authorized_keys"
ssh_dir = '/home/'+unix_user+'/.ssh/'
wenn nicht os.Pfad.existiert(ssh_dir):
os.makedirs(ssh_dir)
 
authorized_keys_file = open(ssh_dir+'authorized_keys','a')
 
# Senden einer Anfrage an die GiHub-API und Speichern der Antwort in einer Variablen namens 'response'
api_root = "https://api.github.com"
request_header = 'Akzeptieren':'Anwendung/vnd.github.v3+json'
Antwort = Anfragen.get(api_root+'/users/'+github_user+'/keys', headers = request_header)
 
## Verarbeitung der Antwort und Anhängen von Schlüsseln an die Datei "authorized_keys"
für ich als antwort.json():
authorisierte_keys_file.write(i['key']+'\n')

Lassen Sie uns die Handhabung von Python-Dateien und verschiedene Details ignorieren und uns die Anfrage und Antwort genau ansehen. Zuerst haben wir die Importanfragen des Request-Moduls importiert, mit denen wir sehr einfach API-Aufrufe durchführen können. Diese Bibliothek ist auch eines der besten Beispiele für ein richtig gemachtes Open-Source-Projekt done. Hier ist die offizielle Seite, falls Sie sich die Dokumente genauer ansehen möchten.

Als nächstes setzen wir eine Variable api_root.

api_root = "https://api.github.com"

Dies ist die gemeinsame Teilzeichenfolge in allen URLs, an die wir API-Aufrufe durchführen werden. Anstatt „https://api.github.com“ jedes Mal, wenn wir auf https://api . zugreifen müssen.github.com/users oder https://api.github.com/Benutzer/ wir schreiben einfach api_root+'/users/' oder api_root+'/users/', wie im Code-Schnipsel gezeigt.

Als Nächstes legen wir den Header in unserer HTTPS-Anfrage fest und geben an, dass die Antworten für die API der Version 3 bestimmt sind und JSON-formatiert sein sollten. GitHub würde diese Header-Informationen respektieren.

1.  GET-Anfrage

Da wir nun unsere URL und (optionale) Header-Informationen in verschiedenen Variablen gespeichert haben, ist es an der Zeit, die Anfrage zu stellen.

Antwort = Anfragen.get(api_root+'/users/'+github_user+'/keys', headers = request_header)

Die Anfrage ist vom Typ 'get', weil wir öffentlich verfügbare Informationen von GitHub lesen. Wenn Sie etwas unter Ihrem GitHub-Benutzerkonto schreiben würden, würden Sie POST verwenden. Ebenso sind andere Methoden für andere Funktionen gedacht, wie DELETE zum Löschen von Ressourcen wie Repositorys.

2.  API-Endpunkt

Der API-Endpunkt, den wir anstreben, ist:

https://api.github.com/Benutzer//Schlüssel

Jede GitHub-Ressource hat ihren eigenen API-Endpunkt. Ihre Anforderungen für GET, PUT, DELETE usw. werden dann für den von Ihnen angegebenen Endpunkt gestellt. Abhängig von der Zugriffsebene, die Sie haben, wird GitHub Ihnen dann entweder erlauben, diese Anfrage zu bearbeiten oder sie abzulehnen.

Die meisten Organisationen und Benutzer auf GitHub legen eine riesige Menge an lesbaren und öffentlich zugänglichen Informationen fest. Zum Beispiel hat mein GitHub-Benutzerkonto ein paar öffentliche Repositorys und öffentliche SSH-Schlüssel, auf die jeder lesen kann (auch ohne GitHub-Benutzerkonto). Wenn Sie eine genauere Kontrolle über Ihr persönliches Konto haben möchten, können Sie ein „Personal Access Token“ generieren, um privilegierte Informationen zu lesen und zu schreiben, die in Ihrem persönlichen GitHub-Konto gespeichert sind. Wenn Sie eine Drittanbieteranwendung schreiben, die von anderen Nutzern als Ihnen verwendet werden soll, benötigt Ihre Anwendung ein OAuth-Token dieses Nutzers.

Aber wie Sie sehen, kann auf viele nützliche Informationen zugegriffen werden, ohne ein Token zu erstellen.

3.  Antwort

Die Antwort wird vom GitHub-API-Server zurückgegeben und in der Variablen namens response gespeichert. Die gesamte Antwort kann auf verschiedene Weise gelesen werden, wie hier dokumentiert. Wir haben explizit nach Inhalten vom Typ JSON von GitHub gefragt, damit wir die Anfrage so verarbeiten, als ob es sich um JSON handelt. Dazu rufen wir die json()-Methode aus dem Request-Modul auf, die sie in native Python-Objekte wie Wörterbücher und Listen dekodiert.

In dieser for-Schleife können Sie sehen, wie die Schlüssel an die Datei "authorized_keys" angehängt werden:

für ich als antwort.json():
authorisierte_keys_file.write(i['key']+'\n')

Wenn Sie die Antwort drucken.json()-Objekt, werden Sie feststellen, dass es sich um eine Python-Liste mit Python-Wörterbüchern als Mitgliedern handelt. Jedes Wörterbuch hat einen Schlüssel namens 'key' mit Ihrem öffentlichen SSH-Schlüssel als Wert für diesen Schlüssel. Sie können diese Werte also einzeln an Ihre Datei "authorized_keys" anhängen. Und jetzt können Sie von jedem Computer, der einen der privaten SSH-Schlüssel hat, die einem der öffentlichen Schlüssel entsprechen, die wir gerade angehängt haben, ganz einfach per SSH auf Ihren Server zugreifen.

Weiter erkunden

Ein Großteil der Arbeit mit APIs beinhaltet eine sorgfältige Prüfung der API-Dokumentation selbst, mehr als das Schreiben von Codezeilen. Im Fall von GitHub ist die Dokumentation eine der besten in der Branche. Aber das Lesen von API-Dokumenten und das Tätigen von API-Aufrufen mit Python ist als eigenständige Aktivität eher uninteressant.

Bevor Sie fortfahren, empfehle ich Ihnen, sich eine Aufgabe auszudenken, die Sie mit Python in Ihrem GitHub-Konto ausführen möchten. Versuchen Sie dann, es zu implementieren, indem Sie nur die offiziellen Dokumentationen von Python, seinen abhängigen Bibliotheken und GitHub lesen. Dies wird Ihnen auch dabei helfen, eine gesündere Denkweise anzunehmen, in der Sie verstehen, was in Ihrem Code vor sich geht, und ihn im Laufe der Zeit schrittweise verbessern.

SuperTuxKart für Linux
SuperTuxKart ist ein großartiger Titel, der entwickelt wurde, um Ihnen das Mario Kart-Erlebnis kostenlos auf Ihrem Linux-System zu bieten. Es ist ziem...
Battle for Wesnoth-Tutorial
The Battle for Wesnoth ist eines der beliebtesten Open-Source-Strategiespiele, die Sie derzeit spielen können. Dieses Spiel befindet sich nicht nur se...
0 A.D. Lernprogramm
Von den vielen Strategiespielen da draußen, 0 A.D. schafft es, sich trotz Open Source als umfassender Titel und sehr tiefgehendes, taktisches Spiel ab...