-
001133
先週の木曜日に、ぐるなびがレストラン検索の API を公開しました。
所定の URI に所定のパラメータを渡して HTTP で叩くと、検索結果の XML が返ってきます。 非常にシンプル。 で、こいつを PHP でラップしたライブラリを作りました。
大したことはやっていないのだけれど、いかんせんリクエスト・パラメータとレストランの属性値の数が多く、手数だけはかかってしまいました。
このライブラリを使うと、こんな感じのアプリがお手軽に作れます。
ぐるなびWebサービスWeb サービスのマニュアルはここで提供されています。
ぐるなびが提供する API を呼ぶには、ユーザー登録をした上でアクセスキーを手に入れる必要があります。 このため、JavaScript などでクライアント・サイドから呼ぶには適しません。 提供されている API は現在のところ五種類です。
- レストラン検索API
- エリアマスタ取得API
- 都道府県マスタAPI
- 大業態マスタ取得API
- 小業態マスタ取得API
このうち検索を行うのは一つ目の「レストラン検索API」のみで、他の四つは常に固定の結果を返します。 業態絞込み検索を行う場合などに、検索画面の表示に使うことができます。
GNavi.phpGNavi.php は上記の仕様をラップします。 主に以下の5つの API を提供します。
- GNaviRestSearchAPI クラス
- レストラン検索です。「2-3-1.レストラン検索API」をラップします。いくつかの検索パラメータ(後述)を受け取ります。検索結果 GNaviRestSearchResult を返します。
- GNaviAreaSearchAPI クラス
- エリアマスタの取得です。「2-3-2.エリアマスタ取得API」をラップします。検索パラメータは不要です。検索結果 GNaviAreaSearchResult を返します。
- GNaviPrefSearchAPI クラス
- 都道府県マスタの取得です。「2-3-3.都道府県マスタAPI」をラップします。検索パラメータは不要です。検索結果 GNaviPrefSearchResultを返します。
- GNaviCategoryLargeSearchAPI クラス
- 大業態マスタの取得です。「2-3-4.大業態マスタ取得API」をラップします。検索パラメータは不要です。検索結果 GNaviCategoryLargeSearchResult を返します。
- GNaviCategorySmallSearchAPI クラス
- 小業態マスタの取得です。「2-3-5.小業態マスタ取得API」をラップします。検索パラメータは不要です。検索結果 GNaviCategorySmallSearchResult を返します。
エラー処理各 API クラスの call メソッドは、リクエストがエラーを返した場合は GNaviError クラスのオブジェクトを返します。
GNaviError クラス プロパティ $code エラーコード プロパティ $message エラーメッセージ プロパティ $desc エラー内容 各プロパティは「利用案内 2-2. エラー仕様」に準じています。
2-3-1.レストラン検索API GNaviRestSearchAPIコンストラクタ $api = GNaviRestSearchAPI($keyid) $keyid ぐるなびから発行されたアクセスキー 戻り値 $api GNaviRestSearchAPI のインスタンス 検索の実行 $result = call($gNaviRestSearchAPIParams ) $gNaviRestSearchAPIParams GNaviRestSearchAPIParams クラスによる検索条件 戻り値 $result GNaviRestSearchResult クラス 検索条件は GNaviRestSearchAPIParams クラスで渡します。 基本的には利用マニュアルにある「リクエストパラメータ」をラップしたものですが、coordinates_mode / latitude / longitude はまとめて GeoPoint 型で渡してください。 測地系の違いを吸収します。
GNaviRestSearchAPIParams クラス プロパティ $id 店舗ID プロパティ $name 店舗名 プロパティ $name_kana 店舗名読み プロパティ $tel 電話番号 プロパティ $address 住所 プロパティ $area 地方コード プロパティ $pref 都道府県コード プロパティ $category_l 大業態コード プロパティ $category_s 小業態コード プロパティ $equipment 設備・サービス プロパティ $location 緯度経度。GeoPoint 型。 プロパティ $range 上記 $location からの距離範囲 プロパティ $sort ソート順 プロパティ $offset 検索開始位置 プロパティ $hit_per_range ヒット件数 プロパティ $offset_page 検索開始ページ 検索結果は GNaviRestSearchResult クラスとして戻ります。 以下のクラスを経由して検索結果を取り出せます。
GNaviRestSearchAPIParams クラス プロパティ $restList Restaurant クラスの配列。 プロパティ $total_hit_count 全該当件数 プロパティ $hit_per_page 一ページあたりの表示件数 プロパティ $page_offset 現在のページ番号 Restaurant クラス メソッド getId() 店舗IDを返す。 メソッド getUpdateDate() 情報更新日時を返す。 メソッド getName() 店舗名を返す。 メソッド getNameKana() 店舗名を仮名で返す。 メソッド getLocation() 店舗の緯度経度を GeoPoint 型で返す。 メソッド getCategory() フリーワードカテゴリーを返す。 メソッド getUrl() PCサイトURLを返す。 メソッド getUrlMobile() 携帯サイトURLを返す。 メソッド getShopImage() 店舗画像のURLの配列を返す。 メソッド getQrcode() QRコードのURLを返す。 メソッド getAddress() 店舗住所を返す。 メソッド getTel() 電話番号を返す。 メソッド getFax() FAX番号を返す。 メソッド getOpenTime() 営業時間を返す。 メソッド getHoliday() 休業日を返す。 メソッド getLine() 最寄駅の路線名を返す。 メソッド getStation() 最寄駅名を返す。 メソッド getStationExit() 最寄の駅出口を返す。 メソッド getWalk() 徒歩の所要時間を返す。 メソッド getNote() 備考を返す。 メソッド getPrShort() PR文(50文字以内)を返す。 メソッド getPrLong() PR文(200文字以内)を返す。 メソッド getAreaCode() エリアコードを返す。 メソッド getAreaName() エリア名を返す。 メソッド getPrefCode() 都道府県名を返す。 メソッド getPrefName() 都道府県コードを返す。 メソッド getCategoryL() CategoryLarge クラスのオブジェクトの配列を返す。 メソッド getCategoryS() CategorySmall クラスのオブジェクトの配列を返す。 メソッド getBudget() 平均予算を返す。 メソッド getEquipment() 設備を返す。 メソッド getMobileSiteFlag() モバイルサイトありフラグを返す。 メソッド getMobileCouponFlag() モバイルクーポンありフラグを返す。 メソッド getPcCouponFlag() PCクーポンありフラグを返す。 2-3-2.エリアマスタ取得API GNaviAreaSearchAPIコンストラクタ $api = GNaviAreaSearchAPI($keyid) 引数 $keyid ぐるなびから発行されたアクセスキー 戻り値 $api GNaviAreaSearchAPI のインスタンス 検索の実行 $result = $api->call() 戻り値 $result GNaviAreaSearchResult クラス GNaviAreaSearchResult クラス プロパティ $areaList Area クラスのオブジェクトの配列。 Area クラス プロパティ $code 地域コード プロパティ $name 地域名 サンプル・コード
// 地域一覧を表示 $keyid = "xxxxxxxx"; $api = new GNaviAreaSearchAPI($keyid); $result = $api->call(); foreach ($result->areaList as $area) { echo ($area->code . ":" . $area->name); }2-3-3.都道府県マスタAPI GNaviPrefSearchAPIコンストラクタ $api = GNaviPrefSearchAPI($keyid) 引数 $keyid ぐるなびから発行されたアクセスキー 戻り値 $api GNaviPrefSearchAPI のインスタンス 検索の実行 $result = $api->call() 戻り値 $result GNaviPrefSearchResult クラス GNaviPrefSearchResult クラス プロパティ $prefList Pref クラスのオブジェクトの配列。 Pref クラス プロパティ $code 都道府県コード プロパティ $name 都道府県名 プロパティ $areaCode この都道府県が属する地域の地域コード サンプル・コード
// 都道府県一覧を表示 $keyid = "xxxxxxxx"; $api = new GNaviPrefSearchAPI($keyid); $result = $api->call(); foreach ($result->prefList as $pref) { echo ($pref->code . ":" . $pref->name . ":" . $pref->areaCode); }2-3-4.大業態マスタ取得API GNaviCategoryLargeSearchAPIコンストラクタ $api = GNaviCategoryLargeSearchAPI($keyid) 引数 $keyid ぐるなびから発行されたアクセスキー 戻り値 $api GNaviCategoryLargeSearchAPI のインスタンス 検索の実行 $result = $api->call() 戻り値 $result GNaviCategoryLargeSearchResult クラス GNaviCategoryLargeSearchResult クラス プロパティ $categoryLargeList CategoryLarge クラスのオブジェクトの配列。 CategoryLarge クラス プロパティ $code 大業態コード プロパティ $name 小業態名 サンプル・コード
// 大業態一覧を表示 $keyid = "xxxxxxxx"; $api = new GNaviCategoryLargeSearchAPI($keyid); $result = $api->call(); foreach ($result->categoryLargeList as $categoryLarge) { echo ($categoryLarge->code . ":" . $categoryLarge->name); }2-3-5.小業態マスタ取得API GNaviCategorySmallSearchAPIコンストラクタ $api = GNaviCategorySmallSearchAPI($keyid) 引数 $keyid ぐるなびから発行されたアクセスキー 戻り値 $api GNaviCategorySmallSearchAPI のインスタンス 検索の実行 $result = $api->call() 戻り値 $result GNaviCategorySmallSearchResult クラス GNaviCategorySmallSearchResult クラス プロパティ $categorySmallList CategorySmall クラスのオブジェクトの配列。 CategorySmall クラス プロパティ $code 小業態コード プロパティ $name 小業態名 プロパティ $categoryLCode この小業態が属する大業態の大業態コード サンプル・コード
// 小業態一覧を表示 $keyid = "xxxxxxxx"; $api = new GNaviCategorySmallSearchAPI($keyid); $result = $api->call(); foreach ($result->categorySmallList as $categorySmall) { echo ($categorySmall->code . ":" . $categorySmall->name . ":" . $categorySmall->categoryLCode); }
このライブラリを使用する場合はぐるなびWebサービスの利用規約、ガイドラインに従ってください。
[ permalink ] [ 0 comment(s) ] [ 0 trackback(s) ] -
000407
PHS で Web が見られるようになって非常に重宝しているのだけれど,認証が必要なページが非常に厄介です. あの入力メソッドでちまちまとアカウント名/パスワードを入れるのは面倒,かつ,パスワードでも入力を確定するまでは "*" にならずに生表示です. そこでこんなものを作ってみました.
以下の情報に基づいて AirH" 端末を認証します.
- IP Address
- User-Agent
- 端末の電話番号
使い方は,まず認証をで保護したいページに以下のようなコードを埋め込みます.
<?php include_once ( "Auth.php" ); include_once ( "auth.cfg" ); authCheck (); ?>
auth.cfg の内容は適宜編集してください. 特に IP Address は時々追加されたりするので注意です.
続きまして,当該ページへ遷移するアンカータグの href に次のパラメータを渡します.
http://mt.mizba.net/target.php?TNO=$ps_telnum以上で設置完了です. このリンクをクリックした際に「電話番号を通知しますか?」と訊かれますので「はい」と答えてください.
まぁ,セキュリティ強度は低いのだけれど,生パスワードをさらしながら入力するよりはマシかな,という感じです. この辺のバランス感覚は人それぞれなので,もし使ってくださる場合も各個人の判断/責任でよろしくお願いします.
[ permalink ] [ 0 comment(s) ] -
000394
MT をちょこちょこといじっていて,コメント登録の確認画面,エラー画面に手を入れようとしてはたと気付きました. PHP 使えないじゃないすか. コメント登録の確認画面,エラー画面は mt-comments.cgi です.「*.cgi」. PHP が使えないのも仕方ありません.
しかし,麦酒堂は相当部分が PHP 化されてしまっていて,デザインの一貫性を保つためには PHP が欠かせない状況です. 動的部分だけが Perl というのは,これはなかなか厳しい.
という背景を踏まえまして,今回 mt-comments.cgi を PHP でラップするという強引なスクリプトを書きました.
ラップとは言っても,内部で HTTP リクエストを発行するという疎な呼び出しです. 逆に,mt-comments.cgi が別ホストにあっても良いので,何か変わった使い方もできるかもしれません. 具体的に思いつかないけれど・・・負荷分散とか?
そしてその HTTP リクエストで mt-comments.cgi が返した文字列を *.php 内に表示します. 使用方法は次のようになります.Individual entry archive 等の,mt-comments.cgi へ post する form 要素をもつページの先頭に以下のコードを埋め込みます.
<?php include ( "mt_comments_wrapper.php" ); $v_mtCommentsWrapper = new mt_comments_wrapper ( "mt.mizba.net" , "/system" ); $v_mtCommentsWrapper->go(); ?>mt_comments_wrapper.php のパスは環境に合わせて設定してください. "mt.mizba.net" , "/system" はそれぞれ mt-comments.cgi が存在するホスト名,パスになります. これも環境に合わせて設定してください.
既存のフォームの直前と直後に以下のコードを埋め込みます.
<?php if ( ! $v_mtCommentsWrapper->execBody () ) { ?> 既存の form 要素 <?php } ?>form 要素だけを厳密に囲む必要はなく,mt-comments.cgi の出力で置き換えたい範囲も含めて囲んでください.
手順 2 で囲んだ範囲は "Comment Preview Template" , "Commment Error Template" に基づく出力で置き換えられます. この二つのテンプレートを編集し,form 要素のみに削ってください. html 要素,body 要素等は不要になります.
特記事項.
- form の post 先は mt-comments.cgi ではなく,*.php 自身にしてください.
- mt-comments.cgi の出力中の <?php ... ?> は PHP のコードとして実行されます.
[ permalink ] -
000341
複眼中心 を真似て,エントリごとのページビューをカウントする PHP のプログラムを作成してみました.(参考にさせていただきました.ありがとう>gadget)
Download : pageview.php
値をインクリメントする方式ではなく,アクセスごとに一行挿入し,表示時に count (*) する方式を採っています.パフォーマンスを考えるとイマイチな手法かもしれませんが,後から集計方法を変更したりできるのでこうしました.
countUp を呼ぶことで一行挿入されます.getAllPageview で全アクセス数を,getIndividualPageview で個別アクセス数を取得することが出来ます. また,showMonthlyRanking に引数 (年,月) を渡すことで,指定月のアクセスランキングを表示したりもします.
まぁ,動作の詳細はコード参照のこと.自然言語でくどくどと説明するよりよほど正確です.[ permalink ] [ 1 comment(s) ] -
000334
MovableType に組み込んで使用する,被検索語表示モジュールを開発しました.
このモジュールはサイト内のあるページに対するリクエストが発生した際に,HTTP_REFERER ヘッダに基づいて被検索語を抽出,記録するものです. ここで被検索語とは,いずれかのWeb検索システムの検索結果一覧から当該ページに遷移が発生した際に用いられた検索語を指します.
つまりは「この語句で検索したら,このページが引っかかったらしいよ」といった情報を記録するのが,このモジュールの働きです.本モジュールは GPL の元で公開されます. 扱いの詳細はライセンス条項を参照してください.
Download : recentlySearchedBy.php
2004-05-16 : ver.1.0.1.2 を公開.詳細はコメントに記載.このモジュールを利用するためには,事前に以下のDBオブジェクトを作成する必要があります.
-- TABLE create table miz_http_referrer_log ( rec_id numeric (22,0), segment varchar (50), target varchar (50), creation_date timestamp, http_referrer varchar (4000) ); create index miz_http_referrer_log_ind01 on miz_http_referrer_log ( segment , target ); -- SEQUENCE create sequence miz_log_record_s increment 1 start 1000;ソースコード内の定数も環境に合わせて変更してください. 特に "DB_CONN_STR" の変更は必須です. これらの変更を施したコードをあなたのサイト内で利用したとしても,変更内容を開示する必要はありません. どうぞご自由に変更を行ってください. (変更後のコードを再配布する場合はこの限りではありません.)
呼び出す関数は次の通りです.
- regAndShowSearchedWord
- 被検索語をDBに格納するとともに被検索語の一覧を表示します.二つの引数をとり,この二つの値の組み合わせで調査対象ページを識別します.
- showSearchedWord
- 検索語の一覧を表示します.
<?php include ( "recentlySearchedBy.php" ); ?> ... <?php regAndShowReferrer ( "entry" , "<$MTEntryID pad="1"$>" ); ?>動作確認の取れている環境は次の通りです.
MT 2.64 DB PostgreSQL7.3.4 PHP 4.3.4 (with mbstring , psql) [ permalink ] [ 1 comment(s) ] -
000331
gadget からかねがね「自分のページがどういう検索語で引っかかっているか,調べると非常に興味深い」と聞いていたので,本サイトも試してみることにしました.トップと各エントリごとのページに設置してあります.
REFERRER を見ていることに嫌悪感を持つ人もいるかもしれないので念の為.
記録している情報は以下です.- 麦酒堂内のページを識別する ID
- 参照元ページの URI
- 日時
ソースはこんな感じです.
こちらを参考にしました.まだ実装したい機能はたくさんありますが,ひとまず動くので設置してみます.
[ permalink ] [ 0 comment(s) ] -
000275
"ndtpd のセットアップ" で宣言した通り,PHP で NDTP クライアントを作成してみました.
辞書データには,WordNet を FreePWING で EPWING に変換したものを用いています.
今回の成果物のメインは,裏のライブラリの部分で,上に示した検索画面はただのデモ用です.ライブラリのソースは,こんな感じ.
lib/Book.php
lib/BookItem.php
lib/Constants.php
lib/Font.php
lib/NDTPD.php
lib/NDTPFacade.phpクラス設計やファイルの切り方は java っぽく,NDTP サーバをラップする NDTPD.php は C っぽく,と,とてもごちゃまぜなコードになっています.スパゲティではないという自負はありますが,あまり美しくはないですなぁ・・・.
ひとまず,裏側はそれなりに仕上がってきたので,UI もきちんと作っていこうかと思います.
今回,このライブラリを書いて,PHP に多少は慣れてきたけれど,まだ馴染み切れていない感触があります.コード書いている時の頭の中は,どうしても java になってしまう.もっと PHP を活かしたコードを目指したいです.
[ permalink ] [ 4 comment(s) ] -
000247
以前から入れようと思っていて先延ばしになっていた PHP をセットアップしました.
現在運用している apache2 が worker で動いているので,セットアップも多少注意が必要でした.セットアップだけではなく動作も不安といえば不安なのですが,特にクリティカルな用途でもないので,問題が起きてから対処したいと思います.(ファイルロックあたりが多少不安)
今後,複眼中心 に倣い,麦酒堂もインタフェースを php 化してゆく予定です.
[ permalink ] [ 15 comment(s) ]