RNNとSOAP4Rで遊ぼう
NaHiとhttp://rnn.sourceforge.jp/で遊びましょう。 RAA:soap4r/1.4.8が必要です。
http://rnn.sourceforge.jp/ がSOAPによる サービス を提供してくれました!なひとこのクライアントで遊びましょう。
いきなりソースコード。
$ cat client.rb
require 'soap/wsdlDriver'
wsdl = 'http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/rnn/rnn/app/rnn-hash.wsdl'
rnn = SOAP::WSDLDriverFactory.new(wsdl).createDriver
rnn.generate_explicit_type = true
rnn.recent_articles(1, nil).each do |article|
article.each do |k, v|
puts "#{k}: #{v}"
end
end
1日以内に更新された記事を表示します。今のところ、戻ってくるのはHashなので、 キーと値の組を表示します。
いきなり起動。
$ client.rb title: misenリリース topicid: 3 published: 1042555705 bodytext: misenはAmritaライクなテンプレートエンジンで、XML/HTML以外のフォーマットにも対応したものである。0.10のリリースアナウンスはAmritaメーリングリストですでに行われていたが、その後不具合を修正後同バージョンがRAAに登録されたようだ。 リンク: <a href="/go/raa:misen">RAA: misen</a> hometext: misenがRAAに登録された。 created: 1042555705 storyid: 97 ...
どうやらうまく取ってこれているようです。
次はテスト用記事(記事番号1)に対して、コメントを追加してみましょう。
$ cat post.rb require 'soap/wsdlDriver' wsdl = 'http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/rnn/rnn/app/rnn-hash.wsdl' rnn = SOAP::WSDLDriverFactory.new(wsdl).createDriver #rnn.wiredump_dev = STDERR rnn.generate_explicit_type = true test_article_id = 1 # テスト用記事のIDです。 POST_COMMENT_DIRECT = 0 # 記事に対する新規コメント(コメントへの返事コメントでなく)の場合、0を指定します。 subject = "SOAP4Rによるテスト by 名無しさん" # 名前を入れておくと、他の人によるテストと区別できます。^^; text =<<__EOS__ テストです。 __EOS__ p rnn.post_comment(test_article_id, POST_COMMENT_DIRECT, subject, text) $ ruby -Ke post.rb true
最後のコマンドの引数、「-Ke」は、post.rbの漢字コードに応じて変更してください。 post.rbがSJISで書いてあるのなら、「-Ks」とします。UTF8なら「-Ku」です。
テスト用のため、テスト用記事へのコメントは、SOAP経由では取得できないことになっています。 ブラウザで ((<テスト用記事|URL:http://rnn.sourceforge.jp/modules/news/article.php?storyid=1>)) を見て、確認してください。
最後に、記事の投稿をしてみましょう。なひもよくわかってないのですが、記事は、 投稿したら即座にRNNに反映されるわけではなく、ウェブサイトから、もしくは SOAP経由で記事が送られると、モデレータさん?が手動で採用の可否を決め、投稿してくれるようです。
$ cat post.rb
require 'soap/wsdlDriver'
wsdl = 'http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/*checkout*/rnn/rnn/app/rnn-hash.wsdl'
rnn = SOAP::WSDLDriverFactory.new(wsdl).createDriver
rnn.generate_explicit_type = true
rnn.wiredump_dev = STDOUT
topic_map = {}
rnn.topics.each do |topic|
topic_id = topic['topic_id']
topic['children'] = {}
topic_map[topic_id] = topic
end
topic_tree = {}
topic_map.each do |id, topic|
topic_pid = topic['topic_pid']
topic_title = topic['topic_title']
if topic_pid.zero?
topic_tree[topic_title] = topic
else
topic_map[topic_pid]['children'][topic_title] = topic
end
end
topic_id = topic_tree['ライブラリ']['children']['XML']['topic_id']
title = "soap4r/1.4.8.1がりリースされた"
text =<<'__EOS__'
soap4r/1.4.8.1がリリースされた。
...
__EOS__
p rnn.submit(title, text, topic_id)
結構長いですが、前半は記事投稿に必要なtopic_id (((<RNN|URL:http://rnn.sourceforge.jp/>))の記事の上にあるプルダウンリストボックスに 表示されているカテゴリ)を取ってきて、 木構造風に仕立て上げています。ライブラリ/XMLのtopic_idは今のところ7なのですが、 それがわかっていればいきなり記事投稿してしまって問題ありません(下の8行のみ見てください)。
では同じく漢字コードに気をつけて実行してみましょう。
$ ruby -Ke post.rb true
どうやらサーバからtrueが返ってきたようです。が、この記事投稿が成功したかどうかは、 ((<RNN|URL:http://rnn.sourceforge.jp/>))にその記事が採用されるまでわかりません。 なひもまだわからん。。。 おお、((<無事採用された|URL:http://rnn.sourceforge.jp/modules/news/article.php?storyid=101>)) ようです。よかったよかった。
コメント
- 2003-01-15 立石: post_commentについては ((<テスト用記事|URL:http://rnn.sourceforge.jp/modules/news/article.php?storyid=1>)) を用意したので、そこで投稿テストを行って頂いていろいろ活用してもらえると嬉しいです。:) また、WSDLファイルをRNNのCVSに入れて無制限に配布したいのですが許して頂けますか?
- NaHi: ありがとうございます。試してみます。WSDLについては好きにしていただいてかまいません。 法の許す限りの著作権を譲渡します。あるいはRuby'sにて配布します。
- NaHi: post_commentしてみたら、日本語化けました。サーバ側は$KCODE="EUC"ですよね? ((<RAA:soap4r>))のバグかな。。。soap4r/1.4.7で最新の((<RAA:xmlparser>))を 使うと、$KCODEをちゃんと設定しても文字化けしてました。 CVS版では直してます。というわけで、1.5.0とか言ってないで、バグ修正の1.4.8を出すべきか。
- 立石: $KCODE = 'EUC' をしていませんでした。WSDLのファイルありがとうございます。
- NaHi: submitとpost_commentの戻り値をBooleanに変更したものを、
((<URL:http://rrr.jin.gr.jp/rnn-hash.wsdl>))に置いておきました。
暇なときに更新してやってください。
あと、サーバ側がutf-8しか受けられない件なんですが、
- サーバ側にuconvを入れる、
- もしくは今週中にリリースするsoap4r/1.4.8とxmlscan-0.2シリーズを入れる、 というのをお願いすることは可能でしょうか。そうすればクライアント側からは 適当なKCODEの設定で投げるだけで、サーバ側が適宜変換するようになります。 お手数をおかけしてすいません。
- 立石: uconvはすでにSF.jpには入っているようです。どちらにせよ1.4.8+xmlscanも試してみます。
- NaHi: うは!それではなひのテストミスかもしれません。試してみます。 立石さんは早くよくなるよう、お休みください。寝るのが一番。。。
- 立石: 早速1.4.8.1を入れました。そのままEUC-JPも通ります。ありがとうございます。
- 2003-01-19 NaHi: ありがとうございました。なひもコメント投稿で確認しました uconvが入っていたのに$KCODEでない文字列が渡ってきているのは、 やはりsoap4r/1.4.7のXMLParserサポートのバグだと思います。お騒がせしました。