Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

GitHubでReleaseしたファイルのダウンロード数を取得する

はじめに

GitHubのReleaseで公開しているファイルのダウンロード数を取得する方法を調べたので、メモしておく。

ここでは、Docker ComposeのReleaseを例に挙げて説明する。 Docker ComposeのReleaseのページは以下のようになっているが、このページのAssetsとして登録されているファイルのダウンロード数を取得することになる。

f:id:redj:20201219131213p:plain

特定のReleaseのダウンロード数の取得方法

Assetsに登録されているファイルのダウンロード数は、GitHubAPIで取得できる。 以下に、Docker Compose 1.27.4のReleaseページで公開されているファイルの情報を取得する例を示す。

$ curl \
    --silent \
    --header "Accept: application/vnd.github.v3+json" \
    https://api.github.com/repos/docker/compose/releases/tags/1.27.4

返却されるjsonには様々な情報が含まれているのだが、ダウンロード数のカウントに必要な部分だけ抜粋すると、以下のようになる。

{
  "html_url": "https://github.com/docker/compose/releases/tag/1.27.4",
  "assets": [
    {
      "name": "docker-compose-Darwin-x86_64",
      "download_count": 6705,
    },
    {
      "name": "docker-compose-Darwin-x86_64.sha256",
      "download_count": 191,
    },
    {
      "name": "docker-compose-Darwin-x86_64.tgz",
      "download_count": 813,
    },
    {
      "name": "docker-compose-Darwin-x86_64.tgz.sha256",
      "download_count": 129,
    },
    {
      "name": "docker-compose-Linux-x86_64",
      "download_count": 424905,
    },
    {
      "name": "docker-compose-Linux-x86_64.sha256",
      "download_count": 37947,
    },
    {
      "name": "docker-compose-Windows-x86_64.exe",
      "download_count": 23259,
    },
    {
      "name": "docker-compose-Windows-x86_64.exe.sha256",
      "download_count": 10752,
    },
    {
      "name": "run.sh",
      "download_count": 12628,
    }
  ],
}

全てのReleaseのダウンロード数の取得方法

特定のReleaseのダウンロード数の取得方法とほぼ同じで、指定するURLを以下のように変更すればよい。

$ curl \
    --silent \
    --header "Accept: application/vnd.github.v3+json" \
    https://api.github.com/repos/docker/compose/releases

返却されるjsonは、特定のReleaseの情報を配列形式にしたものである。 省略しつつ構造を示すと、以下のようになる。

[
  {
    "html_url": "https://github.com/docker/compose/releases/tag/1.28.0-rc1",
    "assets": [
        ...
    ],
    ...
  },
  {
    "html_url": "https://github.com/docker/compose/releases/tag/1.27.4",
    "assets": [
        ...
    ],
    ...
  },
  {
    "html_url": "https://github.com/docker/compose/releases/tag/1.27.3",
    "assets": [
        ...
    ],
    ...
  },
  ...
]

ただし、Releaseの数が多い場合はページネーション(つまり複数回の取得)が必要になるかもしれないが、GitHub APIのドキュメントを深くは読んでないので、よく分かってない。

ダウンロード数の集計の例

ダウンロード数の集計の例として、特定のRelease (ここでは Docker Compose 1.27.4)を、コマンドjqを利用して集計してみると、以下のようになる。

$ curl \
    --silent \
    --header "Accept: application/vnd.github.v3+json" \
    https://api.github.com/repos/docker/compose/releases/tags/1.27.4 \
    | jq "[.assets[].download_count] | add"

517666

また、全てのReleaseに対して集計する例は、以下のようになる。

$ curl \
    --silent \
    --header "Accept: application/vnd.github.v3+json" \
    https://api.github.com/repos/docker/compose/releases \
    | jq "[.[].assets[].download_count] | add"

11089246

前述したが、全てのReleaseの取得では、ページネーションを意識する必要があるかもしれない。

補足1:ソースのアーカイブはAssetではない(ようだ)

ところで、「Source code (zip)」と「Source code (tar.gz)」については、以下のように画面上はAssetsに含まれているが、GitHubAPIの呼び出しの結果には含まれていない。

f:id:redj:20201219131238p:plain

このことはGitHub APIのドキュメントには書かれていないようだが、GitHubの中の人と思われるIvan ZuzakさんがStack Overflowで以下のようにコメントしていた。

Assets are binaries you can upload when creating a release. Try creating a release and look for the "Attach binaries by dropping them here or selecting one." text. We track download counts only for those assets, not for releases themselves (currently).

行間を読むと、これら2つのファイルは単にソースコードアーカイブしたものであり、リリースバイナリではないので、Assetとはみなしていない、ということなのだろう。

補足2:ダウンロード数をカウントするWebサイト

ダウンロード数を単に目視確認したいだけなら、以下のWebサイトを利用するとよい。

このWebサイトのソースコードはGitHubにあるJavaScriptからGitHub APIを呼び出しているようだ。

参考