「Web AI」実行のサンプル
Web検索
それでは実際のソースコードです。まずは「Web AI」のサンプルの中から、最も典型的な処理を行うサンプルを掲載します。
サンプルコードは、以下の処理を行います。
- 検索欄の文字列をGoogleでWeb検索。4ページ分のデータを一括取得
- 検索結果からキーワード配列を取得
- 1つ目のキーワードに対して、ブログ検索を実施。抽出した文章を出力
- 2つ目のキーワードに対して、ブログ検索を実施。抽出した文章を出力
「Web AI」では、上記の処理を、メソッドチェーンとして記述できます。
それではソースコードです。
<!-- Google API --> <script src="http://www.google.com/jsapi" type="text/javascript"></script> <!-- Web AI API --> <script src="../webAi_1.1/crocro.webAi.min.js" type="text/javascript" charset="UTF-8"></script>
/*
*------------------------------
* Googleからスクリプトをロード
*------------------------------
*/
google.load("search", "1");
google.load("feeds", "1");
google.load("jquery", "1.4.3");
/*
* ロード中アニメ
*/
var loadAnmArr // ロード中アニメ配列
= [".(^o^).", "(^o^)..", "^o^)..(", "o^)..(^", "^)..(^o", ")..(^o^", "..(^o^)"];
var loadAnmCnt = 0; // ロード中アニメ・カウンター
/*
*------------------------------
* Web AI変数の初期化
*------------------------------
*/
var $WA = crocro.webAi; // 短縮表記
var cWSrch = new $WA.WebSrch(); // Web検索
var cJpKw = new $WA.JpKw(); // 日本語キーワード
var cJpSntnc = new $WA.JpSntnc(); // 日本語文章
/**
*------------------------------
* 初期化処理
*------------------------------
*/
cWSrch.ready(function(){
// 検索ごとにインターバルを置きたい場合は数値か関数を指定
//cWSrch.intrvl = 1000;
//cWSrch.intrvl = function(){return (Math.floor(Math.random() * 5) + 1) * 100;};
//
cWSrch
.brand("gglBrnd") // Googleのブランド表示
.init({
type : "web", // Web検索を初期化
opt : function(obj) { // 検索オブジェクトを受け取り、設定を変更
obj.setResultSetSize(google.search.Search.LARGE_RESULTSET); // 8件
}
})
.init({
type : "blg", // ブログ検索を初期化
opt : function(obj) { // 検索オブジェクトを受け取り、設定を変更
obj.setResultSetSize(google.search.Search.LARGE_RESULTSET); // 8件
}
})
.setEachCall(function(){ // ステップごとに呼び出される処理を追加
drwLoadAnm(true); // ロードアニメ描画
})
.start(); // 実行開始
});
/**
*------------------------------
* @title テスト
* @description
* ボタンを押した場合の処理。
*------------------------------
*/
function test() {
/*
* 変数の初期化
*/
var qStr = $("#q").val(); // 検索語
var kwArr = []; // キーワード配列
// リセット
cJpKw.reset();
cJpSntnc.reset();
// 検索語はキーワード対象外にする(「,」区切りで複数指定可能)
cJpKw.avoidStr = qStr;
/*
*------------------------------
* 検索のメソッド・チェーン処理
*------------------------------
*/
cWSrch
.reset() // 命令格納のリセット
.srch({
type : "web",
page : 4, // 検索を行うページ数を指定(8件×4ページで32件分)
// 指定がない場合は1ページ目だけ検索
// 結果は、検索したページの結果を全て連結した状態で得られる
key : qStr, // 検索キーワード
res : function(res, cursor) {
var outStr = "";
if (cursor) {
outStr += "検索数 : " + cursor.estimatedResultCount + "\n\n";
}
if (! res || res.length <= 0) {
// 結果なし
cWSrch.cmndsBreak(); // チェーン処理終了
drwLoadAnm(false); // ロードアニメ描画(停止)
} else {
// 結果あり
for (var i = 0; i < res.length; i ++) {
// 出力文字列の作成
var r = res[i];
outStr += "[" + i + "]\n"
+ r.titleNoFormatting + "\n"
+ r.unescapedUrl + "\n"
+ r.content + "\n\n";
// キーワードの収集
cJpKw.addSrc(r.titleNoFormatting);
cJpKw.addSrc(r.content);
}
}
$("#res1").val(outStr);
}
})
.srch({
init : function() {
// 命令の初期化フェイズ
// パラメータ付きで、キーワードを出力
$("#res1Kw").val(cJpKw.getStrArr({prmAll: true}).join("\n"));
// キーワードの取得
kwArr = cJpKw.getStrArr();
},
type : "blg",
loop : function() {
// 検索のループ回数
return (kwArr.length >= 2) ? 2 : kwArr.length;
},
key : function() {
// キーワード
return kwArr[cWSrch.loopCnt];
},
// ※「loop」や「key」などの引数は、固定値でも関数でもよい
// 引数が関数なら、ループ毎に実行される
res : function(res) {
if (! res || res.length <= 0) return; // 結果なし
var outStr = "";
for (var i = 0; i < res.length; i ++) {
var r = res[i];
outStr += "[" + i + "]\n"
+ r.titleNoFormatting + "\n"
+ r.unescapedUrl + "\n"
+ r.content + "\n\n";
// 文章の収集
cJpSntnc.addSntnc(r.content);
}
$("#res2_" + (cWSrch.loopCnt + 1)).val(outStr);
}
})
.add(function() {
// 抽出した文章を出力
var outStr = cJpSntnc.getSntncArr({usePrfrd: false}); // 校正なしで文章取得
$("#resSntnc").val(outStr.join("\n")); // 出力
// 検索の終了
drwLoadAnm(false); // ロードアニメ描画(停止)
})
.start(); // 実行開始
}
/**
*------------------------------
* @title ロードアニメ描画
* @description
* ロード中のアニメを描画する。
* @param loading ロード中か否か
* @return なし
*------------------------------
*/
function drwLoadAnm(loading) {
var dwStr = ""
if (loading) {
dwStr = "Now Loading... " + loadAnmArr[loadAnmCnt ++ % loadAnmArr.length];
}
$("#loading").text(dwStr);
}
それでは、ソースコードを簡単に解説します。
「Web AI」では、「Google AJAX API」を利用しています。そのため、外部JavaScriptとして「http://www.google.com/jsapi」を読み込んでいます。また、JavaScriptのソースコードの冒頭で、google.load("search", "1");、google.load("feeds", "1");、google.load("jquery", "1.4.3");と書いて、必要なライブラリを読み込むようにしています。
これらの記述がない場合、「Web AI」は自動でこれらのライブラリを読み込んでから処理を行います。しかし、事前に読み込んでおいた方が無駄な処理がなくなるので、上記の書き方でライブラリを利用するようにしてください。
次に「Web AI」の初期化ですが、本ライブラリには機能の違う5つの外部JavaScriptファイルが用意されています。それぞれに依存関係はないので個別に利用できます。また「crocro.webAi.min.js」という、1つにまとめて圧縮したファイル(30KB弱)もあります。こちらを利用すれば、全機能を使うことができます。上記のサンプルコードでは、「crocro.webAi.min.js」を利用しています。
さて、上記のプログラムでは、crocro.webAi.WebSrchと、同cJpKw、cJpSntncを利用しています。このうち、WebSrchが通信処理のメソッドチェーン化を行うオブジェクトになります。残りの2つは、日本語処理を行うオブジェクトです。上記のプログラムでは、WebSrchオブジェクトを初期化してcWSrch変数に格納しています。
それでは以下、「Web AI」のメインオブジェクトになるWebSrchの基本的な使い方を解説します。WebSrchは、reset()メソッドで内部の命令バッファを空にします。そして、メソッドチェーンで命令を追加した後、start()メソッドで実際の処理を開始します。
メソッドチェーン化できる命令には、検索(srch())、フィード取得(feed())、Google Suggest(sgst())、短縮URL(shrtUrl())などの通信系命令があります。また、単純処理を追加するadd()や、コールバック処理を追加するaddCallback()もあります。さらに、命令の実行途中に新たな命令を挿入するためのinsrtOn()、insrtOff()といった命令もあります。
またWebSrchには、メソッドチェーン化せずに、すぐに効果を発揮する命令もあります。このタイプの命令には、処理を途中で終了するcmndsBreak()や、ループを途中で打ち切って次の命令に移行するloopBreak()などがあります。
これらの命令は全て「Web AI」のページに、リファレンスとしてまとまっています。また、余談ですが、「Web AI」のページに掲載してあるリファレンスは、JavaScript製のドキュメント作成ツールで生成しています。こちらのドキュメント作成ツール「easyJsDoc」も、同サイトでソースコード付きで公開していますので、必要な方はご利用ください。
さて、これらのメソッドの細かな仕様については、コメント付きのソースコードを公開していますので、そちらをご覧下さい。ここでは、最もよく利用する検索命令srch()メソッドの引数について解説します。
srch(arg)メソッドの引数argは連想配列です。連想配列の内容は以下の通りです。
| 引数 | 内容 |
| arg.init | ループ実行前の処理を関数で指定 |
| arg.loop | ループの回数を指定 |
| arg.page | 検索結果を何ページ分取得するか指定 |
| arg.key | 検索するキーワードを指定 |
| arg.res | 検索結果を受け取る関数を指定 |
これらの各値は、設定しなければデフォルト値が利用されます。
上記のうち、arg.init、arg.resは関数で指定します。arg.initに関数を指定した場合は、検索処理が開始される前に一度だけ呼び出されます。この命令は、必要がなければ特に書かなくてもよいです。
arg.resに指定した関数は、ループ回数分、検索が終了するたびに呼び出されます。この命令は必ず必要です。なければ、検索結果を受け取れません。このarg.resが受け取る引数は、「Google AJAX Search API」の検索結果オブジェクトになります。
検索は、arg.loopで指定したループ回数分繰り返されます(デフォルトは1)。また、検索結果は、arg.pageで指定したページ数分の結果を結合した形で受け取れます(こちらもデフォルトは1)。arg.keyは特に解説はいらないと思います。こちらは検索キーワードになります。
これらの引数のうち、arg.loop、arg.page、arg.keyといった引数は、「固定値」もしくは「関数」が利用できます。もし、関数で指定した場合は、ループの処理が行われるごとに、自動的に関数が実行されて、その結果を引数として利用します。WebSrchのメソッドチェーン化された命令のほとんどは、こういった引数の自動展開の機能を持っています。そのためとても柔軟に、メソッドチェーン化した処理を記述できるようになっています。この仕組みについては後で詳しく解説します。

