|
Web 上にある CGI で得られるデータを、スタックに取り込もうというものです。
Revolution の言語 Transcript を使って、サーバーで働く独自の CGI を作ることも可能ですが、その前に面倒な設定の説明をしなくてはいけないし、私自身ローカルでちょっとやったことがあるくらいで、そちらはまたの機会ということにして(逃げて?)、今回はWeb 上で 公開されている、普通はブラウザーのCGI 取得機能を使って得るようなデータを、スタックに取り込みます。
013.rev では、CGI の内容がシンプルなことや、日本語のデータ取得だと Revolution 自体ユニコードに関してまだ不確定な部分があることなどから、英語サイトですがエンサイクロペディア「Wikipedia」を使います。またこのサイトはコピーレフトですから、こういう場では良いのではという理由もあります。得られるデータは少し長い英文なので、日本語のアプリケーションで扱うことはまれですが、同じ方法で公共のサイトで為替レートや地域の気象状況など、日本語アプリケーションで、 CGI から得られる数値のデータを取り込むことは可能かと思います。私の作った「時間系」は、アメリカ海軍気象観測所の時間データを同じ方法で取得しています。他に実際のあるアプリケーションでは、 OmniDictionary がこれと同じ考えで、コピーレフトの辞書データを取得して作られています。
注意:「Wikipedia」のページレイアウトが変更になったため、説明や図が実際のWeb ページと合致しない部分があります。ダウンロード版サンプル 013.rev のスクリプトは、アップデートしてあります。2004年6月。その後また仕様が変わったようで、現在サンプルは機能しません。

左上のテキストボックスに任意の英語の単語をタイプして、「Go」ボタンをクリックすると、その内容のデータを取得してフィールド「tResult」に入れます。サンプルでは単語「Revolution」の結果を表示しています。
それでは実際の CGI が、どのように送られているかを見るために、Web ブラウザーでWikipedia のサイトに行ってみましょう。カードの一番下にあるURL http://en.wikipedia.org/ をクリックしてください。そのフィールドのスクリプトエディターには以下のスクリプトが入っています。
on mouseUp
revGoURL "http://en.wikipedia.org/"
end mouseUp
注:この型録では Mac OSX とWindows を対象としているので関係ないのですが、上の revGoURL はMac 上では AppleScript がインストールされていないと動きません。
Wikipedia のサイトをオープンすると、ページの右上に図のテキストボックスが見えます。

英語の直接入力で「Revolution」とタイプして「Go」をクリックすると、Wipipedia にあるRevolution という単語のデータがブラウザーに表示されます。これとほぼ同じことを、Runtime Revolution にやらせようという試みです。
ブラウザーの「ソースを表示」させるメニューアイテムを選んで、このWeb ページのソースを見てください。 Safari を使っていたら、メニューバーにある 表示 > ソースを表示 を選択すると「http://en.wikipedia.org/wiki/Revolutionのソース」のウインドウが開かれます。このページから CGI に関するタグを探し出すのですが、ちょっと目には面倒そうでも検索を使えば簡単です。Macintosh ではコマンド+F (Win ではコントロール + F)で、ほとんどのブラウザーで検索ウインドウが出てきます。「form」と打ち込んでタグ form がどこから始まっているか調べます。次にやはり検索の「/form」で、そのタグがどこで閉じられているか調べます。ここではページの天地に同じものが2カ所にあります。他のサイトでは form は一つとは限りませんから、その内容が目的のものか必ず確認してください。

今見ているサンプルページでは、上図のハイライト部分がその内容です。見てみるとページの右上にあるテキストボックの name は "search" で、Go ボタンの name は "go" となっていますから、name=search の value は、テキストボックスにタイプされた文字列になり(サンプルでは"Revolution")、 name=go のvalue は "Go" となります。そして action からそのデータを "/w/wiki.phtml" に送るということがわかります。データを受けるページは、今見ているページがあるhttp://en.wikipedia.org/wiki/Revolutionと並列にあるディレクトリー w 内にある wiki.phtml です。
以上のわかった内容を、スクリプトにしてみます。
put fld "tWord" into tSearch
put "search="& URLEncode(tSearch) &"&go=go" into tPostWord
post tPostWord to URl "http://en.wikipedia.org/wiki/w/wiki.phtml"
put it into fld "tResult"
013.rev のトップにあるタブ「スクリプト解説」をクリックして次のカードを見てください。
ここまでを「スクリプト解説」の Go ボタンで確認できます。
"search="& URLEncode(tSearch) &"&go=go" を見てわかるように、name=value を & で繋いだ文字列を、URL に post して結果をit で受けます。(ボタン「search」をクリックするのと同じ結果を求めるのは、同じように & で繋いで"search="& URLEncode(tSearch) &"&fulltext=Search" とします)
ただしこのケースでは、 Go ボタンがクリックされるのをデフォルトとしているので、下のスクリプトのように "&go=go" 部分を取り除いてもデータを得ることはできます。
put "search="& URLEncode(tSearch) into tPostWord

これで確かにデータらしいものは得ることができますが、タグ付きの HTMLテキストです(上図)から、普通のテキストに直す必要がありますから、次のボタン「プレインテキストに」をクリックしてください。
set the htmlText of fld "tResult" to fld "tResult"
タグは取れました。しかしまだ文字サイズのバラ付きや、 Web ページだったら必要なリンクなど、スタックでは余分な要素があるので、次にそれらを取り除きます。

上図で大きく「Revolution」と見えるところは、テキストボックスにタイプしたテキストと同じですが、その上にある部分はスタックには不必要なテキストラインですから、単語 Revolution はこのフィールド"tResult" の何行目かを求める lineOffSet を使って、それより上の部分を削除(delete) します。
そしてフィールドのほとんど最後の部分 "Discuss this page | Page history | What links here | Related changes" があるラインより下をすべて取り除きます。以下がそのスクリプトですが、もし"No page with this exact title exists"という文字列がフィールドに出た場合は、求めたデータが得られなかったとして、それを表示します、
if lineOffset("No page with this exact title exists", fld "tResult")>0 then
put "No page with this exact title exists" into fld "tResult"
else
delete line 1 to (lineoffset(fld "tWord", fld "tResult")-1) of fld "tResult"
delete line (lineoffset("Discuss this page | Page history "& \
"| What links here | Related changes",fld "tResult")) to \
(the num of lines of fld "tResult") of fld "tResult"
set the textSize of line 1 to (the num of lines of fld "tResult") of \
fld "tResult" to 12
end if
フィールドを整理するコツは、いくつかある共通のパターンや例外を読み取って、必要な部分だけを残すという作業です。
最後に全体のテキストサイズを、12ポイントに揃えています。
コマンド 「Post 」は、インターネットライブラリーに含まれますから、スタンドアロンにする場合必ず、Standalone Application Settings... で、Script Libraries: の「internet」をハイライトにしてください(下図)。

以下は一部の環境でしか試せません。
libURL のバージョン1.0.15b8 をインストールしている開発環境では、libUrlFormData を使って form 内のいくつもある name を、クオートや & を使わずにまとめることができます。
put libURLVersion()
を使って、メッセージボックスでlibURL のバージョンを得ることができます。もし 1.0.15b8 が入っている場合は以下のスクリプトをボタン「libUrlFormData」で試すことができます。。
put fld "tWord" into tSearch -- name=search
put "go" into tGo -- name=go
get libUrlFormData("search",tSearch,"go",tGo)
post it to URl "http://en.wikipedia.org/wiki/w/wiki.phtml"
put it into fld "tResult"
現在の Revolution 2.2 では、libURL バージョン1.0.15b8 はインストールされていません。
http://www.runrev.com/resources/liburl/releases.shtml
を参照してください。まだベータ版です。
|