Sponsored Link

どうにかなるBLOG

Nucleus XML-RPCインターフェースで遊ぶ(遊ばれる)

プラグイン NP_SendPing を読んでる時に XML-RPC の話が出てきたけど、実は色々と興味がわいてきて調べてた。調べ始めたきっかけは、pingサーバーってのが実はCGIで実装してあるらしいというとこ。ということは、スクリプトをゲットすれば俺でも ping サーバーがたてれるし、それを使った色々な遊びまでできちゃうんじゃないかなと思ったわけ。んで色々調べてるうちにふとマニュアルを読んでたら、次の記述を発見して大慌て

the Nucleus の XML-RPC インターフェイスのURL:
www.yourserver.com/yourpath/nucleus/xmlrpc/server.php

ええ〜っっっ!!!!
server.phpだって!!!!!!!
これってサーバースクリプトが入ってるってこと??? もしかして

もしかしたら、俺の Nucleus にも weblogUpdate.ping が打てるのかもしれないとか期待しちゃったんですが、ざっと調べた感じ、だめっぽい。。。

とりあえずマニュアルを眺めてみる。英語だけどくじけないぞ!

マニュアル:XML-RPC Interface

前に調べたのをおさらいすると、XML-RPC ってのは、XML でブログを操作するためのプロトコルみたいなもの。難しそうだけどその正体は、関数名とパラメーターをXMLで書いて、Webサーバーに送ってるだけ。送り方まではよく調べなかったけど、xmlrpc_client とかいうのをソースコードの中にチラッと見かけたんだよね。その辺がキーだと思う。

それでマニュアルを読んでみると、Nucleus のでは、The Blogger API というのと、metaWeblog API 、Movable Type API という、三種類の XML-RPC インターフェース(と言えばいいのかな)が実装されてて、こんな関数が使えますよと書いてあった。

The Blogger API

blogger.newPost
blogger.editPost
blogger.getPost
blogger.deletePost
blogger.getUsersBlogs
blogger.getRecentPosts
blogger.getUserInfo
blogger.getTemplate
blogger.setTemplate

metaWeblog API

metaWeblog.newPost
metaWeblog.editPost
metaWeblog.getPost
metaWeblog.getCategories
metaWeblog.newMediaObject (v2.5)
metaWeblog.getRecentPosts (v2.5)

Movable Type API

mt.supportedMethods
mt.supportedTextFilters
mt.publishPost
mt.getCategoryList
mt.getPostCategories
mt.setPostCategories
mt.getRecentPostTitles
mt.getTrackbackPings

ざっと見た感じ、使われ方が何となく分かるね。で、我らが Nucleus に実装されているんだったら、遊んでみない手はないでしょう。実験実験!

まず、どうやって通信するのか調べなきゃ。えとえと、想像では、NP_SendPing のようなスクリプトを組んでそれを実行するのではないかと思いますが、よく分からないので、NP_SendPing中のメソッド sendPing を拝借してスクリプトを組んでみよう。

あと、とりあえずはテスト用にどのメソッドを実行してみようか。上記のメソッドの中から、パラメーター(引数)がないものとか、シンプルな探してみる。なかなか解説のページが見つからないけど、

http://www.xmlrpc.c...

ここに metaWeblog API の事が書いてあった。そんでめぼしいやつを探してみると、

metaWeblog.getCategories (blogid, username, password)

戻り値の中身はよく分からないけど、多分XMLでカテゴリーの一覧が出てくるんだと思うよ。
それじゃまず、テストスクリプトを書いてみよう。

ということでまずは、sendPing メソッドをまねて適当にスクリプトを作成してみた

<?
include './nucleus/nucleus/libs/xmlrpc.inc.php';

$message = new xmlrpcmsg(
'metaWeblog.getCategories',
array(
//blogidをセット
new xmlrpcval(1, 'int'),
//ユーザー名をセット
new xmlrpcval('alaska', 'string'),
//パスワードをセット
new xmlrpcval('*******', 'string')
)
);
//サーバー情報をセット
$client = new xmlrpc_client('/nucleus/nucleus/xmlrpc/server.php','sandman.s6.xrea.com', 80);
//ここでリクエストを送信
$response = $client->send($message,20);
//サーバーからの応答を処理
if($response){
if($response->faultCode()) {
echo 'error';
}else{
echo 'success';
}
}
?>

何かいけそうな気がしない??
ファイルをアップしてブラウザからスクリプトを呼び出してみると、、、
見事にエラーでした。がっくし

何がいけなかったかなぁとか思ってソースコードを読み出したけど、全く分け分からない。しかもなんかユーザー認証関係っぽいメソッドを xmlrpc_client の中に見つけて、username と pass はここでセットするのかなとか、全然わけがわからなくなってしまった。

そこで他に何かサンプルスクリプトはないかとgoogleで調べてたら、XML-RPC 本家のホームページに 「A PHP CLIENT」 というサンプルスクリプトを発見

http://xmlrpc-c.sou...

ふむふむ、sendPing メソッドにうりふたつ。やはり、やり方は間違ってないような気がするけど、どこがいけなかったんだろう。「A PHP CLIENT」 を参考に、エラーコードの中身を表示するように書き換えてみる。

if($response->faultCode()) {
echo $response->faultString();
}

すると

「Invalid return payload: enabling debugging to examine incoming payload」

ときた。payload って何だろ。あと、デバッグモードが使えるとも書いてるね。xmlrpc.inc.php のソースコードを見てみると、どうやら payload ってのは、サーバーに送る XML データの中身の模様。あと、xmlrpc_client にはデバッグモードがセットできることも確認。

そこでまずは、$message をセットした後に、payload を echo で吐き出してみる。

echo htmlentities($message->payload);

ん〜何も表示されないぞ。。困ったな。いやまて、よく見ると serialize() ってメソッドが用意されてる。

echo htmlentities($message->serialize());

きたきた

<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.getCategories</methodName>
<params>
<param>
<value><int>1</int></value>
</param>
<param>
<value><string>alaska</string></value>
</param>
<param>
<value><string>guruguru</string></value>
</param>
</params>
</methodCall>

何か良さげだよね。問題なさそう。次はデバッグモードを試してみる。

$client->setDebug('true');

すると、サーバーからエラーとして送られてきたXMLの中身が表示された。その中に

Incorrect parameters passed to method: Wanted string, got int at param 1)

と書いてある。何かパラメーターがおかしいって言ってるぞ。

ここから約2時間、語りたくもない苦難の時間が過ぎました。そして、最後の最後に気がついた!!

サーバー側のソースコード読めばいいじゃん。。

そうです。XMLを送りつけてる server.php を見てみれば、どこでエラーになってるのか分かるはず。そして、server.php を眺めて、最初の方でインクルードしてるファイル api_metaweblog.inc.php の中に気になる記述を発見

function f_metaWeblog_getCategories($m) {
$blogid = _getScalar($m,0);
$username = _getScalar($m,1);
$password = _getScalar($m,2);

return _categoryList($blogid, $username, $password);
}

何かおかしいぞ?? blogid は int で渡して、username やら password は string で渡したはずなのに、何で同じような処理をしてるんだ??

ハッとしてスクリプトを書き換えてみた。

$message = new xmlrpcmsg(
'metaWeblog.getCategories',
array(
//blogidをセット
new xmlrpcval('1', 'string'),
//ユーザー名をセット
new xmlrpcval('alaska', 'string'),
//パスワードをセット
new xmlrpcval('*******', 'string')
)
);

何事もなかったようにカテゴリーリストが表示された。

なんで blogid が string なんだボケー!!!!!

そういえば、エラーコードの中に int が何とかかんとかって書いてあったっけ。。。
posted at 23:59:09 on 2005-01-04 by バカ梵 - Category: XML-RPC

TrackBack

Trackback URL

Comments

No comments yet

Add Comments

:

:
: