LoginSignup
2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-03

はじめに

みんな大好き超便利Go製ツールのfzfを使ってターミナルからChromeのブックマークを開くコマンドを作りました。

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

demo.gif

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

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

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

中身は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コマンド が有名ですね。
今回もjqコマンドで実装をしていきます。
以下のようにjqコマンドの引数としてキー名を渡してあげることで、JSONを探索してキーに紐づいた情報を取得することが可能です。とても便利ですね!
jqコマンドの詳しい使い方については、こちらの記事が大変分かりやすいです(`・ω・´)

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

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

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

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ではフォルダタイプのブックマークについては以下のように定義されています。

.
.
.
# ======中略==========
}, {
            "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というキーを基にフォルダかどうかを判別できるので、これを利用して実装をします。

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
fzf
jq コマンドを使う日常のご紹介

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1