はじめに
みんな大好き超便利Go製ツールのfzfを使ってターミナルからChromeのブックマークを開くコマンドを作りました。
Githubリポジトリ
https://github.com/RyuseiNomi/bookmark_fzf
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のキーを取得するなどしてブックマークを開くことなども可能です。