FLYING

/* TODO: 気の利いた説明を書く */

Firefox4でも健やかにTumblr Lifeを送りたい

先ほど(2011-04-02 11:00:00+09:00)確認したところ,Tumblr Life 0.5.7が公開されていました。後述の問題は修正されているため,Tumblr Lifeのスクリプト編集は必要ありません。Minibufferは依然として(たぶん)そのままでは動かないので,「GreasemonkeyとMinubufferを修正する」の作業については行う必要がありそうです。

以下の内容は既に古くなっています

僕らが待ちに待っていたFirefox4がリリースされましたね!起動もそこそこ早いし,Firefox3のようなフリーズ現象も全く起こらないし,新インターフェイスもシンプルで快適だし,ふぉくす子はかわいいしで,まったくもって非の打ち所のないアップデートだと言えるでしょう。

コレで以前にも増して快適なインターネッツライフを送れるぜ!とワクワクしていたのですが……なんとそのままではTumblr Lifeが動かないΣ(゚д゚lll)ガーン……ということでTumblr LifeでReblogできるようにするまでの過程をメモしておきます。

ちなみに,この記事の対象としているFirefoxはバージョン4.0Greasemonkey(アドオン)はバージョン0.9.1Tumblr Life(User Script)はバージョン0.5.5です。上記以外の環境ではこの記事の内容は有効ではない可能性がありますので,十分注意してください。

GreasemonkeyとMinibufferを修正する

Firefox 4 で Minibuffer + LDRize + ReblogCommand を動かす | WWW WATCH

こちらの記事を参照し,記事の指示に従ってソースを書き換えてください。うまく行けば,MinibufferがFirefox4上でも動くようになると思います。

Tumblr Lifeを修正する

上記の作業によって,Tumblrdashboard上でもMinibufferが動くようになり,Minibufferに依存するTumblr Lifeも一部(likeやreblog manuallyなどの操作)のみ動作するようになります。しかし,この環境ではTumblr Lifeでreblogを行っても(画面上に「reblogged」と表示されるにも関わらず)Tumblr側に反映されません

ということで,下記のようにスクリプトを修正する必要があります。

GreasemonkeyにインストールされているUser Scriptの一覧画面(アドオンパネルにあります)を開き,Tumblr Lifeの項目上で右クリックして「Edit」を選択します。(ここで,スクリプトを編集するテキストエディタを指定するように求められることがあります。指示に従ってテキストエディタの本体を指定してあげてください。)

すると,テキストエディタTumblr Lifeのスクリプトが開きますので,770行目付近にある下記のコードを探してください。

	param: function(html, filter) {
		var self = this;
		var param_list = $X(
			'id("edit_post")//*[name()="input" or name()="textarea" or name()="select"]',
			createDocumentFromString(html)
		);
		var q = [];
		var params = {};

これを次のように書き換えます。

	param: function(html, filter) {
		var self = this;
		var param_list = $X(
			//書き換えました
			'id("edit_post")//*[self::input or self::textarea or self::select]',
			createDocumentFromString(html)
		);
		var q = [];
		var params = {};

完了したら,Tumblrdashboardを開いてreblog操作を試してみてください。reblogがTumblr側に反映されるようになったはずです。

スクリプト修正までの手順

まず,Tumblr LifeによるreblogがTumblr側に反映されないことが分かったので,その原因を探すことにしました。

Firebugを使って,Tumblr Lifeでreblogを行ったときのFirefoxの動作を調べてみたところ,まず素の(User Scriptによるソースの書き換えを行っていない)dashboardのreblogリンクをクリックしたときと同様のGETリクエストをTumblrサーバに送信しているようでした*1

すると,GETリクエストに対するレスポンスとしてpost画面(reblog manuallyでポップアップする画面)が返ってくるので,この画面のform(id="edit_post")に含まれるすべてのinputパラメータをxpathで取得し,それらのパラメータをTumblrサーバにPOSTリクエストとして送信しているようでした*2

これらの操作を実現するコードは,スクリプトの680行目付近のTumblrLife.ReblogMenu#reblogメソッドと,同770行目付近のTumblrLife.ReblogMenu#paramメソッドに収まっています。

これらの流れのどこでスクリプトがコケているのかと言うと,ずばりすべてのinputパラメータをxpathで取得という部分です。TumblrLife.ReblogMenu#paramメソッドにおいて宣言されているparam_listという変数をGM_log関数*3で確認してみると,xpathによるパラメータの抽出がうまく動いていないことが分かりました。

xpathによるパラメータ抽出が原因だと推測できたので,後はreblogのpost画面でFirebugのコンソールにて,$x関数*4を使ってパラメータ抽出がうまくいきそうなxpathを片っぱしから試してみるだけです。最終的にid("edit_post")//*[self::input or self::textarea or self::select]というxpathでうまくいくようになりました。

うーん……xpathの扱いについて,Firefox4で仕様変更があったのでしょうか?詳しいことは調べていないのでよく分からないです。

最後に

素晴らしいソフトウェアやスクリプトを提供してくださる開発者の皆様,tips記事をアップしてくださるブロガーの皆様に感謝なのです。それとFirebug便利。

*1:これは,Tumblrサーバにとっては素のdashboardでユーザーがreblogリンクをクリックしたのと同様に見えます

*2:これも,Tumblrサーバにとっては素のdashboardを経由してユーザーがreblogをsubmitしたのと同様に見えます

*3:Greasemonkeyが提供するデバッグ用関数らしい

*4:Firebugで使えるxpathのテスト用関数らしい