Interfejs z API GitHub za pomocą Python 3

Interfejs z API GitHub za pomocą Python 3
Github jako aplikacja internetowa to ogromna i złożona jednostka. Pomyśl o wszystkich repozytoriach, użytkownikach, gałęziach, zatwierdzeniach, komentarzach, klawisach SSH i aplikacjach zewnętrznych, które są częścią. Ponadto istnieje wiele sposobów komunikowania się z tym. Istnieją aplikacje stacjonarne do GitHub, rozszerzenia dla kodu Visual Studio i edytor atomów, GIT CLI, Android i iOS, aby wymienić kilka.

Ludzie w GitHub, jak i twórcy stron trzecich, nie mogą zarządzać całą tą złożonością bez wspólnego interfejsu. Ten wspólny interfejs jest tym, co nazywamy API GitHub. Każde narzędzie Github, takie jak CLI, interfejs internetowy itp. Używa tego jednego wspólnego interfejsu do zarządzania zasobami (zasoby to podmioty takie jak repozytoria, klucze SSH itp.).

W tym samouczku dowiemy się kilku podstaw, w jaki sposób jednocześnie interfejs z interfejsem API za pomocą API Github V3 i Python3. Najnowszy V4 API GitHub wymaga dowiedzenia się o GraphQL, co skutkuje bardziej stromą krzywą uczenia się. Więc trzymam się tylko wersji trzeciej, która jest nadal aktywna i dość popularna.

Jak rozmawiać z interfejsem API internetowym

Interfejsy API internetowe umożliwiają korzystanie z wszystkich usług oferowanych przez aplikację internetową, takich jak GitHub, programowo używając wybranego języka. Na przykład użyjemy Pythona do naszego przypadku użycia tutaj. Technicznie możesz zrobić wszystko, co robisz na GitHub za pomocą interfejsu API, ale ograniczymy się tylko do czytania informacji o publicznie dostępnych.

Twój program Python będzie rozmawiać z API w taki sam sposób, jak Twoja przeglądarka rozmawia z witryną. To znaczy głównie za pośrednictwem żądań HTTPS. Żądania te będą zawierać różne „części”, zaczynając od metody żądania [Get, Post, Put, Usuń], sam adres URL, ciąg zapytania, nagłówek HTTP i korpus lub ładunek. Większość z nich jest opcjonalna. Będziemy jednak musieli podać metodę żądania i adres URL, na który składamy żądanie.

Co to są i jak są reprezentowane w żądaniu HTTPS, to coś, co zobaczymy powoli, gdy zaczniemy pisać skrypty Python do interakcji z Github.

Przykład

Dodanie klawiszy SSH do nowo utworzonego serwera jest zawsze niezdarnym procesem. Napiszmy skrypt Pythona, który pobranie publicznych klawiszy SSH z GitHub i doda go do pliku autoryzowanego_keys na dowolnym serwerze Linux lub UNIX, w którym uruchamiasz ten skrypt. Jeśli nie wiesz, jak generować lub używać kluczy SSH, oto doskonały artykuł na temat tego, jak to zrobić. Zakładam, że stworzyłeś i dodałeś własne publiczne klucze SSH do swojego konta Github.

Bardzo prosta i naiwna implementacja Pythona w celu osiągnięcia zadania, które opisaliśmy powyżej, jest jak pokazano poniżej:

żądania importu
Import OS
# Uzyskanie danych wejściowych użytkownika
UNIX_USER = wejście („Wprowadź swoją nazwę użytkownika UNIX:”)
github_user = input („Wprowadź swoją nazwę użytkownika GitHub:”)
# Upewniając się .Katalog SSH istnieje i otwiera plik autoryzowany_keys
ssh_dir = '/home/'+unix_user+'/.ssh/'
Jeśli nie OS.ścieżka.istnieje (ssh_dir):
OS.Makedirs (ssh_dir)
autoryzowany_keys_file = Open (ssh_dir+„autoryzowany_keys”, „a”)
# Wysyłanie żądania do interfejsu API GIHUB i przechowywanie odpowiedzi w zmiennej o nazwie'Response '
api_root = "https: // api.github.com "
request_header = 'accept': 'Application/vnd.github.v3+json '
Odpowiedź = żądania.get (api_root+'/Users/'+github_user+'/keys', nagłówki = request_header)
## Przetwarzanie odpowiedzi i dołączanie kluczy do autoryzowanego pliku_keys
bo w odpowiedzi.JSON ():
autoryzowany_keys_file.Write (i [„Key”]+'\ n')

Zignorujmy obsługę plików Pythona i różne szczegóły i spójrz ściśle na żądanie i odpowiedź. Najpierw zaimportowaliśmy żądania modułu żądań, że Ta biblioteka pozwala nam bardzo łatwo wykonywać połączenia API. Ta biblioteka jest również jednym z najlepszych przykładów projektu open source wykonanego dobrze. Oto oficjalna strona na wypadek, gdybyś chciał przyjrzeć się dokumentom.

Następnie ustawiamy zmienną API_ROOT.

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

Jest to powszechny podaj we wszystkich adresach URL, do których będziemy wykonywać wywołania API. Więc zamiast pisać „https: // API.github.com ”za każdym razem, gdy musimy uzyskać dostęp do https: // API.github.com/Users lub https: // API.github.com/ użytkownicy/ po prostu piszemy API_ROOT+'/Użytkownicy/' Lub API_ROOT+'/Użytkownicy/', Jak pokazano w kodowym fragmencie.

Następnie ustawiamy nagłówek w naszym żądaniu HTTPS, wskazując, że odpowiedzi są przeznaczone dla API w wersji 3 i powinny być sformatowane. Github szanowałby tę informację nagłówka.

Uzyskaj żądanie

Więc teraz, kiedy mamy nasze adresy URL i (opcjonalnie) informacje nagłówka przechowywane w różnych zmiennych, nadszedł czas, aby złożyć wniosek.

Odpowiedź = żądania.get (api_root+'/Users/'+github_user+'/keys', nagłówki = request_header)

Żądanie jest typu „Get”, ponieważ czytamy publicznie dostępne informacje z GitHub. Gdybyś pisał coś na swoim koncie użytkownika GitHub, użyłbyś Post. Podobnie inne metody są przeznaczone dla innych funkcji, takich jak Delete, służą do usunięcia zasobów takich jak repozytoria.

Punkt końcowy API

Punktem końcowym API, po które sięgamy, to:

https: // API.github.com/użytkownicy//Klucze

Każdy zasób GitHub ma swój własny punkt końcowy API. Twoje prośby o zdobycie, umieszczanie, usuwanie itp. Są następnie wykonane w stosunku do dostarczonego punktu końcowego. W zależności od poziomu dostępu, GitHub pozwoli ci to przejść z tym żądaniem lub odmówić.

Większość organizacji i użytkowników na GitHub ustawia ogromną ilość informacji czytelnych i publicznych. Na przykład moje konto użytkownika GitHub ma kilka publicznych repozytoriów i publicznych kluczy SSH, które każdy może odczytać dostęp (nawet bez konta użytkownika GitHub). Jeśli chcesz mieć bardziej szczegółową kontrolę nad swoim kontem osobistym, możesz wygenerować „token osobisty dostępny” do czytania i pisania uprzywilejowanych informacji przechowywanych na swoim osobistym koncie Github. Jeśli piszesz aplikację stron trzecią, mają być używane przez użytkowników innych niż ty, wówczas token OAuth wspomnianego użytkownika wymagałby Twojej aplikacji.

Ale jak widać, można uzyskać do wielu przydatnych informacji bez tworzenia tokena.

Odpowiedź

Odpowiedź jest zwracana z serwera API GitHub i jest przechowywana w zmiennej o nazwie odpowiedź. Całą odpowiedź można odczytać na kilka sposobów, jak udokumentowano tutaj. Już wyraźnie poprosiliśmy o treść typu JSON z GitHub, więc przetworzymy żądanie, jakby to było JSON. Aby to zrobić, wywołujemy metodę JSON () z modułu żądań, który rozkładnie ją do natywnych obiektów Python, takich jak słowniki i listy.

Możesz zobaczyć klucze dołączone do pliku autoryzowanego_keys w tym dla pętli:

bo w odpowiedzi.JSON ():
autoryzowany_keys_file.Write (i [„Key”]+'\ n')

Jeśli wydrukujesz odpowiedź.JSON () Object, zauważysz, że jest to lista Python ze słownikami Python jako członków. Każdy słownik ma klucz o nazwie „klucz” z publicznym kluczem SSH jako wartość tego klucza. Aby możesz dołączyć te wartości jeden po drugim do pliku autoryzowanego_keys. A teraz możesz łatwo SSH na swój serwer z dowolnego komputera, który ma każdy z prywatnych kluczy SSH odpowiadających jednym z kluczy publicznych, które właśnie dołączyliśmy.

Odkrywanie dalszych badań

Dużo pracy z interfejsami API wiąże się z dokładną kontrolą samej dokumentacji API bardziej niż pisanie wierszy kodu. W przypadku GitHub dokumentacja jest jedną z najlepszych w branży. Ale czytanie dokumentów API i wykonywanie połączeń API za pomocą Pythona jest raczej nieciekawe jako samodzielne działanie.

Zanim przejdziesz dalej, polecam, abyś wymyślił jedno zadanie, które chciałbyś wykonać za pomocą Pythona na swoim koncie Github. Następnie spróbuj go wdrożyć, czytając tylko oficjalne dokumentacje dostarczone przez Pythona, jego biblioteki zależne i github. Pomoże to również przyjąć zdrowszy sposób myślenia, w którym rozumiesz, co się dzieje w twoim kodzie, i poprawia go stopniowo z czasem.