# Melihat Statistik Repository Github Menggunakan Python dan PyGithub

*Bismillaah Alhamdulillaah,*

Apakah Anda memiliki repositori di ***Github***? Ingin tahu data statistik dari setiap repositori yang Anda miliki? Yuk, ikuti tutorial berikut ini.

<hr />

# 1. Pendahuluan

> 
***GitHub*** adalah platform khusus *developer* yang dibuat karena terinspirasi dari cara bekerja para *programmer*. Dari *open source* ke bisnis, kita bisa meng-*host* dan meninjau sebuah kode, mengelola proyek, dan membangun perangkat lunak bersama 56 juta lebih pengguna di seluruh dunia.
>
Gampangnya, ***GitHub*** merupakan manajemen proyek, sistem *versioning code*, sekaligus *platform* jaringan sosial bagi para *developer* seluruh dunia. Banyak sekali fungsi yang bisa digunakan oleh para *developer*, sehingga melalui platform ini memudahkan *developer* dalam mengembangkan sebuah karya -  [Dicoding.com](https://www.dicoding.com/blog/apa-itu-github/) .

Untuk melihat data statistik di sebuah repositori dalam Github - setelah *login* - kita dapat memilih salah satu repositori dari daftar repositori yang kita miliki. Cara paling mudah adalah dengan membukanya melalui menu ***Repositories***.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1636561593032/MulR7waXb.png)

Setelah halaman repositori terbuka, pilih menu ***Insights***.
![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1636561725445/UzLT4eU46.png)

Di bagian kiri halaman ada daftar submenu, pilih menu ***Traffic***.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1636561851109/d_VbSF_Rl.png)

Datanya akan terlihat di bagian kanan halaman, contohnya seperti terlihat pada gambar berikut.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1636561998546/bhFdB0aHy.png)
![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1636562019626/SCn_8pNmQ.png)

Dan sayangnya belum ada fasilitas bawaan untuk melihat data statistik dari seluruh repositori sekaligus. Nah, dalam artikel ini akan disajikan bagaimana cara mengakses data statistik dari keseluruhan repositori yang sudah kita miliki di ***Github***.

<hr />

# 2. Instalasi PyGithub

Untuk mengakses data statistik repositori dalam ***Github*** dapat dilakukan melalui ***REST API*** (*application programming interface*) yang sudah disediakan.

> 
API, atau antarmuka pemrograman aplikasi, adalah seperangkat aturan yang menentukan bagaimana aplikasi atau perangkat dapat terhubung dan berkomunikasi satu sama lain. REST API adalah API yang sesuai dengan prinsip desain REST (representational state transfer), atau gaya arsitektur transfer status representasional. Untuk alasan ini, REST API terkadang dirujuk ke RESTful API -  [IBM.com](https://www.ibm.com/cloud/learn/rest-apis).

Dokumen terkait *REST API* dapat ditemukan di halaman web [Github Docs](https://docs.github.com/en/rest).
Adapun kali ini, kita akan menggunakan paket *library*  [***PyGithub***](https://pypi.org/project/PyGithub/) untuk memudahkan pengaksesan *REST API* yang tersedia.

Kode sumber ***PyGithub*** ada di  [sini](https://github.com/PyGithub/PyGithub) , dan panduan lengkap penggunaannya ada di  [sini](https://pygithub.readthedocs.io/en/latest/introduction.html).

- Instalasi paket.

```
$ pip install PyGithub
``` 

- Uji coba pertama adalah menampilkan semua nama repositori yang sudah dimiliki dengan menggunakan *template* kode berikut.

```
from github import Github

# First create a Github instance:

# using an access token
g = Github("access_token")

# Github Enterprise with custom hostname
g = Github(base_url="https://{hostname}/api/v3", login_or_token="access_token")

# Then play with your Github objects:
for repo in g.get_user().get_repos():
    print(repo.name)
``` 

<hr />

# 3. Membuat Token Akses

Untuk dapat mengakses *REST API* diperlukan semacam *token* akses yang dapat kita buat melalui pengaturan dalam ***Github***. 

- Klik foto profil di bagian kanan atas, dan pilih *Settings*.
![github settings.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636563686272/IWoeYeAsy.jpeg)

- Berikutnya adalah memilih submenu *Developer Settings*.
![github settings - developer settings.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636563735264/kFuYPWd_Q.jpeg)

- Pilih submenu *Personal access tokens*.
![github settings - developer settings - personal access tokens.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636563831574/Wnyk2grKP.jpeg)

- Tekan tombol *Generate new token* untuk membuat *token* akses baru.
- Berikutnya adalah isi *note* (keterangan), masa kadaluwarsa *token*, dan pilihan *scope* (jangkauan) hak akses. Dan tekan tombol *Generate token*.
![github settings - developer settings - generate token.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636564154104/C20cUjdAJ.jpeg)
Dalam hal ini saya contohkan isi masa kadaluwarsanya 30 hari, dan *scope*-nya cukup dipilih yang ***repo*** saja.

- Jika berhasil, akan memunculkan semacam kode yang merupakan *token* akses yang baru saja dibuat. Simpan baik-baik kode tersebut, karena halaman yang memunculkan *token* ini tidak akan dapat dilihat lagi.
![github settings - developer settings - generate token muncul.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636564357389/P9EBFU7NQ.jpeg)

- Jika kembali ke halaman *Personal access tokens*, maka akan memunculkan isi halaman yang contohnya seperti terdapat pada potongan gambar berikut.
![github settings - developer settings - generate token expiration.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636564518667/7c99YgBIJ.jpeg)

- Kita juga dapat membangkitkan *token* akses baru lagi jika *token* sebelumnya terlupakan. Yaitu dengan cara klik tautan nama *token* tersebut. Anda juga dapat mengubah spesifikasi lainnya dan selanjutnya klik tombol *Regenerate token*.
![github settings - developer settings - generate token regeneration.jpg](https://cdn.hashnode.com/res/hashnode/image/upload/v1636564625461/YEKg3YHEs.jpeg)

<hr />

# 4. Uji Coba PyGithub

Dalam tutorial kali ini saya akan mendemokan 5 tugas untuk mengakses data statistik repositori dalam ***Github***, yaitu:
- Melihat daftar nama repositori.
- Memeriksa tipe repositori, yaitu antara tipe *Private* dan *Public*.
- Melihat data jumlah *cloning* (salinan) repositori secara mentah.
- Melihat data pekanan jumlah salinan dan jumlah *view* (tampilan) dari masing-masing repositori dengan data yang sudah agak dirapikan.
- Melihat data statistik repositori harian agak lengkap, mencakup: nama, tipe, jumlah bintang, data *clone*, data *view*, data konten (*path*) populer, dan data *referrer* (perujuk).



**a. Melihat daftar nama repositori.**<br />
Sintaks utamanya adalah pada kode berikut.

```
# import library
from github import Github
# masukkan token akses
g = Github("token")
# telusuri setiap repositori
for repo in g.get_user().get_repos():
    print(repo.name)
``` 

Contoh luarannya adalah:
```text
Baca_Tulis_Bilangan
Cari_Buku
...
vb6-pencari-file
VB6_MySQL
```

**b. Memeriksa tipe repositori.**<br />
Kode utamanya adalah:
```
# inisialisasi jml repo berdasarkan tipe (private atau public)
jmlRepoPrivate = 0
jmlRepoPublic = 0

# akses repository
aksesRepo = g.get_user().get_repos()

# menelusuri semua repo
for no, repo in enumerate(aksesRepo):
    if repo.private:
        jmlRepoPrivate += 1
        tipe = "Private"
    else:
        jmlRepoPublic += 1
        tipe = "Public"

    print(f"Repository ke-{no+1}: {repo.name}, tipe: {tipe}")

print(f"\nJumlah repository tipe Private: {jmlRepoPrivate}, "
      f"Public: {jmlRepoPublic}, "
      f"total: {aksesRepo.totalCount}")
```

Contoh luarannya adalah:
```text
Repository ke-1: Baca_Tulis_Bilangan, tipe: Public
Repository ke-2: Cari_Buku, tipe: Public
...
Repository ke-14: vb6-pencari-file, tipe: Public
Repository ke-15: VB6_MySQL, tipe: Public

Jumlah repository tipe Private: 3, Public: 12, total: 15
```

**c. Melihat data jumlah *clone* pekanan.**<br />
Kode utamanya adalah:
```
for no, repo in enumerate(aksesRepo):
    print(f"\nRepository ke-{no + 1}: {repo.name}")
    data_clone = repo.get_clones_traffic(per="week")
    print(data_clone)
```

Contoh luarannya:
```text
...
Repository ke-13: vb6-mini-projects
{'count': 0, 'uniques': 0, 'clones': []}

Repository ke-14: vb6-pencari-file
{'count': 1, 'uniques': 1, 'clones': [Clones(uniques=1, timestamp=2021-11-08 00:00:00, count=1)]}

Repository ke-15: VB6_MySQL
{'count': 6, 'uniques': 4, 'clones': [Clones(uniques=3, timestamp=2021-11-01 00:00:00, count=3), Clones(uniques=2, timestamp=2021-11-08 00:00:00, count=3)]}
```

**d. Melihat data pekanan jumlah *clone* dan *view*.**<br />
Kode utamanya (untuk *view*):
```
for no, repo in enumerate(aksesRepo):
    data_view = repo.get_views_traffic(per="week")
    print("Data View.")
    print(f"  Jumlah view total: {data_view['count']}")
    print(f"  Jumlah view unik: {data_view['uniques']}")
    if data_view:
        for i, data in enumerate(data_view['views']):
            print(f"    View ke-{i + 1} = tanggal: {data.timestamp}, total: {data.count}, jumlah unik: {data.uniques}")
```

Contoh luarannya (*clone* dan *view*):
```text
...
Repository ke-11: python_list
Data Clone.
  Jumlah clone total: 13
  Jumlah clone unik: 10
    Clone ke-1 = tanggal: 2021-10-25 00:00:00, total: 12, jumlah unik: 9
    Clone ke-2 = tanggal: 2021-11-01 00:00:00, total: 1, jumlah unik: 1
Data View.
  Jumlah view total: 52
  Jumlah view unik: 6
    View ke-1 = tanggal: 2021-10-25 00:00:00, total: 45, jumlah unik: 5
    View ke-2 = tanggal: 2021-11-01 00:00:00, total: 4, jumlah unik: 2
    View ke-3 = tanggal: 2021-11-08 00:00:00, total: 3, jumlah unik: 1
...
```

**e. Melihat data statistik harian agak lengkap.**<br />
Kode utamanya:
```
# jumlah bintang
print(f"  Jumlah bintang: {repo.stargazers_count}")
# sumber data clone harian
data_clone = repo.get_clones_traffic(per="day")
# sumber data view harian
data_view = repo.get_views_traffic(per="day")
# data populer
data_populer = repo.get_top_paths()
# top data referrer
data_referrer = repo.get_top_referrers()
```

Contoh luarannya.
![tugas_5.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1636568901707/bMZHUInfy.gif)

---

Demikian tutorial mengakses data statistik repositori di *Github* menggunakan ***PyGithub***. Selanjutnya dapat dikembangkan dalam bentuk antarmuka yang lebih *user friendly* dan enak dipandang. 

Kode sumber selengkapnya dapat di cek di repositori *Github* saya.

%[https://github.com/galihboy/Github_Repo_Stats]

Semoga bermanfaat.
Terima kasih.

[Web Utama](https://galih.eu) **·**  [Blog](https://blog.galih.eu)  **·** [Github Pages](https://galihboy.github.io/) **·** [Medium](https://masgalih.medium.com/)
