ChromeOSのダウンロードリンクを取得する

Shell Script

こんにちは、山田ハヤオです。わずかにですが基本的なJavaScriptだけならかけます。

まぁTypeScriptとかJSXは書けないんですけどね。雰囲気と気合いで読んでる。

そんなわけで今回の内容はChromeOSのバイナリファイルを直接取得する記事です。

スポンサーリンク

きっかけ

レスポンス兄貴のこのツイート。

ツイートの前後は見てないのですが、とりあえず「リカバリユーティリティ」以外からダウンロードできればよさそうです。

なのでCheomebookのリカバリユーティリティのソースコードを解析してダウンロードリンクの取得をしようと思います。

Chromeリカバリユーティリティのソースコード

探した感じでは公式のソースコードを発見することはできませんでした。

しかし、ChromeリカバリユーティリティはChrome拡張機能として実装されているので、コンパイルされたJavaScriptやCSSは拝むことができます。

ということでそこからリンクを探していきます。

リカバリユーティリティのダウンロードリンクから、拡張機能のIDは「pocpnlppkickgojjlmhdmidojbmbodfm」であることがわかります。

その後、Chrome上でchrome://version/にアクセスし、「プロファイルパス」を取得し、エクスプローラなどでそのパスに移動します。

その後、「<拡張機能のID> → <拡張機能のバージョン> 」とディレクトリを移動します。

ハヤオの環境の場合は、MacOSだったので

/Users/hayao/Library/Application Support/Google/Chrome/Default/Extensions/pocpnlppkickgojjlmhdmidojbmbodfm/0.0.8_0

でした。バージョンやプロファイルのパスなどはOSや環境で大きく変化するので各自で調べてください。

拡張機能のディレクトリを特定できたら、エディタを起動してコードを探していきます。

モデル一覧をJSONで取得していることは予想できたので、ディレクトリ全体を VSCodeで「.*.json」みたいな感じで検索をかけました。

結論

ソースコード直下のapp_compiled-bundle.jsに以下のようなコードを発見しました。

(ソースコードのライセンスが不明なのですがダウンロードできるものなので掲載します。)

2つのJSONを取得しているようです。以下に同じリンクを掲載します。

https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.json
https://dl.google.com/dl/edgedl/chromeos/recovery/cloudready_recovery.json

上はChromeBook用で下がCloudReady(Chrome OS Flex)のもののようです。

今回の目的はChrome OS FlexのURL取得なので、これで目的達成です。

JSONの構造

見ればわかるという人が多いと思いますが一応形式を書いておきます。

[
  {
    "channel": "ブランチ名(文字列)",
    "desc": "説明()",
    "file": "ファイル名",
    "filesize": イメージファイルサイズ(整数),
    "hwidmatch": "^REVEN($| .*)",
    "manufacturer": "メーカー名(文字列)",
    "md5": "イメージのMD5チェックサム(文字列)",
    "model": "モデル名(文字列)",
    "name": "OS名(文字列)",
    "photourl": "モデルの写真のURL(文字列)",
    "sha1": "イメージのSHA1チェックサム",
    "sku": "",
    "url": "実際のイメージが含まれたZipファイルへのURL(文字列)",
    "version": "イメージファイルのバージョン",
    "zipfilesize": Zipファイルサイズ(整数),
    "chrome_version": "Chrome OSのバージョン",
    "hwids": []
  }
]

こいつを取得すれば好きにURLを取得できるというわけです。

おまけ

シェルスクリプトで、指定したモデルのリンクを取得するコードを書いてみました。

最新のBashとjqコマンドがあれば動作します。

#!/usr/bin/env bash
set -Eeu
chromeos_json=('https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.json' 'https://dl.google.com/dl/edgedl/chromeos/recovery/cloudready_recovery.json')
namelist=("")
urllist=("")

while read -r json; do
    readarray -t -O "${#namelist[@]}" namelist < <(jq -r ".[].name" <<< "$json")
    readarray -t -O "${#urllist[@]}"  urllist  < <(jq -r ".[].url" <<< "$json")
done < <(printf "%s\n" "${chromeos_json[@]}" | xargs -I{} bash -c 'curl -sL {} |tr -d "\n"; echo')
len="$(( "$(wc -m <<< "$(( "${#namelist[@]}" - 1))")" - 1 ))"
while read -r index; do
    printf "%0${len}d: %s\n" "$index" "${namelist[$index]}"
done < <(seq "$(( ${#namelist[@]} - 1))")
echo -ne "\n番号を入力してください> "
read -r selected
[[ -n "${urllist[$selected]-""}" ]] || exit 1
echo "${urllist[$selected]}"

curlコマンドで一覧を取得し、jqコマンドでjsonをパースしています。

リダイレクトと配列、変数を多用してしまうのが悪い癖。

それでは、また今度。

コメント

タイトルとURLをコピーしました