ghapi
Własne API statystyk GitHuba, które zasila strony dualfroz.com i vulcode.com oraz README profili: surowy JSON i karty SVG z commitami, językami, frameworkami, testami, seriami i kontrybucjami open source. Kolektor z tokenem GitHuba i API, które czyta tylko gotowe migawki, nigdy nie dzielą sekretów, a aplikacja Discorda odpowiada na te same pytania z dowolnego czatu.
Wprowadzenie
ghapi to nasze własne API statystyk GitHuba pod adresem ghapi.dualfroz.com. Zasila strony dualfroz.com i vulcode.com oraz README profili na GitHubie: oddaje surowy JSON i gotowe karty SVG, a do tego aplikację Discorda, która odpowiada na te same pytania z dowolnego czatu.
Napisaliśmy je w czystym PHP 8.2, bez frameworka i bez rozszerzeń spoza domyślnej kompilacji, więc działa na zwykłym PHP-FPM.
Dwie połówki bez wspólnych sekretów
uruchamiany co godzinę przez timer systemd, jako jedyny trzyma token GitHuba i zapisuje gotowe migawki.
czyta wyłącznie migawki i nigdy nie woła GitHuba, więc ruch na stronach nie zamienia się w zapytania do GitHuba.
Na dysku nie leży żadne repozytorium. Kolektor rozmawia z API GitHuba: zapytanie GraphQL wypisuje repozytoria skonfigurowanych właścicieli razem z gałęziami, ich głowami, gwiazdkami i językami. Pełne odświeżenie przychodzi raz na dobę, przebiegi pomiędzy dokańczają tylko szczegóły commitów, które nie zmieściły się w limicie zapytań, a po pełnym odświeżeniu podsumowanie trafia na webhook Discorda.
Jak liczy commity
Niezmieniona głowa gałęzi nic nie kosztuje. Przesuniętą porównuje się z poprzednią przez API porównań, a nową gałąź z gałęzią domyślną. Dzięki temu liczą się także commity wypchnięte później albo z cofniętą datą, które zapytanie po dacie by pominęło.
Gdy porównanie pokazuje, że stara głowa jest w tyle, czyli historia została przepisana, kolektor przechodzi repozytorium od nowa i usuwa commity, do których nie da się już dojść. Własne commity rozpoznaje po adresie e-mail autora, pomija merge'e, a każdy nowy commit dostaje listę plików raz, więc liczby dla języków, testów i rodzajów plików to dokładne liczby linii. Przy ruchu gałęzi domyślnej archiwum kodu rozpakowuje się na chwilę do katalogu tymczasowego, gdzie tokei liczy żywy kod, a skaner manifestów rozpoznaje frameworki, po czym katalog znika.
Dane publiczne i prywatne
Wszystko pod ścieżką /v2/public jest otwarte, ma CORS i nigdy nie zawiera nazw prywatnych repozytoriów. Te same ścieżki bez public wymagają klucza i dokładają nazwy oraz dane każdego repozytorium. Każda odpowiedź ma ETag i odpowiada 304 na zapytanie z If-None-Match, a stare ścieżki pierwszej wersji dalej działają.
Co zwraca API
| Punkt | Co zwraca |
|---|---|
| summary | Sumy, seria, najczęstsze języki i frameworki, testy, wielkość commitów i open source |
| commits | Commity w podziale na rok, miesiąc, tydzień, dzień, godzinę i dzień tygodnia |
| loc | Linie dodane i usunięte w czasie, żywy kod i rodzaje plików |
| languages, frameworks, tests | Języki z udziałem, frameworki z manifestów i linie testów na tle kodu |
| opensource | Pull requesty do publicznych projektów i własne publiczne repozytoria |
| cards | Karty SVG w motywie ciemnym i jasnym |
Karty i Discord
Karty SVG pokazują statystyki, najczęstsze języki, serię, aktywność, mapę ciepła, linie kodu, podział na lata, najważniejsze repozytoria, rozkład godzinowy, osiągnięcia, open source, frameworki i godziny pracy. Karta Discorda czyta profil i obecność zapisywane przez bota serwera VulCode, a aplikacja Discorda odpowiada na pytania o statystyki z dowolnego czatu.
Pytania o ghapi
Więcej projektów
Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.
Masz podobny projekt?
Napisz do nas - wycena jest bezpłatna i wraca w godzinę.



