mixi メッセージにはたらく Greasemonkey

mixi メッセージってプレミアム会員じゃない限り削除されるのだね。知らなかった。というか気にしていなかった。

ということで。メッセージの詳細画面で使うと、テキストボックスやテキストエリアを追加表示する Greasemonkey を作ってみた。 Greasemonkey 0.8.20100211.5, Firefox 3.5.7, Thunderbird 2.0.0.23 がテスト環境。わたしにとって最も重要な Datula での試験をしていないけど、そこはどうにでも調整してやる。

// ==UserScript==
// @name                        mixi message export helper
// @namespace                   http://d.hatena.ne.jp/naglfar/
// @description                 v0.01
// @include                     http://mixi.jp/view_message.pl*
// ==/UserScript==

( function(){

    var container = document.getElementById("messageDetail");
    m();

    function m() {
        var vh = document.getElementsByTagName("dd");

        var vd = new Date("1900/01/01 00:00:00");
        var va = vh[1].getElementsByTagName("a")[0].getAttribute("href");
        var vt = e(document.getElementsByTagName("h3")[0].firstChild.nodeValue);

        var vhb = document.getElementById("message_body").innerHTML;
        var vhh = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><body>';
        var vhf = '</body></html>';

        var vo = "";

        var buf = vh[0].firstChild.nodeValue;

        vd.setFullYear(buf.substring(0, 4));
        vd.setMonth(buf.substring(5, 7) - 1);
        vd.setDate(buf.substring(8, 10));
        vd.setHours(buf.substring(12, 14));
        vd.setMinutes(buf.substring(15, 17));

        vo += "<form>" + "\r\n";

        vo += '<input type="text" size="70" value="';
        vo += va.substring(va.indexOf("id=") + 3);
        vo += '_';
        vo += vd.getFullYear();
        vo += f(vd.getMonth() + 1);
        vo += f(vd.getDate());
        vo += f(vd.getHours());
        vo += f(vd.getMinutes());
        vo += '.txt';
        vo += '" onfocus="select();">' + "\r\n";

        vo += "<br />" + "\r\n";

        vo += '<textarea rows="20" cols="70" onfocus="select();">' + "\r\n";

        vo += "Date: ";
        vo += vd + "\r\n";
        vo += "From: ";
        vo += e(vh[1].getElementsByTagName("a")[0].firstChild.nodeValue);
        vo += "&lt;http://mixi.jp/";
        vo += va;
        vo += "&gt;" + "\r\n";
        vo += "Subject: ";
        vo += vt + "\r\n";
        vo += 'Content-Type: multipart/alternative; boundary="----=_NextPart_MIXI_MESSAGE"' + "\r\n";

        vo += "\r\n";

        vo += "------=_NextPart_MIXI_MESSAGE" + "\r\n";
        vo += 'Content-Type: text/plain; charset="iso-2022-jp"' + "\r\n";
        vo += "\r\n";

        vo += e(vhb.replace(/[\r\n]/g, '').replace(/<br[ /]*>/g, '\r\n').replace(/<img src="http:\/\/img\.mixi\.jp\/img\/emoji\//gi, '[m:').replace(/\.gif".*class="emoji".*>/g, ']')) + "\r\n";

        vo +=  "\r\n";

        vo += "------=_NextPart_MIXI_MESSAGE" + "\r\n";
        vo += 'Content-Type: text/html; charset="iso-2022-jp"' + "\r\n";
        vo += "\r\n";

        vo += e(vhh) + "\r\n";
        vo += e(vhb) + "\r\n";
        vo += e(vhf) + "\r\n";

        vo += "\r\n";

        vo += "------=_NextPart_MIXI_MESSAGE--" + "\r\n";

   var divChild = document.createElement("div");
        divChild.innerHTML = vo;
        container.appendChild(divChild);
    }

    function f(s) { return (s < 10 ? '0' + s : s); };
    function e(s) { return s.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/ /g, '&nbsp;'); }

}) (); 

久しぶりにテキストエディタだけで書いたよ。入力支援なし。文字色の変更もしなかった。さすがにデバッグには Firebug を使ったけれど。

オレオレ仕様?……表示できればいいんだ、とりあえず、いまは。

ソースが汚い?……ごめんなさい。表示できれb(ry

ちなみに。圧縮でもしそうな雰囲気に仕上がったのは、途中まではソースの公開とか恥ずかしいから難読化ツールとか使おうと思っていたからだ。本来ならこんな短い命名しないし、マジックナンバーも使いたくない。本当だからね!

今でも難読化ツールは使いたい。面白そうだから。こんなコードにその価値はないけどね!でもその前に、まずきれいに書き直したいなあ。次の仕様変更に合わせて直すかな。

FIXME. タイムゾーンずれてる。ヘッダは jis-2022-jp エンコードすること。 box=outbox の場合は From を To にすること。メッセージIDが採番できないかどうか。してもあまり意味はないけど。