Pipeで使えるWeb検索:Google AJAX Search API

Googleの検索結果をAPIから取得できる。元々JavaScript向けのAPIだったが、それ以外でも使えるようになった。Google Web Search API Class Referenceの下の方にあるFlash and other Non-Javascript Environmentsに細かい仕様は書いてある。基本となるURLは下記。これにパラメーターを付け足していく。☆は必須のパラメーター。

http://ajax.googleapis.com/ajax/services/search/web

リファレンスにはhttpsって書いてあるけどYahoo Pipeshttpsをサポートしていない。

☆q 検索ワード。「site:」なんかの特殊な検索条件もここ。
☆v プロトコルバージョン。現時点では1.0固定
userip APIへのアクセス過多でGoogleから怒られたらこれくっつけとくと良いらしい。
rsz 検索結果の取得数。smallと入れたら4件、largeと入れたら8件取得する。1から8までの数字を入れても良い。Custom Search Engines用に10件まで取得できるfiltered_cseという値が用意されているがPipeから普通に使える。つまりPipeからは10件まで取得できる。デフォルトではsmall。
hl インターフェースの言語。検索する文書の言語では無い。Pipeから使うときに何か関係あるかは不明。デフォルトではen。
key 色々なサイトを見るとAPIkeyの取得が必須みたいな事を書いてあるが、別に無くても良い。リファレンスにもkeyを付けるのがベストだけど別に無くても使えるよとはっきり書いてある。APIが公開された当初は必須だったんだろう。
start 検索結果の何件目から取得するかを決める。1件目は1では無く0。
callback 要するにコールバックらしい。Pipeから使う分にはたぶんなんの関係も無い。
context コールバックに関連して云々と書いてある。これもたぶん気にしなくていい。
cx Custom Search EngineのユニークIDらしい。あんまり関係なさそう。
cref linked Custom Search Engine関連のフラグらしい。あんまり関係なさそう。
safe ぐぐるさんのSafe Searchフラグ。active、moderate、offの3つ。デフォルトではmoderate。
lr 検索する文書の言語。ここに入力値の一覧がある。日本語はlang_ja。
filter 類似ページのフィルタフラグ。0:フィルタしない、1:フィルタする。デフォルトでは1。
gl 国別コード。jpとか入る。一覧はここ。lrとの違いがいまいち分かりにくいが、あっちは検索する文書に使われている言語。日本はjp。

サンプルは下記。Fetch Dataを使うといい。検索結果はresponseData.results以下にある。

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=filtered_cse&q=test&lr=lang_ja&gl=jp

結果が10件までというのが少ないが、startを10に設定して再びFetch Dataすればいい。
Pipeに組み込むに当たって問題が無い訳じゃ無い。Loopで使うと検索結果がおかしい。たぶんUrl Builderと一緒で2バイト文字が無視されてる感じ。

否定先読みを利用する

数字はnumberという文字列に、それ以外はetcという文字列に変換する。この場合「それ以外」というのがやり辛いのでsplit Moduleで場合分けという事になるが、どうしてもModule数が増える。しかし否定先読みを使うとRegex Module1つで済む。

画像のように、それ以外の条件を先に処理しておくと誤爆することが無くなる。このやり方の都合の良いところは条件を幾らでも増やせる所。split Moduleは2つにしか分割できない。
「(?!^\d+$)(?!^[ぁ-ん]+$)^.+$」だと数字とひらがな以外にできる。

pubDateでfilter

itemをpubDateでfilterすることも出来る。長い間気づかなかった。

ITMediaみたいにfeed内に数ヶ月前のitemがあることも珍しくない。過去の日時の表現は色々あるけど、これが一番分かりやすいと思う。Truncateとか使ってitem数削るくらいならこっちの方が良い。

カレンダーサイト&ソフト比較

YahooPipesまとめサイトなんだからそれを中心に比較。どうせカレンダーしか使わないので、Zohoのようなグループウェア寄りのものは除外。ポイントは2つ。

  • オンラインカレンダーの購読が問題なく出来るか
  • CalDAVに対応しているか

Google Calendar

  • オンラインカレンダーの購読は可能だが、文字コードのせいでPipeで作成したカレンダーは2バイト文字が文字化けする
  • CalDAVに対応。CalDAVのアドレスは下記。
  • 表示は日週月のオーソドックスなものとカスタムビュー。カスタムビューは設定で2日〜4週まで変えられる。

https://www.google.com/calendar/dav/Calendar ID/events

Calendar IDというのはカレンダーの詳細開くと書いてある。@以下も全部入力する事。

Yahoo Calendar

  • オンラインカレンダーの購読は可能
  • CalDAVに対応。CalDAVのアドレスは下記。
  • 表示は日週月年の4つのみ。

https://caldav.calendar.yahoo.com/dav/Username/Calendar/Calendar Name

Calendar Nameは2バイト文字でも問題ない。

Yahoo カレンダー

  • オンラインカレンダーの購読不可。当然CalDAVなんか問題外。

Windows Live カレンダー

  • オンラインカレンダーの購読が出来る。しかし、VEVENT内にUIDを設定する必要がある様子。値自体は予定毎にユニークな物であれば何でも良い。
  • CalDAVには未対応
  • カレンダーのインポートは出来るが、エクスポートが何処にも見あたらない。
  • 表示は日週月のオーソドックスなものと、今日を起点とした7日表示に今週を起点とした4週表示の5つ。

Thunderbird+Lightning

  • オンラインカレンダーの購読が出来る。
  • CalDAVに対応。
  • 日週月と多週表示の計4つ。多週表示は表示する週の総数と表示する前週の数が設定できる。前週+今週の2週でもよし、前週+今週+来週の3週表示でもよし。
  • ThunderbirdというメーラーにLightningというカレンダーソフトをくっつける形になるためやはり重い。ちょっと起動が重いかななんてレベルじゃない。ただ起動してからの動作自体はLightning0.9の頃は酷かったが、1.0になって劇的に改善された。
  • オンラインカレンダーの件数が多くなるとデータの欠落がたまに生じる様子。大事な予定にはとてもじゃないが使えない。

総評

  • YahooPipes使いとしては文字化けが発生するGoogle Calendarは問題外。カスタムビューは魅力的だけど。
  • 1月分の予定なんか一覧できる必要はない。かといって1週ではちょっと少ない。2週くらいで十分。というわけでWindows LiveとYahoo Calendarも問題外とまでは言わないがもう一息。
  • Lightningの多週表示が便利。ローカルアプリだからバックアップの必要性があるが、CalDAV経由でGoogle CalendarかYahoo Calendarをデータ置き場にしてしまえばいい。問題はやはり起動の重さ。Webベースのものと違ってお手軽感皆無。

なんかYahooカレンダーの使え無さっぷりが際立つ結果になったが、まあしょうがない。

Regex Moduleのgオプションにおける注意点

3桁の数字の先頭をRegex Moduleでgオプションを使って抽出してみる。

すると結果はこんな感じ。

1つめしか評価されてない。はっきり言ってかなり痛い。これはバグというべきか、oオプションが無いのが悪いというべきか。ちなみにこの現象はV2エンジンでは直ってる。じゃあこのRegex Moduleの部分だけV2エンジンを使ったSub Pipe化したら良いのかというと、やっぱりうまくいかない。V1エンジンのPipeから呼び出されたSub Pipeは有無を言わさずV1エンジンで動くようだ。