はてなブックマークで自分のブックマークの既存のタグ名を変更した時に一括置換したいことがあります。 以前は公式のタグの一括置換/削除機能の追加がありましたが、ブックマーク一覧ページのリニューアル時に消えてしまったようです。

Firefoxのアドオン版でも同様の機能がありましたが、もう動かなくなっているので、はてなブックマークのタグを一括置換するコマンドラインツールを書きました。

hatenabookmark-rename-tags

hatenabookmark-rename-tagsはてなブックマーク REST APIsearch.dataを使ってタグの一括置換を行います。はてなブックマークには自分の(privateを含めた)ブックマーク一覧を取得する方法はないため、このコマンドラインツールはpublicなブックマークのみを扱います。

また、REST APIを叩くためにOAuth認証をしたアクセストークンが必要なので、リポジトリにはアクセストークンを取得するElectronアプリもおいています。

使い方

次のステップでタグのリネームを行います。

  1. OAuth認証をしてアクセストークンを取得
  2. hatenabookmark-rename-tagsでリネーム

1.OAuth認証をしてアクセストークンを取得

リポジトリをgit cloneして中に含まれているElectronアプリを実行します。 ロックファイルをおいているのでyarn推奨ですが、npmでも多分通ると思います。

git clone https://github.com/azu/hatenabookmark-rename-tags
cd hatenabookmark-rename-tags
yarn install
yarn run get-token

yarn run get-token を実行するとElectronアプリが起動するので、リネームしたいはてなアカウントでログインすると次のアクセストークンが取得できます。

この2つのアクセストークンがリネームスクリプトで必要なので、コピーしておいてください。

  • HATENA_ACCESS_TOKEN
  • HATENA_ACCESS_SECRET

2. hatenabookmark-rename-tagsでリネーム

アクセストークンが取得できたら、 hatenabookmark-rename-tags をインストールします。 hatenabookmark-rename-tagsは環境変数で先ほどのアクセストークンを渡して実行します。 (コマンドライン引数では渡せるようにまだしてないので、必要な人はPRお願いします。)

npm install -g hatenabookmark-rename-tags
HATENA_ACCESS_TOKEN="___" HATENA_ACCESS_SECRET="____" hatenabookmark-rename-tags [option]

hatenabookmark-rename-tags -h でヘルプがでると思いますが、使い方は次の通りです。

CLI Usage:

Usage
  $ hatenabookmark-rename-tags --user <user> --before <tag> --after <tag>

Options
  --user Hatena User Name
  --before a Tag name that is old name
  --after  a Tag name that is new name
  --reload prune cache data and fetch your bookmarks if this flag is specified

Examples
  $ HATENA_ACCESS_TOKEN="___" HATENA_ACCESS_SECRET="____" hatenabookmark-rename-tags --user test --before "js" --after "JavaScript"
  # ignore cache data
  $ HATENA_ACCESS_TOKEN="___" HATENA_ACCESS_SECRET="____" hatenabookmark-rename-tags --reload --user test --before "before" --after "after"

たとえば、jsタグをJavaScriptに一括置換したい場合は、次のように実行します。 アクセストークンとユーザー名は自分のものにしてください。

HATENA_ACCESS_TOKEN="___" HATENA_ACCESS_SECRET="____" hatenabookmark-rename-tags --user test --before "js" --after "JavaScript"

hatenabookmark-rename-tagssearch.dataの内容を.cache/search.dataにキャッシュしています。 そのため、実行以降に登録した新しくブックマークなども置換したい場合は--reloadオプションを使ってキャッシュを更新してください。(search.dataの取得は重たいので負荷防止のためです。)

:memo: Develop Notes

ElectronアプリでOAuthの部分は以前書いたelectron-authentication-hatenaを使っています。(GitHubやTwitterみたいに自分向けのアクセストークンを簡単に発行する方法はないのかな?)

はてなブックマーク REST APIの実行にはbouzuya/node-hatena-bookmark-apiを使っています。

おそらくはてなブックマークのサーバ側の問題だと思っていますが、REST APIで`tags`に日本語のタグがあると`401 Unauthorized`で登録/更新に失敗する気がしています。

2019-03-16追記: はてなブックマークAPI側で修正されました

これを回避するために、tagsクエリではなくコメントとしてタグを書くようにしています。

[tag][タグ]comment

のようなコメント形式でタグを書けば、日本語のタグも登録できました。