Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

livedoor Reader に ping を送信する Greasemonkey スクリプト

livedoor Reader が ping の受け付けを開始したとのことだけど、「はてなダイアリーのヘルプ - リンク元・Ping送信設定を変える」に見られる通り、はてなの ping 送信先は決め打ちで、かつ、LDR に対応してないので、それ Gre(ry
つかこれテキトー過ぎ。まぁ、テキトーじゃなかったことなど、これまで一度もなかったのだが!つか、これでうまくいってるのかどうか、よくわかりません><

UPDATE: なんかうまくいってない気がする。まぁどうでもいいけど。

MORE UPDATE: 編集画面の submit と同時に ping を送っちゃうと、エントリが保存されていないため、更新前のフィードが取得されちゃうようなので、画面遷移後に ping を送信するようにした。

// ==UserScript==
// @name          LDR UpdatePing
// @namespace     http://antipop.gs/ns/greasemonkey/ldr_updateping
// @include       http://d.hatena.ne.jp/*
// ==/UserScript==
//
// This script was written by Kentaro Kuribayashi
//
// Homepage: http://antipop.gs/
// Weblogs : http://d.hatena.ne.jp/antipop/ (in Japanese)
//           http://antipop.typepad.com/    (in English )
//
// Copyright (C) 2006 by Kentaro Kuribayashi
//
// This script is distributed under the CCPL by-sa
//  - See: http://creativecommons.org/licenses/by-sa/2.5/
//

(function(){
    var SCRIPT_NAME = 'LDR UpdatePing';
    var VERSION     = '0.02';
    var isAfterEdit = GM_getValue('isAfterEdit');
    var pingUri     = 'http://rpc.reader.livedoor.com/ping';

    if (!isAfterEdit && location.href.match(/http:\/\/d\.hatena\.ne\.jp\/[^\/]+\/edit.*/)) {
        $X('//input[@name = "edit"]')[0].addEventListener('click', function () {
            GM_setValue('isAfterEdit', true); 
        }, false);
    }
    else if (isAfterEdit) {
        var title = document.title.split(' - ')[0];
        var link  = location.href.match(/(http:\/\/d\.hatena\.ne\.jp\/[^\/]+\/).*/)[1];
        var call  = <methodCall>
                      <methodName>weblogUpdates.ping</methodName>
                      <params>
                        <param><value><string>{title}</string></value></param>
                        <param><value><string>{link}</string></value></param>
                      </params>
                    </methodCall>
                    ;

        GM_xmlhttpRequest({
            method  : 'POST',
            url     : pingUri,
            headers : {
                'User-Agent'   : [SCRIPT_NAME, '/', VERSION].join(''),
                'Content-Type' : 'text/xml',
            },
            data    : call.toString(),
            onload  : function (res) {
                alert(new XML(res.responseText.replace(/^<\?xml.+?\?>/, ''))..string[0]);
                GM_setValue('isAfterEdit', false); 
            },
            onerror : function (res) {
                alert(['Error', res.statusText].join(' - '));
            },
        });
    }

    // $X was originally written by cho45 (http://lowreal.net/logs/2006/03/16/1), and
    // it is distributed under the CCPL by-sa same as this script
    function $X (exp, context) {
        if (!context) context = document;
        var resolver = function (prefix) {
            var o = document.createNSResolver(context)(prefix);
            return o ? o : (document.contentType == 'text/html') ? '' : 'http://www.w3.org/1999/xhtml';
        }
        var exp = document.createExpression(exp, resolver);

        var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
        switch (result.resultType) {
            case XPathResult.STRING_TYPE : return result.stringValue;
            case XPathResult.NUMBER_TYPE : return result.numberValue;
            case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
            case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                var ret = [];
                for (var i = 0, len = result.snapshotLength; i < len ; i++) {
                    ret.push(result.snapshotItem(i));
                }
                return ret;
            }
        }
        return null;
    }
})();