ShellScriptでGoogle Chromeのブックマークを開く

# はじめに

みんな大好き超便利Go製ツールの[fzf](https://github.com/junegunn/fzf)を使ってターミナルからChromeのブックマークを開くコマンドを作りました。

Githubリポジトリ 
https://github.com/RyuseiNomi/bookmark_fzf

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264906/660c4b57-1212-97f6-da6e-0e5fc0d2e8dc.gif)

# CLIでブックマーク情報を取得

このコマンドを実現するに際して、Googleのアカウントに紐づいているブックマーク情報をShellScriptで取得する必要があります。
Google Chromeのブックマークの情報はお手元のローカルマシンの以下のディレクトリに保存されており、catコマンド等で内容を取得することが出来ます。

```
cat ~/Library/Application\ Support/Google/Chrome/Default/Bookmarks
```

中身はJSON形式で以下のように少々複雑にネストされています。

```json
{
   "checksum": " ",
   "roots": {
      "bookmark_bar": {
         "children": [ {
         {
            "date_added": " ",
            "guid": " ",
            "id": " ",
            "name": "ほげサイト",
            "type": "url",
            "url": "https://hoge/fuga"
         }, {
            "date_added": " ",
            "guid": " ",
            "id": " ",
            "name": "ふがサイト",
            "type": "url",
            "url": "https://hoge/piyo"
         } ],
         "date_added": " ",
         "date_modified": " ",
         "guid": " ",
         "id": " ",
         "name": "ブックマーク バー",
         "type": "folder"
      },
.
.
. // この下にもずらーっとモバイルのブックマーク情報などが続く
```

この中でも今回はPCブラウザから登録されたブックマークのみを扱うので
`roots > bookmark_bar > children` キーの情報をこねくり回します。

# ShellScriptでJSONパース

ShellScriptでJSONをガチャガチャ弄る時は [jqコマンド](https://stedolan.github.io/jq/) が有名ですね。
今回もjqコマンドで実装をしていきます。
以下のようにjqコマンドの引数としてキー名を渡してあげることで、JSONを探索してキーに紐づいた情報を取得することが可能です。とても便利ですね！
jqコマンドの詳しい使い方については、[こちらの記事](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)が大変分かりやすいです(｀･ω･´)

```shell
data=`cat ~/Library/Application\ Support/Google/Chrome/Default/Bookmarks`
bookmark_list=$(echo $data | jq .roots.bookmark_bar.children)
echo $bookmark_list
```

この３行で、最初にcatで表示した複雑なJSONからブックマークの一覧のみを出力できます。

あとはfor文なりwhile文で回していきます。

```shell
i=0
while [ $i -lt $len ];
do
    row_data=$(echo $bookmark_list | jq .[$i])
    type=$(echo $row_data | jq .type)

    name=$(echo $row_data | jq .name)
    url=$(echo $row_data | jq .url)
    echo "${name} : ${url}"
    (( i++ ))
done
```

# ブックマークがフォルダの場合

ブックマークを大量に登録している方ならブックマークフォルダを多様しているかと思われます。
BookmarksのJSONではフォルダタイプのブックマークについては以下のように定義されています。

```json
.
.
.
# ======中略==========
}, {
            "children": [ {
               "date_added": " ",
               "guid": " ",
               "id": " ",
               "name": "ほげサイト",
               "type": "url",
               "url": "https://hoge/fuga"
            }, {
               "date_added": " ",
               "guid": " ",
               "id": " ",
               "name": "ふがサイト",
               "type": "url",
               "url": "https://fuga/piyo"
            } ],
            "date_added": " ",
            "date_modified": " ",
            "guid": " ",
            "id": " ",
            "name": "フォルダだよ",
            "type": "folder"
         }, {
```

`roots > bookmark_bar > children` キーの中にさらに `children` キーがあってその中にブックマークの情報が詰まっています。
うーん、初見では複雑すぎてお手上げです(´・ω・｀)

唯一、`type`というキーを基にフォルダかどうかを判別できるので、これを利用して実装をします。

```shell
row_data=$(echo $bookmark_list | jq .[$i]) #$iはループ中の変数
type=$(echo $row_data | jq .type)

if [ $type = "\"folder\"" ]; then
    #folderの中をさらに探索する
fi
```

このようにして、ローカルに保存されているBookmarkのJSONとjqコマンドを使えば少し複雑ではありますがブックマークの情報を取得することが出来ます。
あとはURLのキーを取得するなどしてブックマークを開くことなども可能です。

# Reference

[jq](https://stedolan.github.io/jq/)
[fzf](https://github.com/junegunn/fzf)
[jq コマンドを使う日常のご紹介](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)