DashboardやLikeのページでポストをReblogできるキーボードショートカットを追加するシンプルなUser Script「Reblogable」をつくってみた

先日、DashboardやLikeのページで、これまでのJ、Kキーによるポスト間移動に加えて、LキーからLikeできるようになったので、TキーでReblogできるだけのシンプルなUser Scriptをつくってみた。いずれは公式でも実装されるかもしれないので、それまでの繋ぎになれば。

インストールはこちら。

https://raw.github.com/gist/1609210/reblogable.user.js

ソースコードはこちら。

Add shortcut key T for Reblog on Tumblr Dashboard. — Gist

RキーやHキーでReblogしたいという人はコードを参考に書き換えると良いかも。コードはメタデータをあわせても90行に満たないほど小さいので、似たようなUser Scriptを自作したい人の参考になると良い。

動作確認はWindows 7 Home Premium SP1 64bit上のFirefox 9.0.1(Scriptish 0.1.6)、Chrome 16.0.912.75、Safari 5.1.2(NinjaKit 0.8.5)、Opera 11.60で行った。不具合があれば@syoichiまで。

Tumblr LifeCursedTumblrなどの多機能なUser Scriptはいくつかあるみたいだけど、Reblogできるだけの単機能なUser ScriptはReblogCommandTumblr Dashboard Quick ReblogのようにMinibufferに依存するものぐらいしか見当たらなかったのと、DashboardやLikeのページでReblogするにはどのような処理をすれば良いのかを知りたかったというのもつくってみた理由。

J、K、T、Lがあれば良いという人なら、Preferencesの「Enable endless scrolling」を有効にしていれば、Reblogableをインストールするだけで高速にReblog/Likeできる環境を構築できると思う。

Reblogableの主な処理工程は以下。

  1. 初めにどのキーを入力したらReblogするのかを決める
  2. Reblogに必要なデータを予め取得
  3. DashboardやLikeのページの最後のページで底の方にあるポストをReblogできるようにページ下部を広げておく
  4. 準備ができたらキーボードの入力を監視
  5. Tキーが入力されたら J、Kキーで選択されているポストを特定する
  6. 特定したポストからReblogのページのリンクを取得
  7. リンクがあれば次のポストを特定する
  8. 次のポストがあればそのポストに移動する
  9. ここから、6で取得したリンクからURLを取り出し、Reblogする為の通信を開始する
  10. Reblogのページにおける入力フォームのデータを送信するやり方を再現して、9で取り出したURLに向けて、2で取得したReblogに必要なデータを送信する

上記の処理に関して幾つか補足を。

ReblogのページからReblogした時、以下のデータが送信されているみたい。

この内、Reblogするのに最低限送信しなければいけないデータが、ポスト(この場合ではReblogしたポスト)を公開するか下書きにするかなどの状態を示す「post[state]」と「form_key」らしい。

Reblogableでは「post[state]」と「form_key」に加えて「redirect_to」も送信している。これはReblogした後に、リダイレクトによりDashboardのページを取得してしまうのを防ぐ為。

防いでおかないとReblogする度に不必要な通信が発生してしまう(ChromeではXMLHttpRequest.responseTextに取得してしまったDashboardのページのソースが入っていた)。リダイレクトを無効にする事はできないみたいだったので、代わりに空のテキストを示す「data:text/plain,」というData URIを指定してみた。

エラーが発生している(XMLHttpRequestProgressEvent.typeがerror)ので良くないやり方ではあるが、これで少なくとも不必要な通信の発生は回避できた。

ちなみに、Preferencesの「Edit posts using」で「rich text editor」を選択している時、空のTextポストなどを作れてしまうのだけど、このポストをReblogするにはさらに「is_rich_text[two]=1」というデータも必要になるようだった。しかし、「Edit posts using」でその他のエディターを選択していて、空のTextポストなどをReblogしようとすると「Post cannot be empty.」と表示される。なので、ここはTumblrの挙動に合わせて、「is_rich_text[two]=1」を送信せず、空のTextポストなどはReblogしないようにしてある。

また、10の後にちゃんとReblogされたか確認する処理をしていないのは、できる限りTumblr側と通信する回数を減らす為とLikeの挙動に合わせた為。LikeはLikeできていない時も赤くなったままなので、Likeが成功したかどうかはその時点でのDashboardではわからなくなっている。

逆に、8ではLikeの挙動とは異なる処理をしている。Reblogした後にすぐ次のポストに移動するのは、Tumblr LifeCursedTumblrなどの挙動とも異なるので良くないかもしれないが、これはTキーを押した事をわかるようにし、また、Reblogした後にすぐ次のポストもReblogできるようにしてみたかったから。これだと、良いポストが連続で来た時に「TTT」とJキーを押さずに連打できる。

5の部分は、かなりおおまかな当たりを付けてポストを特定しているので、User ScriptやUser CSSでDashboardのデザインを改変していたりすると、ここで何らかの不具合が発生するかもしれない。デザインの改変をせずにJ、Kキーで移動していればたぶん問題ないと思う…。

更新

Prev