右クリックでトラックバック

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] このスクリプトを使うと、現在閲覧中のWebページがトラックバック対応ページなら、右クリック一発でトラックバック送信フォームを呼び出せるようになります。Internet Explorer 専用。
[キーワード] トラックバックURL,送信フォーム,自動生成

« ネット世代と言っても、実はさらにその内部に世代があるのではないのか? | トップページ | サークルKの時報 »

2004.05.21

右クリックでトラックバック

たしか、ishinao さんところだったと思いますが(後でちゃんと調べます)、forefox 用のトラックバック送信用 MenuExt を見かけて以来、 Internet Explorer でも動くものが欲しいな、と思ってました。firefox 版そのままではうまく動かず、どうしたものか、ずっと悩みを抱えたまま2ヶ月以上経過。

今日、おはるさんの「トラックバックURLをボタンクリックでコピーする」を見て、 開発再開を決意。先日の「右クリックで cocohore!」でちょっとだけ増えたノウハウを元に、チャレンジしてみたところ、何とか動くものができましたので、 公開します。

少なくとも、trackback auto-discovery に対応している blog, Web サイトなら、ちゃんとトラックバックURLを取れると思います。 とりあえず、Movable Type 系、TypePad系、じゅげむ、Webryblog で動作を確認しました。 (追記: kyo さんの hail2u.net (blosxom) でも動作を確認。)
また、現時点では trackback auto-discovery 未対応なままの「楽天広場」についても、トラックバックURLを拾えるようにしてみました。

この「右クリックでトラックバック」を使えば、トラックバック送信機能のない Webサイトのオーナーでも、 トラックバックが打てるようになります。
トラックバックURLが見つけにくいサイトのトラックバックURLを発見するのにも使えると思います。

*** 2004年8月12日 13時31分 追記***

注意: miyagawaさんの「Trackback の脆弱性についての勧告」 にしたがってトラックバックSPAM対策を実施しているサイトに対しては、本スクリプトによるトラックバック送信が拒絶される可能性があります。 (特に「'User-Agent: Mozilla/.*' といったヘッダを持つ Trackback Ping は拒否する。」という対策を実施しているサイトでは、本スクリプトによるトラックバック送信は拒絶されると思われます。) そのような場合でも、本スクリプトはトラックバックURLを探し出すという目的で使用することはできます。 トラックバックの送信(がどうしても必要な場合)は別の手段で実行してください。

*** 追記 終わり ***

何か、不具合を発見された方は、連絡してください。可能な範囲で対応します。
(2004年5月21日22時57分 追記: Version 1.01 で Nucleus にも対応しました)
(2004年5月22日 2時28分 追記: Version 1.10 で NewsHandler にも対応しました)
(2004年5月22日14時25分 追記: Version 1.10 が「北国TV」にも対応していることを確認)
(2004年5月22日14時30分 追記: Version 1.20 で「はてなダイアリー」と Doblog にも対応しました)
(2004年8月12日13時25分 追記: はてなダイアリーが trackback auto discovery に対応したのを受け、Version 1.21 で「はてなダイアリー」用の特別な処理を外しました)

それでは、ソースコード、いきます。

右クリックでトラックバック

<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8">
<script type="text/javascript" language="JavaScript">
// 右クリックでトラックバック
//   現在閲覧中のページがトラックバック受入れに対応していれば、
//   右クリックでトラックバック送信フォームを開く
//    (この MenuExt を使えば、トラックバック送信機能のない Webサイト
//     からもトラックバックが送信できます)
//
//   Copyleft 2004 by H.Tsujimura (tsupo@na.rim.or.jp)
//
//   Ver 1.21   12 Aug 2004  はてなダイアリーが trackback auto-discovery 
//                           に対応したのに伴い、はてなダイアリー用に書い
//                           ていた特別な処理をコメントアウトする
//   Ver 1.20   22 May 2004  はてなダイアリー、Doblog に対応
//   Ver 1.10   22 May 2004  trackback auto-discovery が body 部にある場合
//                           でも動作するようにした(WebryBlog と じゅげむ
//                           を特別扱いするのをやめた)
//   Ver 1.01   21 May 2004  Nucleus にも対応
//   Ver 1.00   21 May 2004  最初の公開バージョン

obj = external.menuArguments;   // 右クリック時の引数のオブジェクトの参照
page_url  = obj.document.URL;   // 現在閲覧中のWebページのURL
title_txt = obj.document.title; // 現在閲覧中のWebページのタイトル文字列

// ↓ 個々人でカスタマイズする部分
var bname="サイト名"; // ← あなたのサイトの名前に書き換えてください
// ↑ 個々人でカスタマイズする部分

var pingUrl = "";
var str = "";
var inn = "";

// まずは、Trackbak Auto Discovery を試みる
str = obj.document.body.parentNode;
inn = str.innerHTML;
var ttIdx1 = inn.indexOf("rdf:Description");
var ttIdx2 = 0;
    // head 部分に rdf:Description がある場合は、ttIdx1 >= 0 となる
if ( ttIdx1 == -1 ) {
    // body 部分に rdf:Description がある可能性がある場合
    //   (WebryBlog, じゅげむ, NewsHandler, 北国TV など)
    str = obj.document.body;
    inn = str.innerHTML;
    ttIdx1 = inn.indexOf("rdf:Description");
    if ( ttIdx1 == -1 ) {
        // なぜか Doblog の場合は -1 になってしまう → rdf 関連部分がコメントアウトの
        //                                             形になってないのが原因?
        ttIdx1 = inn.indexOf("RDF:DESCRIPTION");
                                     // Doblog の場合、全部大文字だとちゃんとマッチする
    }
}

if ( ttIdx1 >= 0 ) {
    ttIdx2 = inn.substr(ttIdx1).indexOf("/>") + ttIdx1;
    var ttStr  = inn.substring(ttIdx1,ttIdx2);
    if ( ttStr.length > 0 ) {
        // Trackback Auto Discovery 対応 webページの場合
        var i1  = ttStr.indexOf("trackback:ping");
        var i2  = ttStr.lastIndexOf('"');
        pingUrl = ttStr.substring(i1 + 16,i2);
    }
}

if ( pingUrl == "" ) {
    // Trackbak Auto Discovery でトラックバック送信先URLが取れなかった場合
    var rakuten = page_url.match( "http://plaza.rakuten.co.jp/" );
 // var hatena  = page_url.match( "http://d.hatena.ne.jp/" );
    if ( rakuten != null ) {
        // 楽天広場の日記の場合
        var a  = obj.document.body.innerHTML;
        var i1 = a.lastIndexOf('http://tb.plaza.rakuten.co.jp/');
        var t  = a.substr(i1);
        var i2 = t.indexOf("</B>");
        pingUrl = t.substr(0, i2);
    }
 // else if ( hatena != null ) {
 //     // はてなダイアリーの場合
 //     if ( page_url.match("#") != null ) {
 //         var i1 = page_url.indexOf("#");
 //         pingUrl = page_url.substr(0,i1) + "trackback";
 //     }
 //     else
 //         pingUrl = page_url + "trackback";
 // }
    else {
        // “id="trackback"”なタグ近辺からそれっぽい URL を拾い出す
        try {
            var a = obj.document.getElementById("trackback");
            var h2 = a.parentNode;
            var t  = h2.nextSibling;
            var targetString = t.innerHTML;
            var idx = targetString.lastIndexOf("http");
            if ( idx >= 0 )
                pingUrl = targetString.substr(idx);
        }
        catch (e) {
            ;
        }

        if ( pingUrl == "" ) {
            // trackback.php とか trackback.cgi とかを拾ってみる
            //   (Nucleus はこの方法で対応できる)
            var a = obj.document.body.innerHTML;
            var b;
            var idx = a.lastIndexOf("trackback.php");
            if ( idx == -1 )
                idx = a.lastIndexOf("trackback.cgi");
            if ( idx == -1 )
                idx = a.lastIndexOf("trackback.pl");
            if ( idx >= 0 ) {
                for ( ; idx >=0; idx-- ) {
                    b = a.charAt(idx);
                    if ( b == '"' )
                        break;
                }
                if ( b == '"' ) {
                    str = a.substr(idx + 1);
                    idx = str.indexOf('"');
                    pingUrl = str.substr(0, idx);
                }
            }
        }
    }
}

if ( pingUrl.length > 0 ) {
    var html = "<html>\n<head>\n<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\">\n<scr" +
               "ipt type=\"text/javascript\">\nfunction func(" +
               "){\ndocument.tbform.action=document.TBurl.tburl.value;\n}\n</sc" +
               "ript>\n</head>\n<body>\n<form action=\"" + pingUrl +
               "\" \nmethod=\"POST\" enctype=\"application/x-www-form-urlencoded\" name=\"tbform\">\n" +
               "トラックバックを送ろうとしている記事: <br>&nbsp; &nbsp; 題名: " +
               title_txt + "<br>&nbsp; &nbsp; URL: " +
               page_url +
               "<br>\n<hr>\nあなたのサイト名<br><input type=\"text\" name=\"blog_name\" value=\"" + bname + "\" size=\"80\">" +
               "<br>\nあなたの記事のタイトル<br><input type=\"text\" name=\"title\" value=\"\" size=\"80\">" +
               "<br>\nあなたの記事のurl<br><input type=\"text\" name=\"url\" value=\"\" size=\"80\"><br>\n" +
               "あなたの記事の梗概<br><input type=\"text\" name=\"excerpt\" value=\"\" size=\"80\"><br>\n<input " +
               "type=\"submit\" value=\"TrackBack\">\n</form>\n<form name=\"TBurl\">\n相手の記事のtrackback用" +
               "url\n<input name=\"tburl\" type=\"text\" value=\"" + pingUrl +
               "\" size=\"80\" onchange=\"func(" +
               ")\">\n</form>\n</body>\n</html>";

    win = window.open("","name","scrollbars=no,width=540,height=480,left=100,top=150,status=yes");
    win.document.write(html);
    win.document.close();
    win.focus();
}
else
    alert("トラックバック送信先URL を取得できませんでした");
</script>

例によって、設置の仕方は、他の MenuExt を参考にしてください。


*** 2004年5月22日 3時50分 追記 ***
まだ、このスクリプトの元となった firefox版、どこにあったのか、見つけられないでいます。
とりあえず、(私にとって)そもそもの発端になった記事は見つけましたので、それを紹介しておきます。

「はてなダイアリー」へのトラックバック送信対応は、もう少しお待ち下さい。いったん寝ます (^^; にも対応しました。Doblog にも対応(Doblog の場合は、最初に見つかったトラックバックURLになります)。


*** 2004年5月25日 10時59分 追記 ***
結局、「このスクリプトの元となった firefox版」のあった URL、見つからないままです(元にしたとはいっても、 全然別物に作り変えてしまっているんですが)。でも、さらに大元になったのではないかと思われるものを発見しました。

firefox 用じゃなくて Sleipnir 用だし、MenuExt じゃなくて Bookmarklet なんですが、 Trackbak URL を取得する部分のソースコード、変数名も含めて「このスクリプトの元となった firefox版」とそっくり。 たぶん、この「tDiary Bookmarklet」が大元なのでしょう。
さらに、上記と同様な “for tdiary bookmarklet (Only ie5-/NN6-/Moz)” を発見。っていうか、こっちが本当の大元?

一方、トラックバック送信フォーム自体は、

を参考にしています。さらに、“ManualTrackBack (もしくは Manual Trackback)”を経て、 「個人サイト間コミュニケーション」に遡れるようです。

結果的に、私が作ったスクリプトは、Drifting Antigone Frontline さんの、 手動トラックバックfor tdiary bookmarklet (Only ie5-/NN6-/Moz) を合体させたようなもの、になったようです。車輪の再発明ですね。orz
同じようなことを考えている人は、遅かれ早かれ、同じような結論に到達するということを、改めて確認しただけなのかなぁ。
でも、まぁ、今回作成したスクリプトは全然無駄ではないと思います。トラックバックURL を拾える blog や日記も増えてますし。(^^;

とりあえず、ルーツを求める旅は、ここでいったん終了とします。
上記以外に、何か情報をお持ちの方がいらっしゃいましたら、連絡してください。よろしくお願いします。

*** 2004年7月3日 6時13分 追記 ***
何か新しい展開があるかもしれないので、注目。

投稿者: tsupo 2004.05.21 午後 10:06 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


ウェブログ・ココログ関連」カテゴリ内の最近の記事

プログラミング」カテゴリ内の最近の記事

右クリック(MenuExt)」カテゴリ内の最近の記事

品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/6737/631587

この記事へのトラックバック一覧です: 右クリックでトラックバック:

» 右クリックでトラックバックをゲット from あそびをせんとやうまれけむ
様々な「右クリックで~」をリリースしている「観測気球}さんから、今度はトラックバックURLをゲットするものがでました。 この「右クリックでトラックバック」を使え 続きを読む

受信: 2004.05.22 午後 10:22

» 右クリックでトラックバック送信 改定版 (暫定リリース) from 観測気球 プロ
trackback auto-discovery に対応していないいくつかの blog ツールについて、trackback 送信用 URL を取得できるようにしてみました。 続きを読む

受信: 2005.01.26 午後 03:41

コメント


素晴らしいスクリプトですね。便利です。
このアルゴリズムを用いて
記事のURLリストから、そのURLに対する
トラックバックURLのリストを作成する
プログラムは無いのでしょうか?

投稿者: 飯島啓介 (2006.01.29 午後 01:40)

コメントを書く




※イタズラ防止のため、メールアドレスを入力しないと投稿できません。

次からのコメント入力の手間を省くために、名前やメールアドレスをcookieに記憶しますか?


URL を入力すると、その URL にリンクがはられます。
なお、メールアドレスは公開されません。ご安心ください。


ワード

ニッセン

fujisan.co.jp

楽天市場