NP_cles()

12345678910111213141516171819202122232425262728293031

NP_Trackbackでlivedoorにトラックバックが送れないワケ

 
投稿者:hsur 投稿日時:2006-01-09 - 06:44
カテゴリー:Nucleus Tips - - トラックバック(default)- Views: 224

livedoorのトラックバック仕様変更の話で盛り上がっていたら、NP_Trackback 2.x系にしてからというものlivedoorにトラックバックが送れないということを思い出しました。

確かまみおさんのところとか、フォーラムなんかでも既出だったはずなので、たぶんコレは困っている人も多いだろう・・・・ということで今日はこの問題に対処してみようと思います。

結論

まず、結論から述べてしまいますが、livedoorのtb.cgiはNP_Trackbackが出力するUserAgentの値をチェックしていたということと、NP_Trackbackが通常のブラウザのようにUserAgentを装っていたことが複合して起きたようです。とりあえず、NP_Trackbackの以下の部分を書き換えることによりlivedoorにトラックバックを打つことができるようになります。

$user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';

↓ この部分を以下のように書き換える ↓ 

$user_agent = 'NP_Trackback/'. $this->getVersion();

特に難しいことはやっていませんが、以下が僕の試した検証手順になります。

とりあえず、試してみる

まず、自分でlivedoorブログを開設してNP_Trackbackからpingを打ってみました。予想通りlivedoor側にはトラックバックは反映されていません。何かエラーがあればNucleus側の管理操作履歴にログが残るはずなのですが、こちらにもログは出力されていませんでした。

NP_Trackbackのping結果のエラー判定部分の実装は結構いい加減なところがあるのはわかっていたことなので、NP_Trackbackが受け取るlivedoor側からの応答をダンプしてみることにしました。

そうしたら意外な事実がわかったのです。

応答がXMLじゃない!

トラックバックはREST アーキテクチャによる通信を行うのでNP_Trackbackへの応答は当然のことながらXMLになっているはずです。ところが、なんとlivedoorからの応答は普通のHTMLになっていました。これはNP_Trackbackにとっては想定外のことなので、この関係でエラーがうまく拾えなくてログが出力されていなかったようです。

livedoorからのレスポンス(先頭部分のみ)

HTTP/1.1 403 Forbidden Date: Sun, 08 Jan 2006 21:21:04 GMT Server: Apache/1.3.34 (Unix) P3P: CP="PSA CONi OTR OUR DEM ONL" Last-Modified: Mon, 24 Oct 2005 10:39:06 GMT ETag: "844a38-916-435cb9ca" Accept-Ranges: bytes Content-Length: 2326 Connection: close Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>livedoor Blog</title>

よく見ると、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からのレスポンス

HTTP/1.1 200 OK Date: Sun, 08 Jan 2006 21:17:25 GMT Server: Apache/1.3.34 (Unix) mod_perl/1.29 P3P: CP="PSA CONi OTR OUR DEM ONL" Content-Length: 191 Content-Type: text/xml X-Cache: MISS from app.blog.livedoor.jp Connection: close <?xml version="1.0" encoding="iso-8859-1"?> <response> <error>0</error> <message>Ping of 1473362-50007038 successful received from http://blog.cles.jp/np_cles/item/xxxx</message> </response>

しかし、なんだってNP_Trackbackは普通のブラウザのようにUserAgentを偽装するようなことをしているのかは理解に苦しみます。なにはともあれ、これで一件落着です。

    このエントリは役に立ちましたか?

         

    トラックバックについて [policy]

    Trackback URL:
    Trackbacks
    判明しました。情報元はNP_cles()のhsurさん。 http://blog.cles.jp/np_cles/item/1237 応答状況をモニターしてみると、意外なことが判明。xml形式で返ってくるべき応答が実際には一般的なhtml形式になっていたそうです。Livedoor側の実装に問題があるのかと僕は思っ..
    kyms (2006/01/09 11:11)

    Comments [policy]

    まみお wrote:

    そーだったんですかぁ。
    非常に勉強になりました。
    ちなみに、枯れたバージョンは
    User-Agent: PHP/".phpversion()."\r\n";
    でした。
    2.xを初めて触ったときからUserAgentの偽装には気付いていたのですが、なんか理由があるのかなぁ程度にしかひっかかってませんでした。

    で、偽装したらhtmlが返ってくるってのもおもしろい仕様ですね~

    2006-01-09 10:59 <%HatenaAuth()%> 

    hsur wrote:

    これは予想なんですが、トラックバックURLをブラウザで開いてしまった場合、画面にはこんな結果が返ってきてしまいます。

    <?xml version='1.0' encoding='UTF-8'?>
    <response>
    <error>1</error>
    <message>URL is missing (url)</message>
    </response>

    普通のユーザーはコレじゃ意味がわからないので、この表示に関して何らかのクレームみたいなものがあったんじゃないかと。それで「ブラウザからリクエストがあったらHTMLでエラー出しちゃおう!」みたいな話になったんじゃないかなぁと思います。

    う~ん、深読みしすぎですかね。。。。。

    どちらにせよ「livedoorの小さな親切」と「NP_Trackbackの仕様(というか、手抜き?)」に振り回されてしまったというのがオチのようです。

    2006-01-09 11:52 <%HatenaAuth()%> 

    Add Comments

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン