このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

WSM Watcher インターフェース

発言者:田中求之
( Date Saturday, April 07, 2001 22:16:13 )


この会議室のアクセス専用ソフトとして WSM watcher を公開していますが、こ
のソフトがサーバとの間で行う交信は HTTP で行っています。ですから、以下
で説明にしたがって処理を行うソフトなりスクリプトを組めば、WSM Watcher 
以外の環境においても、最新の発言などを取り込むことが可能になります。た
とえば、UNIX や Windows 環境においても Perl などで WSM Watcher に相当す
る処理を行うソフトを組むことは、それほど難しくないでしょう。この会議室
をより有効に活用してもらうために、WSM watcher 用にサーバで設定してある
インターフェースについて説明をしておきます。

なお、以下の仕様は4月7日現在のものであり、今後、変更される可能性もあ
ります。変更を行った際には、この会議室にてアナウンスします。
(→該当発言の数の制限の緩和を予定しています)

======================================================================

1:サーバとの交信

アクセスの処理はこの会議室を処理している CGI が行います。path argument 
が last の時、Watcher によるアクセスとして処理を行います。

search argument によって、必要とするデータを指定します。はじめてアクセ
スを行うときには raw を指定します。すると、ここ2日間に投稿された発言の
データが後述の形式で送られてきます。

http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$last?raw

という URL にアクセスすることになります。

2回目以降のアクセスの時には、前回のアクセス(あるいは必要とするデータ
の起点の日時)をタイムスタンプ形式で指定します。

http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$last?010407210000

この URL でアクセスを行うと、2001年4月7日21時00分00秒以降に書き込まれた
データを送ってきます。

アクセス終了の日時を記録してくようにし、その日時を次回のアクセスの時に 
search arg で渡すようにするとよいでしょう。

======================================================================

2:サーバからの返信

raw によるアクセス、あるいは指定した日時以降の発言が見つかった場合には、
ステータスコード 200 を返し、ボディ部分には発言のデータが収められ返され
ます。

なお、該当する発言が多かった場合には、最近の60発言のみが返されるよう
になっています。

該当するデータ(発言)がなかった時には、ステータスコード 304 を返します。
この時にはボディは空です。

======================================================================

3:サーバが返すデータの形式

発言のデータはタグによって区切られた文字列になっています(XML もどきに
なっているんです (^_^;; )

漢字コードは SJIS です。また、いくつかのフィールドのデータは HTML 用に
エスケープされた文字列になっています( > が > に変換されている)。

データは <LIST> で始まり </LIST> で終わります。

各発言は <DATA> で始まり </DATA> で終わります。

各発言は、以下のフィールドで構成されます。

日付:<DATE>と</DATE>に挟まれて、書き込まれた日時が記録されています。

URL:ページの URL が <URL> と </URL> に挟まれて記録されています。

アンカー:ページ内の発言の位置を示すアンカー(<A> タグで指定するやつ)
が <ANCHOR> と </ANCHOR> に挟まれて記録されています。ここが空の場合は、
その発言は、ページの先頭の発言=新規発言であるということになります。

タイトル:話題のタイトルが <TITLE> と </TITLE> に挟まれて記録されていま
す。この場合、コメントであっても RE: は付いていません。あくまでもコメン
トされた話題=ページのタイトルになっています。

発言者: <NAME> と </NAME> に挟まれて、発言者の名前が記録されています。

発言: <MESSAGE> と <MESSAGE> に挟まれて、発言が記録されています。参考
ページの情報も組み込まれたものになっています。

シリアル番号:発言管理用の番号が <SERIAL_NUMBER> と </SERIAL_NUMBER> に
挟まれて記録されています。重複して取り込んだ発言がないかどうかなどの
チェックを行う場合に利用します。

以上の項目のデータが記録されています。

たとえば2つの発言が送り返されてきた場合には、サーバからの返答のボディ
の部分は以下のようなタグ群で構成されたデータになります。

<LIST>
<DATA>
<DATE>04/07 21:00</DATE>
<URL>http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$........html</URL>
<ANCHOR></ANCHOR>
<TITLE>...</TITLE>
<NAME>...</NAME>
<MESSAGE>...</MESSAGE>
<SERIAL_NUMBER>....</SERIAL_NUMBER>
</DATA>
<DATA>
<DATE>04/07 21:01</DATE>
<URL>http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$.........html</URL>
<ANCHOR>012345678900</ANCHOR>
<TITLE>...</TITLE>
<NAME>...</NAME>
<MESSAGE>...</MESSAGE>
<SERIAL_NUMBER>...</SERIAL_NUMBER>
</DATA>
</LIST>

なお、<TITLE>, <NAME>, <MESSAGE> の各データは HTML 形式にエスケープされ
ていますので、データを正しく取りだすには、それを逆変換する処理を行う必
要があります。

データの形式を確認したい場合には、ブラウザで以下の URL にアクセスして、
そのソースを見るようにしてください。

http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$last?raw

田中求之 さんからのコメント
( Saturday, April 07, 2001 23:12:11 )

4:応用例

たとえば、ファイルメーカーに順にデータを取り込むようにしたいのであれば、
以下のようなスクリプトを使うことで、ファイルメーカー版 WSM watcher が作
れます。

ファイルメーカーで新しいデータベースを作り、発言データの各フィールドに
該当するフィールドを作成します(データベースの名前は FM WSM Watcher と
します)。

ここでは、フィールドの順番を Title, Name, Date, URL, Anchor, Message, 
Serialとすることにします。

以下のようなスクリプトで、各発言をデータベースに取り込むことが可能にな
ります(粗削りなものですが)

----------------------------------------------
-- WSM Watcher ファイルメーカー版スクリプト --
----------------------------------------------

-- URL Access Scripting (MacOS 8.5 以降に付属)と Tanaka's osax 2.0 が必要

--- スプールファイルの準備(初期設定フォルダー内に作成)
set xF to ((path to preferences) as string) & "FM_WSM_Spool"
try
  set xxF to xF as alias
  -- パスを alias に変換できた場合にはファイルが存在する
  
  if (MT Get Info xxF about data_size) is not 0 then
    -- 取込みが完了していた場合にはファイルは空になっているはず
    beep
    display dialog "まだ取り込んでいない発言があります"
    return
  end if
  
  -- アクセス用のタイムスタンプの生成
  set xDate to MT Get Info xxF about modification_date
  set xStamp to MT Convert Date xDate to TimeStamp
  
on error
  -- スプールがない場合ははじめてのアクセス
  set xStamp to "raw"
end try

-----------------
-- サーバとの交信
-----------------

set xDate to current date

tell application "URL Access Scripting"
  download ("http://mtlab.ecn.fpu.ac.jp/webcon.mtxt$last?" & xStamp) to file xF replacing yes with progress
end tell


if (MT Get Info xF about data_size) = 0 then
  -- ボディが空の場合は該当発言無し
  beep
  display dialog "新しい発言はありません"
end if

-------------------------------------------
-- 以下、ファイルメーカーへのデータの取込み
-------------------------------------------

-- 以下の処理で mylist に発言のリストが収まる
set mylist to MT Pick Strings source xF start with "<DATA>" end with "</DATA>"

repeat with thismsg in mylist
  
  set thismsg to contents of thismsg
  
  -- 各フィールドの抜き出し
  set xTitle to getTaged(thismsg, "TITLE")
  set xName to getTaged(thismsg, "NAME")
  set xDate to getTaged(thismsg, "DATE")
  set xURL to getTaged(thismsg, "URL")
  set xAnc to getTaged(thismsg, "ANCHOR")
  set xMsg to getTaged(thismsg, "MESSAGE")
  set xSeri to getTaged(thismsg, "SERIAL_NUMBER")
  
  -- HTML 形式の文字列を下に戻す
  set {xTitle, xName, xMsg} to MT Convert W code {xTitle, xName, xMsg} from HTML to MacRoman with untouch eight bits
  
  -- 新規レコードへ書き込む
  tell application "ファイルメーカー Pro"
    tell database "FM WSM Watcher"
      set xR to create new record with data {xTitle, xName, xDate, xURL, xAnc, xMsg, xSeri}
    end tell
  end tell
  
end repeat

--- 取込みが完了した場合にはファイルを空にする
--- ただし更新日はダウンロードの時点にしておく
set eof of xF to 0
MT Change File Info xF modification date xDate

-- タグ抜き出しハンドラー
on getTaged(myMsg, xTag)
  return item 1 of (MT Pick Strings myMsg start with "<" & xTag & ">" end with "</" & xTag & ">" with trimming)
end getTaged


より WSM Watcher らしくするためのヒントを2つ

●表示されている発言の会議室のページにブラウザでアクセスする場合

Anchor が空の場合は、単純に URL へのアクセスを行う
Anchor が空でない場合には URL + # + Anchor がアクセスの URL になる

●特定の話題のみを表示(スレッドを表示)

URL が同じものだけを集め、Serial でソートすれば、スレッドが順に並ぶ
(Serial は、書き込みを処理した時点のタイムスタンプになっているの)

田中求之 さんからのコメント
( Thursday, April 19, 2001 15:37:42 )

上記のスクリプト(をちょっと変えたもの)を埋め込んだ、ファイルメーカー版
WSM watcher (といってもメッセージを順に取り込む機能しか実装してませんが)
を登録しておきました。

ファイルメーカー Pro 4.1 + URL Access Scripting + Tanaka's osax 2.0
で動作確認を行っています。

→  FM_WSM_Watcher.sit