CGI SQUARE > 千里眼 > サイトデータの作り方 >

作成例

では、実際にサイトデータを作ってみましょう。ここでは、「みんなでチャット」のルームの一つ、「みんなでチャット1」を例に取り上げます。

サイトデータの作り方」 および 画面画像(拡大版) を参照しつつ読んでください。

目次

URL 入力

「みんなでチャット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アドレスですね。

データ領域の指定(areaRE)

取得したページソースには、欲しいデータの他にも情報がいろいろ含まれています。この中から、欲しい情報が含まれる領域だけを切り出すのが「データ領域の指定」です。

ソースをつらつらと見てみると、各人のデータは周期的に現れていて、一人あたりのデータは、

 名前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>

と表示されれば成功です。

個人領域の指定(personRE)

さて、次はさきほど切り出したデータを、「個人領域」ごとに分割する作業です。「個人領域」については、さきほどでてきましたね。

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 では、「個人領域」から欲しいデータをズバリ取り出す作業をします。

statusRE の値は次のようになりました:

 (.*?) \[ (.+?)\n

先頭の半角スペースに注意してください。「¥[」の前後にもあります。

欲しいデータは2つ、「名前」と「IPアドレス」です。2つなので、() のペアも2回出てきますね。

1番目の () の中の、「.*?」とは、「0文字以上の文字列」という意味です。「.+?」と同じように、最短マッチです。0文字以上とすることで、名無しさんにも対応しようというわけです:-)

次に、[ にあたる部分が ¥[ となっています。これは、[ という文字は正規表現の中で特別な意味があるので、普通の [ として扱われるように ¥ を前に付けて「エスケープ」しています。

名無しさんはいるかもしれませんが、IPアドレス無しさんはいない筈なので、2つめの () 内は .+? という指定になっています。

「適用」ボタンを押してみて、正しく次のように表示されましたか? 右側のテキストエリアには、全員分のデータが表示されていればOKです。

名前1 111.111.111.111

項目の指定(items)

あとは簡単です。「項目の指定」では、取り出したデータの種類と並び順を、プログラムに教えてあげる作業をします。

名前、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 ソースを使って、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