では、実際にサイトデータを作ってみましょう。ここでは、「みんなでチャット」のルームの一つ、「みんなでチャット1」を例に取り上げます。
「サイトデータの作り方」 および 画面画像(拡大版) を参照しつつ読んでください。
「みんなでチャット1」では、通常の URL の他に、参加者(+ROM人)を確認する URL (http://iclub.to/chat/1/romcheck.cgi)があります。こちらの方がデータ取得が簡単・確実になるので、こちらの URL を使うことにします。
URL フィールドに、目的の URL を入力し、「取得」ボタンを押します。
すると、ページのソースが下のエリアに表示されます。
取り出されたページソースを以下に示します。(名前、IPアドレスは変えてあります)。
<html><head><!-- 漢字コードはEUC --> <title>みんなでチャット1 - Read Only Members Check Program</title> <META HTTP-EQUIV="Refresh" CONTENT="60;url=romcheck.cgi"></head> <body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#0000ff" alink="#0000ff"> <b>アクセス状況</b> <hr> 名前1 [ 111.111.111.111 ] - 4秒前<hr> 名前2 [ 222.222.222.222 ] - 5秒前<hr> </body></html>
この中で、欲しいデータは強調表示した 名前とIPアドレスですね。
取得したページソースには、欲しいデータの他にも情報がいろいろ含まれています。この中から、欲しい情報が含まれる領域だけを切り出すのが「データ領域の指定」です。
ソースをつらつらと見てみると、各人のデータは周期的に現れていて、一人あたりのデータは、
名前1 [ 111.111.111.111 ] - 4秒前<hr>
となっていることが分かります。分かりやすいように、これを「個人領域」と呼びましょう。この「個人領域」はすぐあとで必要になりますから、覚えておいてください。
さて、すべての個人領域を表すと、
名前1 [ 111.111.111.111 ] - 4秒前<hr> 名前2 [ 222.222.222.222 ] - 5秒前<hr>
です。「データ領域の指定」では、ページソース全体から、この「すべての個人領域」を切り出します。
「すべての個人領域」は、「<hr>」と「</body>」に囲まれていますね。ですから、この2つのタグを目印に、切り出すことにしましょう。
areaRE の値は次のようになります:
<hr>\n(.+)</body>
改行を表す「¥n」に注意してください。「.+」とは、正規表現で「1文字以上の文字列」という意味です。
areaRE の中で、() の中に書いた領域が切り出されます。() の外側には、その目印となる文字を書きます(カッコの内側に目印を記しても構いません)。
ふぅ〜。少し難しくなりましたね。「適用」を押すと、切り出した値が下のエリアに表示されます。ここに、
名前1 [ 111.111.111.111 ] - 4秒前<hr> 名前2 [ 222.222.222.222 ] - 5秒前<hr>
と表示されれば成功です。
さて、次はさきほど切り出したデータを、「個人領域」ごとに分割する作業です。「個人領域」については、さきほどでてきましたね。
areaRE の場合と同じように、正規表現を使って「個人領域」を記述します。次のようになりました:
(.+?\n.+?\n)
「1文字以上の文字列、改行、1文字以上の文字列、改行」が「個人領域」である、という意味ですね。簡単に言えば、「2行」という意味の正規表現です:-)
全体が () 内にあるので、マッチした個所全てが、一人あたりの「個人領域」である、という意味です。「.+?」は「.+」と似ていて「1文字以上の文字列」という意味ですが、できるだけ短くマッチせよ、という意味です。もしここで「.+」の方を使ったとしたら、「1文字以上の文字列」には改行コードも含まれるので、切り出した結果は、
名前1 [ 111.111.111.111 ] - 4秒前<hr> 名前2 [ 222.222.222.222 ] - 5秒前<hr>
となるでしょう。「.+?」と指定することで、最短マッチとなり、
名前1 [ 111.111.111.111 ] - 4秒前<hr>
が得られます。
どうですか? 「適用」ボタンを押してみて、うまく「個人領域」に分割できましたか?
さて、もう少しで完成です。難しい正規表現を使うのはここが最後です。
statusRE では、「個人領域」から欲しいデータをズバリ取り出す作業をします。
statusRE の値は次のようになりました:
(.*?) \[ (.+?)\n
先頭の半角スペースに注意してください。「¥[」の前後にもあります。
欲しいデータは2つ、「名前」と「IPアドレス」です。2つなので、() のペアも2回出てきますね。
1番目の () の中の、「.*?」とは、「0文字以上の文字列」という意味です。「.+?」と同じように、最短マッチです。0文字以上とすることで、名無しさんにも対応しようというわけです:-)
次に、[ にあたる部分が ¥[ となっています。これは、[ という文字は正規表現の中で特別な意味があるので、普通の [ として扱われるように ¥ を前に付けて「エスケープ」しています。
名無しさんはいるかもしれませんが、IPアドレス無しさんはいない筈なので、2つめの () 内は .+? という指定になっています。
「適用」ボタンを押してみて、正しく次のように表示されましたか? 右側のテキストエリアには、全員分のデータが表示されていればOKです。
名前1 111.111.111.111
あとは簡単です。「項目の指定」では、取り出したデータの種類と並び順を、プログラムに教えてあげる作業をします。
名前、IPアドレスの順で並んでいますよね。なので、items は次のようになります:
Name IP
このチャットでは IP アドレスが得られましたけど、もし IP アドレスの個所がホスト名だったとすると items には次のように記述します:
Name Host
項目の並び順は、実際のものと合わせて。簡単ですね。では、「適用」ボタンを押して、xml ソースを表示しましょう。
一番下のエリアに、次のように表示されましたか?
<?xml version="1.0"?> <site> <name>サイト名</name> <url>サイトURL</url> <room> <name>チャットルーム名</name> <url>チャットルームURL</url> <dataUrl>http://iclub.to/chat/1/romcheck.cgi</dataUrl> <areaRE><![CDATA[<hr>\n(.+)</body>]]></areaRE> <personRE><![CDATA[(.+?\n.+?\n)]]></personRE> <statusRE><![CDATA[ (.*?) \[ (.+?)\n]]></statusRE> <statusItems>Name IP</statusItems> </room> </site>
太字は、変更が必要な個所です。
では、作成した xml ソースを使って、xml ファイルを作りましょう。
一番下のエリアを一度クリックしてフォーカスを当ててから、[Ctrl]+[A], [Ctrl]+[C](コントロール・キーを押しながら A、コントロール・キーを押しながら C の順番で押します)で、xml ソースがクリップボードにコピーされます。
「千里眼」の site ディレクトリ内に、適当な名前の xml ファイルを作りましょう。(例: minnade.xml)。それをエディタで開き、「編集」−「貼り付け」もしくは [Ctrl]+[P] で、クリップボードの内容を貼り付けます。
その後、上の雛型で太字となっている個所を修正します。「サイト名」は「みんなでチャット」、「サイトURL」は、「http://iclub.to/chat/」、「チャットルーム名」は「みんなでチャット1」、「チャットルームURL」は「http://iclub.to/chat/1/」ですね。
xml ファイルの内容は最終的に次のようになりました:
<?xml version="1.0"?> <site> <name>みんなでチャット</name> <url>http://iclub.to/chat/</url> <room> <name>みんなでチャット1</name> <url>http://iclub.to/chat/1/</url> <dataUrl>http://iclub.to/chat/1/romcheck.cgi</dataUrl> <areaRE><![CDATA[<hr>\n(.+)</body>]]></areaRE> <personRE><![CDATA[(.+?\n.+?\n)]]></personRE> <statusRE><![CDATA[ (.*?) \[ (.+?)\n]]></statusRE> <statusItems>Name IP</statusItems> </room> </site>
xml ファイルを保存します。このとき、文字コードは utf8 で保存してください。
以上です。お疲れさまでしたm(_ _)m