Open2

GitHub APIのdownload_urlがprivateリポジトリで突然404を返すようになった

catnosecatnose

概要

GitHub APIのContents APIを使ってファイルのメタデータを取得すると、レスポンスbodyにdownload_urlというフィールドが含まれている。

{
  "type": "file",
  "encoding": "base64",
  "size": 5362,
  "name": "README.md",
  "path": "README.md",
  "sha": "3d21ec53a331a6f037a91c368710b99387d012c1",
  "url": "https://api.github.com/repos/octokit/octokit.rb/contents/README.md",
  "html_url": "https://github.com/octokit/octokit.rb/blob/master/README.md",
  "download_url": "https://raw.githubusercontent.com/octokit/octokit.rb/master/README.md",
  ...
}

privateリポジトリの場合にはdownload_urlにはhttps://raw.githubusercontent.com/path?token=...といった形でクエリ文字列でtokenがついている(もちろんURLには有効期限がある)。

そのため、このdownload_urlをフェッチすればprivateリポジトリのファイルであってもダウンロードができたのだが、2022/01/07頃から突然404を返すようになった。publicリポジトリでは問題なく取得できるのだが、privateリポジトリでのみ404が返ってくる。

その前後でアプリケーションのソースコードに変更を行っていないため、GitHub APIの障害 or 仕様が変わったことのどちらかが原因だと考えられるが、statusページにもドキュメントにもTwitterにも一切情報が出てこない。

ちなみにこの他のAPIについてはどれも問題なく動作している。

原因を調査中

フォーラムで報告済み

https://github.community/t/fetching-download-url-from-private-repo-suddenly-stopped-working/221817

  • 2022/01/12追記: 改めて確認したが未だに404を返す

対応

  • GitHubが対応してくれるかどうかも分からないため、Contents APIを使ってコンテンツを取得することにした。リクエストヘッダにaccept: "application/vnd.github.v3.raw"をつけることでファイルの中身を取得できる。
  • 1MBを超える画像等についてはBlobs APIを使って取得することにした。