ページの作成や編集にはユーザ登録が必要です。
XML-RPCインターフェース
- 投稿者: まかまか
- カテゴリ: 新規
- 優先度: 低
- 状態: 提案
- 日時: 2004年04月29日 22時02分53秒
内容
これはプラグインではありませんが、他に妥当な場所がわからなかったのでここに書き込んでみました。何となく思い立って、JSPWiki: Wiki RPC Interfaceを基に、FSWiki用のを作ってみました。
目的
- FSWikiにおいてXML-RPCによるデータのやりとりを可能にする
- 上とは全然関係ないのですが、Web上のテキストをクリック一つ(から二つ)でWikiに書き込めるようなツールの提供
ファイル
- etc/wikitest.htmlがブックマークから動作しませんでした。javascriptの文字数を大幅に減らしました。それに応じてwikigate.cgiにも修正を加えました。
ファイル構成
主要ファイル
- wiki_xmlrpc.cgi
- サーバCGI。wiki.cgiと同じディレクトリに設置します。
- lib/WikiAPI.pm
- API用モジュール。
- lib/WikiAPI/WikiMod.pm
- WikiAPI.pmとWiki.pmを取り持つアダプタみたいなもの
- lib/WikiAPI/LinkParser.pm
- linkList(後述)用のパーサ
- lib/WikiAPI/Introspection.pm
- イントロスペクション用ファイル
CPANモジュール群
- SOAP
- XML
- XMLRPC
を利用しています。Perl5.00503、5.8、5.8 with mod_perl(Apache::Registry)で動作確認しています。lib以下にいれます。
おまけ
- wikigate.cgi
- WikiMod.pmを利用した簡易インターフェース(XML-RPCとは関係ありません)。wiki.cgiと同じディレクトリに置きます。
- etc/wikitest.html
- IE用bookmarklet。ブラウザ上で選択したテキストを直ちにFSWikiのページとして(追加)保存します。実験的なものでIEでしか動きません。wikigate.cgiを叩きます。
- etc/xmlrpc_client.cgi
- 適当クライアントCGI。使う必要はありません。パラメータはwikigate.cgiに準じます。
設置方法
ファイルを展開して、稼働中のwikiディレクトリに一式入れます。標準で3.5.3対応ですが、一行書き直すだけで3.5.2でも動作することを確認しています。
使用可能API
下記以外にも一応インターフェースはありますが、FSWikiにはページのバージョンという概念がないと思うので、実装していません。また、ページのバージョンに関するデータは1を、ページの作者については空文字を返します。
array wiki.getRecentChanges( Date timestamp [,String farmname] )
timestamp(UTC)以降変更されたページのリストを返します。WikiFarmに対応するため、第二引数(wikifarm名)をとれます。
戻り値:構造 { name, lastModified, author, version } の配列リファレンス(nameはutf8でURLエンコードされています。authorは常に空文字、versionは常に1)。
int wiki.getRPCVersionSupported()
戻り値:このAPIのバージョンを返します。
base64 wiki.getPage( String pagename )
ページのソースを返します。ページにコロン':'が入っているとコロンより前部分がWikiFarmのパスになります。('farmname:pagename')
戻り値:ソーステキスト
base64 wiki.getPageHTML( String pagename )
HTMLレンダリングされたページを返します。ページにコロン':'が入っているとコロンより前部分がWikiFarmのパスになります('farmname:pagename')。
戻り値:レンダリング済みテキスト
array wiki.getAllPages( [String farmname] )
全ページのリストを返します。WikiFarmに対応するため第二引数にFarm名をとれます。
戻り値:配列リファレンス(ページ名はutf8でURLエンコードされています)。
struct wiki.getPageInfo( string pagename )
ページ情報を返します。
戻り値:構造 { name, lastModified, author, version }(nameはutf8でURLエンコードされています。authorは常に空文字、versionは常に1)。
array wiki.listLinks( string pagename )
与えられたページの全リンクを返します。
戻り値:構造 { page, type, href } の配列リファレンス(pageはリンク先の名前(utf8でURLエンコード)かURLです。typeはexternal(外部)かlocal(内部)hrefはリンク先のHREF)。
boolean wiki.putPage( String pagename, base64 content, struct attributes )
ページに内容を書き込みます。pagenameにコロン(:)を含めると前部分がWikiFarm名になります。pagenameはutf8でURLエンコードされている必要があります。現在の所、attributesで「下げ」指定ができます。{ minoredit => 0|1 }
また、attributesにid,passを設定することで、ログインユーザとして書き込むことができます。
戻り値:成功時1、それ以外は0
wikigate.cgi用のパラメータ
主にWikiAPI::WikiModを利用するだけなので、XML-RPCとは関係ない代物です。
wikigate.cgi?method=addPage&page=Memo&sage=1&content=ほにゃらら
などとやりますと、Memoというページにタイムスタンプを更新することなくテキストを追加できます。で、これを利用してbookmarkletをつくったりとかしたら便利かなあと。一応IE用に一つテスト用ファイルが含まれています。
- method
- 呼び出したい手続き名。APIと同じ名前を持ちますが、大文字小文字は関係有りません。また、addpageという値もとることができ、これはputpageと違い、既存のページに追加をします。自動で追加データの前に改行されます。
- page
- ページ名。ページ名に':'をつけることで、コロンの前の部分がWikiFarm名になります。
- farm
- WikiFarm名。このパラメータはrecentchanges、getallpagesに対してのみ有効です。
- day
- recentchangesにおいて指定する過去の日数。day=3なら3日前からの更新ページの一覧が表示されます。
- sage
- 真値を設定することで、putpage、addpageにおけるタイムスタンプを更新しなくなります。
- add
- 真値を設定することで、putpageの場合でも追加書き込みにする。
- content
- putpage、addpageで書き込むデータ。
- id
- ログインユーザしか書き込めない設定の場合にputPage、addPageで使用するユーザid。
- pass
- ログインユーザしか書き込めない設定の場合にputPage、addPage時で使用するパスワード。
注意
- 管理者にしか見られないページは、見られません。
- wiki_xmlrpc.cgiが利用しているXML::Parser::Liteは公式にはPerl5.6以降対応となっているのですが、5.00503でも動作することを確認しています(必ずしも動くわけではないかもしれません)。参照
- 3.5.2で利用する際は、WikiMod.pmのDESTROYDメソッドの一行をコメントアウトしてください。
sub DESTROY{ # ↓この一行をコメントアウト # $_[0]->exit(); # before 3.5.2, this must be commented out }
コメント
- 3.6.2では以下のようなエラーが出て動きません。
Fault returned from XML RPC Server, fault code Server: setup file CGI2=HASH(0x88 d0f78) not found at lib/WikiAPI/WikiMod.pm line 38. at lib/Util.pm line 683. (in cleanup) Can't call method "_process_before_exit" on an undefined va lue at lib/WikiAPI/WikiMod.pm line 387.
3.5.8では動作しました。なお、クライアントはFrontier::RPCのexampleに含まれているものを用いました。 - 名無しさん (2006年07月11日 18時04分14秒)
- WikiMod.pmに以下の修正を適用してみてください。 - KG (2006年07月11日 18時27分01秒)
--- WikiMod.pm.org Thu Apr 29 23:12:05 2004 +++ WikiMod.pm Tue Jul 11 18:25:13 2006 @@ -34,8 +34,8 @@ sub setup{ my $class = shift; - my $cgi = CGI2->new(); - my $wiki = Wiki->new($cgi,'setup.dat'); + my $wiki = Wiki->new('setup.dat'); + my $cgi = $wiki->get_CGI(); $wiki->config('session_dir',$wiki->config('log_dir'));
- ありがとうございます。まだきちんと確認してませんが、とりあえず動作しているようです。なお、こちらのサイトに新しいバージョンのものがおいてありますが、これにおきかえると3.6.2ではまたエラーが出ます(上記コメントの該当部分を書き換えても)。ご参考まで。 - 名無しさん (2006年07月14日 21時36分06秒)
- wiki_xmlrpc-204.tar.gz を fswiki 3.6.2 にて試しましたが、ちゃんと動作しましたよ?テストには上記サイトにある wikitest2.html を利用させていただきました。他の機能はテストしていませんが、エラーとなるのはどのあたりでしょうか? - KG (2006年07月15日 00時12分06秒)
- すいません。そこそこ動作しはじめたので、二度と確認する気はありません(確認するには休日出勤か夜遅い時間までの残業が必要なので)。3.6.2にあげたのも気まぐれなら、xmlrpcの口を2.04にしてみようかと思ったのも気まぐれなもので(前者はまだセキュリティ向上の利点がありますが、後者は今の使い方だと気まぐれ以外の意味はありません)。教えていただいておきながら大変申し訳ない。覚えている限りではgetなんとかはのきなみAdapterとかでエラーが出てたような気がするのですが。 - 名無しさん (2006年07月16日 01時52分54秒)
- 了解しました。Adapter.pm は上記修正が必要な箇所ですね。 こちらの環境では 1.01の xmlrpc_client で 2.04 のモジュールを利用したテストで getAllPages などはちゃんと動作してます。とだけ報告しておきます。それより、この機能を実際の運用で利用されてらっしゃるんですね。どのような用途に利用されているかの方が興味があります。 - KG (2006年07月16日 03時06分32秒)
- なるほど。WikiMod.pmだけでなくAdapter.pmも修正する必要があるわけですね。今度時間がとれるときに試してみます。メールを受信し、表題、送信者、その内容などに応じて、適当なページを選択してメールの内容を連結していくようなスクリプトを自動実行したりしています。Commentプラグインでもメールでも突っ込みが同じように記録される、と言うことを目指しています(そうはうまくいっていませんが)。嫌いじゃないので、検証できる環境を自宅に構築しようと考えてはいるのですが、ちょっと大がかりなモノで、なかなか……。たいして使ってもないのに、動かなくなると文句言う人がいるので、やる気をなくてました。ありがとうございました。 - 名無しさん (2006年07月16日 08時26分13秒)
- 2.04にはWikiMod.pmが無く代わりにAdapter.pmになったようです。多分1.01に2.04を上書きでインストールされたんじゃないですかね。メールシステムとの連動ですか、たしか A_Mさんもテスト中だったような気がします。XML-RPCを利用して実装というのは良い案ですね。XML-RPCは既にメンテナンスされていないようですから私の方で引き継ごうかな? - KG (2006年07月16日 09時21分09秒)
- 作者です。やーどうもすいません。「時間に余裕ができたら……」と上の方のコメントでも書いたのですが(消えちゃってますね)、全然対応できなくて申し訳ありません。私がこのままいつまでも取りかかれないままでいるよりは、メンテナンスを引き継いでいただけるなら、ぜひお願いしたいと存じます。 - まかまか (2006年07月16日 11時32分02秒)
- あと、バックアップを利用してページのバージョンに対応したり、他2.04の時点では対応していなかったAPIに(他のプラグインと連携して)対応したものもつくっていたのですが、不完全なので一応2.04が最新となります。 - まかまか (2006年07月16日 11時41分07秒)
- 了解しました。もともと ajax用のインターフェースを考えていたのですが、機能がほぼ同じになりそうなので XML-RPC を利用しようかと思ってたんです。基本機能と拡張用インターフェースの実装(これは既存のプラグインみたいに $wiki->add_xmlrpc_plugin など)が終わったら後はfswikiのバージョンとの整合性だけだと思うんですよ。今後、2.04をベースにして時間の取れる範囲でメンテしていきたいと思います。不完全なソースも方向性を確認する意味で見てみたいと思いますがどうでしょうか? - KG (2006年07月17日 10時07分02秒)
最終更新時間:2009年03月13日 15時49分11秒