Github 周りのいい感じのバッジが欲しい
結論
- 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サーバーを作ろうかな
全リポジトリのコード総数とかも出したい
やりたいこと
ポートフォリオやGithubプロフィールに載せる「ステータスバッジがほしい」
具体的には
- 全リポジトリのコミット数
- Githubを使い始めてどれくらいか
- リポジトリの数
- 最近プッシュした日付
有名なサービスだと
最後の2つはバッジではない(SVGを返す)技術的に取得は可能
Shields.ioで動的なバッジを作成できる
認証不要でURL指定だけで取得できるJSON APIとかなら
取得したJSONをJSONPath クエリでフィルター可能
レート制限にひっかからないの?
Github Rest APIにはレート制限がある
認証されていないリクエストでは、レート制限により 1 時間あたり最大 60 リクエストまで可能です。 認証されていないリクエストは、リクエストを行っているユーザではなく、発信元の IP アドレスに関連付けられます。
よほどじゃない限り大丈夫そう
Shields.ioにもcachesecondsの設定ができる
見たところ?cacheSeconds=2592000
の設定が多そう(=一ヶ月)
Github Search API
今年のコミット数とかを調べる
プレビュー版のため、Header設定が必要
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設定でコミット検索が可能。コミット数も分かる
仮説:サーバー側でAPIを叩き、算出した数字をShields.ioに載せるのがよい?
- 全リポジトリのコミット数
- searchAPIはサーバー側で実行する必要がある
- パブリックだけなら既存のバッジで可能
- Githubを使い始めてどれくらいか
- 日付計算のロジックはサーバー側
- リポジトリの数
- プライベートリポジトリどうする
- 最近プッシュした日付
- これは行けそう?→無理でした
プライベートリポジトリの情報も取得したい!
Basic認証をすればプライベートRepoの情報も取得可能
Tokenを作成した
権限をどこまで持たせればいいのかはまだ調べていない
↑とりあえずこれでいけた
当たり前だけどサーバーがないといけない
パブリックリポだけでいいから気軽に使えるバッジが欲しい…!
最終アクティビティ日を取得する
https://api.github.com/users/kcabo/events?per_page=100
→だめでした
Shields.ioは内部的にjson-pathを使っている
このライブラリでスライスと検索は同時にできない(Filter結果をスライスができない)
→"type": "PushEvent"
を抽出してそのうち最初の要素、ができない
こちらでも言及がある
メモ
GithubのAPI
総コミット数→全ブランチ、かぶりなし、全リポ、自分の意外も
デフォルトリポジトリのからならContributionが最も汎用的に取れる
コミット、ブランチ、リポの関係は?
あるリポジトリの全ブランチを取得する方法を探る
あるいは全コミットのうち自分のみ SwimRanking~が役立つか
ユニークなコミットであるかの情報自体はGitが持っている→取り出すのはむずい?→そもそもGitがそうしたいときはないからそういうふうに作られていない
→結論、無理
こんとりで以降
ラストコミット→まあプッシュだわな→EventのRESTから取得 現状で十分?
各リポジトリの最終プッシュ日→どうせ自分のリポジトリでしょう
V4で行くか
権限管理
コントリビューションならこれだけでOK(Privateリポジトリでもコントリビューションに反映されるように設定する必要あり)
リポジトリのコミット数とかはこれで十分取得できるかな?