Open11

Github 周りのいい感じのバッジが欲しい

ピン留めされたアイテム
kcabokcabo

結論

  • Shields.ioの機能で全て出力するのは難しく、クライアントあるいはサーバーのどちらかで数値抽出のロジックを書く必要がある
  • プライベートリポジトリも含めた正確な情報を取得するには認証が必要 → JAMStack構成などにし、サーバー上のトークンを使用して数値を抽出する

一定期間内のコミット数合計

  • https://badges.pufler.dev/commits/{periodicity}/{username}
    • periodicity: (yearly, monthly, weekly, daily or all)
    • ※ パブリックリポジトリのみ

Githubを使い始めて何年か

  • https://badges.pufler.dev/years/{username}
    • 年数のみ。日数などは無理。

リポジトリの数

  • https://badges.pufler.dev/repos/{username}
    • ※ パブリックリポジトリのみ

Github上の最近のアクティビティ

  • https://img.shields.io/badge/dynamic/json?label=Latest%20event&query=%24%5B0%5D.created_at&url=https%3A%2F%2Fapi.github.com%2Fusers%2Fkcabo%2Fevents
    • 世界協定時刻で取得
    • リポジトリにスターつけるなどのイベントも含む(最終プッシュ時間ではない)

うーん...

本格的に必要になったらOSSでAPIサーバーを作ろうかな
全リポジトリのコード総数とかも出したい
https://shields.io/endpoint

kcabokcabo

やりたいこと

ポートフォリオやGithubプロフィールに載せる「ステータスバッジがほしい」
具体的には

  • 全リポジトリのコミット数
  • Githubを使い始めてどれくらいか
  • リポジトリの数
  • 最近プッシュした日付

有名なサービスだと
https://shields.io/
https://github.com/lowlighter/metrics
https://github.com/anuraghazra/github-readme-stats
https://github.com/vn7n24fzkq/github-profile-summary-cards
最後の2つはバッジではない(SVGを返す)

技術的に取得は可能

kcabokcabo

レート制限にひっかからないの?

Github Rest APIにはレート制限がある
https://docs.github.com/ja/rest/overview/resources-in-the-rest-api#rate-limiting

認証されていないリクエストでは、レート制限により 1 時間あたり最大 60 リクエストまで可能です。 認証されていないリクエストは、リクエストを行っているユーザではなく、発信元の IP アドレスに関連付けられます。

よほどじゃない限り大丈夫そう

Shields.ioにもcachesecondsの設定ができる
見たところ?cacheSeconds=2592000の設定が多そう(=一ヶ月)

kcabokcabo

Github Search API

今年のコミット数とかを調べる
プレビュー版のため、Header設定が必要
https://docs.github.com/en/rest/reference/search#search-commits-preview-notices

The Commit Search API is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.
To access the API you must provide a custom media type in the Accept header:
application/vnd.github.cloak-preview
☝️This header is required.

→したがってShields.ioでは使えない

https://api.github.com/search/commits?q=author:kcabo+author-date:>=2021-07-01
とHeader設定でコミット検索が可能。コミット数も分かる

kcabokcabo

仮説:サーバー側でAPIを叩き、算出した数字をShields.ioに載せるのがよい?

  • 全リポジトリのコミット数
    • searchAPIはサーバー側で実行する必要がある
    • パブリックだけなら既存のバッジで可能
  • Githubを使い始めてどれくらいか
    • 日付計算のロジックはサーバー側
  • リポジトリの数
    • プライベートリポジトリどうする
  • 最近プッシュした日付
    • これは行けそう?→無理でした
kcabokcabo

プライベートリポジトリの情報も取得したい!

https://docs.github.com/ja/rest/guides/getting-started-with-the-rest-api#using-personal-access-tokens

Basic認証をすればプライベートRepoの情報も取得可能

Tokenを作成した
権限をどこまで持たせればいいのかはまだ調べていない

↑とりあえずこれでいけた

当たり前だけどサーバーがないといけない

パブリックリポだけでいいから気軽に使えるバッジが欲しい…!

kcabokcabo

最終アクティビティ日を取得する

https://docs.github.com/ja/rest/reference/activity#events

https://api.github.com/users/kcabo/events?per_page=100

→だめでした
https://github.com/json-path/JsonPath/issues/272

Shields.ioは内部的にjson-pathを使っている
このライブラリでスライスと検索は同時にできない(Filter結果をスライスができない)
"type": "PushEvent"を抽出してそのうち最初の要素、ができない

https://oboe2uran.hatenablog.com/entry/2018/05/06/131634
こちらでも言及がある

kcabokcabo

メモ

GithubのAPI
総コミット数→全ブランチ、かぶりなし、全リポ、自分の意外も
デフォルトリポジトリのからならContributionが最も汎用的に取れる
コミット、ブランチ、リポの関係は?
あるリポジトリの全ブランチを取得する方法を探る
あるいは全コミットのうち自分のみ SwimRanking~が役立つか
ユニークなコミットであるかの情報自体はGitが持っている→取り出すのはむずい?→そもそもGitがそうしたいときはないからそういうふうに作られていない
→結論、無理
こんとりで以降

ラストコミット→まあプッシュだわな→EventのRESTから取得 現状で十分?

各リポジトリの最終プッシュ日→どうせ自分のリポジトリでしょう
V4で行くか

kcabokcabo

権限管理


コントリビューションならこれだけでOK(Privateリポジトリでもコントリビューションに反映されるように設定する必要あり)


リポジトリのコミット数とかはこれで十分取得できるかな?