livedoorのトラックバック仕様変更の話で盛り上がっていたら、NP_Trackback 2.x系にしてからというものlivedoorにトラックバックが送れないということを思い出しました。
確かまみおさんのところとか、フォーラムなんかでも既出だったはずなので、たぶんコレは困っている人も多いだろう・・・・ということで今日はこの問題に対処してみようと思います。
† 結論
まず、結論から述べてしまいますが、livedoorのtb.cgiはNP_Trackbackが出力するUserAgentの値をチェックしていたということと、NP_Trackbackが通常のブラウザのようにUserAgentを装っていたことが複合して起きたようです。とりあえず、NP_Trackbackの以下の部分を書き換えることによりlivedoorにトラックバックを打つことができるようになります。
↓ この部分を以下のように書き換える ↓
特に難しいことはやっていませんが、以下が僕の試した検証手順になります。
† とりあえず、試してみる
まず、自分でlivedoorブログを開設してNP_Trackbackからpingを打ってみました。予想通りlivedoor側にはトラックバックは反映されていません。何かエラーがあればNucleus側の管理操作履歴にログが残るはずなのですが、こちらにもログは出力されていませんでした。
NP_Trackbackのping結果のエラー判定部分の実装は結構いい加減なところがあるのはわかっていたことなので、NP_Trackbackが受け取るlivedoor側からの応答をダンプしてみることにしました。
そうしたら意外な事実がわかったのです。
† 応答がXMLじゃない!
トラックバックはREST アーキテクチャによる通信を行うのでNP_Trackbackへの応答は当然のことながらXMLになっているはずです。ところが、なんとlivedoorからの応答は普通のHTMLになっていました。これはNP_Trackbackにとっては想定外のことなので、この関係でエラーがうまく拾えなくてログが出力されていなかったようです。
livedoorからのレスポンス(先頭部分のみ)
よく見ると、HTTPのレスポンスコードが403 Forbiddenになっていますね。応答のハンドリング的にはいきなりContentを解釈するんじゃなくて、レスポンスコードのチェックくらいはやったほうがよさそうです。このあたりはオリジナルからの不具合なんでしょうねぇ。
† 原因はUserAgent
ソースコードをしばらく眺めていたら、NP_TrackbackはUserAgentをMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)と名乗っているところが引っかかったので、ためしにUserAgentをNP_Trackback/2.0.3にしたところこれがビンゴ。livedoorがXMLの応答を返すようになってくれました。livedoorはブラウザでトラックバックURLを開いてしまったときのことを考えて、こういう動作をするようにしているのでしょうね。
livedoorからのレスポンス
しかし、なんだってNP_Trackbackは普通のブラウザのようにUserAgentを偽装するようなことをしているのかは理解に苦しみます。なにはともあれ、これで一件落着です。
そーだったんですかぁ。
非常に勉強になりました。
ちなみに、枯れたバージョンは
User-Agent: PHP/".phpversion()."\r\n";
でした。
2.xを初めて触ったときからUserAgentの偽装には気付いていたのですが、なんか理由があるのかなぁ程度にしかひっかかってませんでした。
で、偽装したらhtmlが返ってくるってのもおもしろい仕様ですね~
これは予想なんですが、トラックバックURLをブラウザで開いてしまった場合、画面にはこんな結果が返ってきてしまいます。
<?xml version='1.0' encoding='UTF-8'?>
<response>
<error>1</error>
<message>URL is missing (url)</message>
</response>
普通のユーザーはコレじゃ意味がわからないので、この表示に関して何らかのクレームみたいなものがあったんじゃないかと。それで「ブラウザからリクエストがあったらHTMLでエラー出しちゃおう!」みたいな話になったんじゃないかなぁと思います。
う~ん、深読みしすぎですかね。。。。。
どちらにせよ「livedoorの小さな親切」と「NP_Trackbackの仕様(というか、手抜き?)」に振り回されてしまったというのがオチのようです。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。