2004年01月13日
川俣晶の縁側ソフトウェアMagSite1開発日誌 total 3186 count

TrackBack送信の作成、いよいよ大詰め

Written By: 川俣 晶連絡先

 TrackBackを実装するのは大変な仕事です。

 と既に書いたわけですが。

 このことは、より正確に言えば、純粋にTrackBackを行うプログラム以外の部分で多くの手間が掛かるということになります。

 では、純粋にただ単にTrackBack送信を行うだけのプログラムはどの程度のサイズになるのか。

 取りかかる前に、spikeしてみました。(spike=完全に見通せないときに小さなプログラムを作って確認してみること)

 その結果、以下のようなソースがすぐに出来上がりました。

 実行してみると、Movable Type 2.64を相手に、一発で通りました。文字化けもありません。

 良かった良かった。

 既に(かなり凝ってしまった)ユーザーインターフェース関係の作り込みは終わっているので、ここに書いたコード相当分を組み込めば、TrackBack送信は動くはずです。

 特に予想外の問題が無ければ、TrackBack送信機能の付いたMagSite1のリリースはそれほど遠い話ではないでしょう。

 (しかし、そのあとには、下手をすると送信より大変なTrackBack受信の機能が待っていたり……)

TrackBack送信のspikeプログラム §

 .NET Framework 1.1用。C#のソースです。

 言うまでもないことですが、文字列定数は架空のサイトを示しているので、このままコンパイルして実行しても動きません。念のため。

 もし、下記のソースに間違いを発見された方は、ぜひご連絡下さい。

2004年1月15日追記。文字列をURLエンコードしていないことに気付いたので、下記ソースコードを変更しました。

using System;

using System.Net;

using System.IO;

using System.Xml;

using System.Web;

namespace trackBackSend001

{

    class Class1

    {

        public static string urlEncodeByUtf8( string src )

        {

            return HttpUtility.UrlEncode(src,System.Text.Encoding.UTF8);

        }

        [STAThread]

        static void Main(string[] args)

        {

            const string pingTo = "http://pingToUrl";

            WebClient client = new WebClient ();

            client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

            // charsetとieの根拠はhttp://mylog.ishinao.net/id/5

            string requestString = "title="

                + urlEncodeByUtf8("あいう えお")

                + "&url=http://contentUrl/&excerpt=My+Excerpt" + urlEncodeByUtf8("あいう")

                + "&blog_name=" + urlEncodeByUtf8("テストマガジン")

                + "&charset=UTF-8&ie=UTF-8";

            byte [] requestArray = System.Text.Encoding.UTF8.GetBytes(requestString);

            byte [] resultArray = client.UploadData(pingTo,"POST",requestArray);

            XmlDocument doc = new XmlDocument();

            doc.Load( new MemoryStream(resultArray) );

            doc.Save(Console.Out);

        }

    }

}