😀

シェル芸でGitHubの日付別Contribute数を取得

2021/09/28に公開

概要

シェル芸で日付別のGitHubの草情報を取得し日付別にContribute数を整形して表示したい.

やってみた

まず列挙.

https://github.com/users/eggplants/contributionsのソースを見ると, 草の部分に<rect>要素が列挙されていることがわかる.

image.png

しかし<rect>要素を抜き出すと

image.png

のような部分も取得してしまう. なので以下のような草濃度部分の<rect>は除く必要がある.

image.png

ので, 以下のようにする.

$ curl -s https://github.com/users/eggplants/contributions \
  | awk '/data-count/{print$9,$10}'

どうやら直近1年分取得できそうだ.

result
data-count="0" data-date="2020-02-23"
data-count="0" data-date="2020-02-24"
data-count="1" data-date="2020-02-25"
data-count="0" data-date="2020-02-26"
data-count="1" data-date="2020-02-27"
...(省略)...
data-count="5" data-date="2021-02-20"
data-count="6" data-date="2021-02-21"
data-count="1" data-date="2021-02-22"
data-count="0" data-date="2021-02-23"
data-count="7" data-date="2021-02-24"

日付とContribute数を並べて表示.

$ curl -s https://github.com/users/eggplants/contributions \
  | awk '/data-count/{print$9,$10}' | awk -F\" '$0=$4" "$2'

大分扱いやすい形式になった.

result
2020-02-23 0
2020-02-24 0
2020-02-25 1
2020-02-26 0
2020-02-27 1
...(省略)...
2021-02-20 5
2021-02-21 6
2021-02-22 1
2021-02-23 0
2021-02-24 7

試しに, ここから昨日のcontribute数を検索してみる.

$ date
2021225日 木曜日 02:13:11 JST
$ date +%Y-%m-%d
2021-02-23
$ date +%Y-%m-%d -d "1 day ago"
2021-02-24
$ curl -s https://github.com/users/eggplants/contributions \
  | awk '/data-count/{print$9,$10}' | awk -F\" '$0=$4" "$2' \
  | grep "$(date +%Y-%m-%d -d "1 day ago")"
2021-02-24 7

取得できた.

応用

eggplants/contributter.sh

contributter(){
  local user="$1" day_before="${2-1}"
  local target_date="$(date +%Y-%m-%d -d "${day_before} day ago")"
  echo "${user} さんの ${target_date//-//} の contribution 数: $(
    curl -s https://github.com/users/${user}/contributions \
      | grep -oP "(?<=data-count=\")[0-9]+(?=\" data-date=\"${target_date})"
  ) #contributter_report"
}
result
$ contributter eggplants
eggplants さんの 2021/02/24 の contribution 数: 7 #contributter_report
$ conributter eggplants 2
eggplants さんの 2021/02/23 の contribution 数: 0 #contributter_report

解説

  • 第一引数はユーザ名(user), 第2引数はn日前(day_before)を表す.
    また第2引数が存在しない場合, ${変数-デフォルト値}構文で1が代入される.

  • target_dateには, n日前の日付をYYYY-mm-dd形式で代入する.

  • ${target_date//-//}は, ${変数//置換パターン/置換文字}構文で, YYYY-mm-ddYYYY/mm/ddに置換している.

  • 前項で行っていた, awkによる特定日付のContribute数取得の部分は, grepの肯定先/後読み(?<=before-pattern)value(?=after-pattern)でうまく抽出できる.

結論

シェル芸でやる必要ある?

GitHubで編集を提案

Discussion