冬言響 / 日記

アメコミとか映画とか音楽とか猫とか単車とか自転車とか革とか銀とかジーンズとかブーツとか今日喰ったものとか。

RSS2.0

エキサイトブログへのトラックバック・解決編?

出来るようになったのかも知れない。

// 送信先アドレス。
$strTrackbackAddress = "http://winterzeit.exblog.jp/tb/10946206";
// 送信内容
$strRequest = (略);
// 送信先アドレスをパース。
$arySendto = parse_url($strTrackbackAddress);
// ホスト。
$strHost = $arySendto["host"];
// パス。
$strPath = $arySendto["path"];
if($arySendto["query"]) $strPath .= "?" . $arySendto["query"];
// オープン。
if($sock = fsockopen($strHost, 80)) {
 // 送信。
 fputs($sock, "POST " . $strHost . " HTTP/1.0\r\n");
 fputs($sock, "Host: " . $strPath . "\r\n");
 fputs($sock, "Content-Type: application/x-www-form-urlencoded\r\n");
 fputs($sock, "Content-Length: " . strlen($strRequest) . "\r\n");
 fputs($sock, "\r\n");
 fputs($sock, $strRequest . "\r\n");
 // 戻り値。
 while(!feof($sock)) {
  $strResponse .= fgets($sock, 4096);
  }
 fclose($sock);
 }
// エラー
else $strResponse = "送信先アドレスが見つかりませんでした。"

こんな具合だろうか。Typo とかあるかも知らん気付き次第直す。「Host」フィールドが無かったのが問題の様子。FC2 とか Ameba とかウチとかは無くてもイケたのだけど。ここら辺まだあんま良くは判らんのだが、エキサイトのサーバーがどうやらバーチャルサーバーというのを使ってるので物理的にどのサーバー宛のリクエストなのかを明示してやらにゃならんよ、と、そーゆーことで良いのかね。HTTP/1.0 では Host は必須じゃないのだけどまあ付けるようにしとこうぜ、と、そんな話。

各所の blog とかに載ってる他人様の書いたコード見てると、だいたいパスは $strPath = $arySendto["path"] で済ましてるようなのだけど、ウチみたいにクエリ文字列入りの URI だったりすると「?」以下が除けられたままになってしまうので if($arySendto["query"]) $strPath .= "?" . $arySendto["query"]; を追加してみた、のだけど、実はそもそもクエリ文字列入りの URI がマズいとかそんな決まりってあったりせんだろうか。要調査。

一応これで解決で良いと思うのだけど、トラックバックとは別にちょっと前から更新 Ping というのもあちこちにバラ撒いてるのだけど、http://ping.exblog.jp/xmlrpc に対してトラッkブアックとおおむね同じような具合で送信してるのだがやはり 405 が返ってくる。404 とかでなくて。謎。謎といえば http://blog.goo.ne.jp/XMLRPC への送信に対してはエラーコードが「1」なのにメッセージが「Thanks for the ping.」と返ってくる。良いのか駄目なのか、どっちよ。

Google とかの主要なトコにはちゃんと届いてるぽいのでとりあえず良いか。またおいおい調査してくかな、と。