[Java]Yelp APIを使ってみる

top

2014年4月、世界最大級の口コミサイト「Yelp」が日本上陸!というニュースや記事を目にするようになりました。

口コミサイトというと、日本国内のサービスですぐ思いつくのが食べログやぐるなび等、飲食店専門のサービスですが、Yelpでは飲食店に限らず住所が存在する施設や店舗であれば全てが口コミ対象のようです。

具体的な口コミ対象のカテゴリ(※)は、ざっと見て600種類以上にも分類されています。様々なアイテムを購入できるショップ、ヘアサロンや不動産屋、病院やペットショップ、スキー場やボウリング場、公共サービスの図書館や郵便局など、存在しうる全ての施設が網羅されているのではないでしょうか。

そしてレビュアは全て実名登録とする事で内容に責任を持たせ、信頼性をアップしている所も今までのサービスと相違する点です。

そんなYelpですが、他の大規模サービス同様APIが用意されています。このAPIを利用すると、検索キーワードやカテゴリ、指定の地域などで絞った最新の施設、店舗に関するYelpレビュー情報(レビュー数、星1~5の評価、店の名前、住所、電話番号、画像など)を取得することができます。そこで今回は、このYelp APIをJavaで軽く触ってみます。

Yelp Category List

1.開発者登録

まずは下のリンクから開発者登録を行います。
Yelp for Developers
Get Start
001_getstart
Sign Up
002_signup

003_signup2
入力完了で確認メールが届きますのでリンクにアクセスし登録完了します

2.アクセスキー取得

Get API Accessから、YelpAPIを使おうとしている自身のWebを入力、どういった目的で使うのかの説明文を入力、業界を選択、APIの規約をよく読み同意できればチェックを入れてSubmitします。
004_ManageAPIAccess
API v1.0を使用する為のキーが払い出されます。
今回は最新版のv2.0を使用するのでRequest API v2.0 Keyボタンをクリック
005_v1key
v2.0を使用するのに必要なキーが4種類払い出されます。これでAPIを使える状態になりました。
006_v2key

3.サンプルコード取得、取り込み

次に以下からサンプルソースを入手します。
yelp-api/v2 at master · Yelp/yelp-api · GitHub

今回は以下Javaソースと関連ライブラリをダウンロードしeclipseに取り込みます。
commons-codec-1.4.jar
scribe-1.1.0.jar
Yelp.java
YelpApi2.java

API実行結果として返ってくるjsonをパースするライブラリも以下からダウンロードし、プロジェクトのビルドパスに通します。
org-json-java
プロジェクトイメージはこのようになります。
007_project

4.ソース修正、実行

eclipseの準備が整いましたので、ソースの修正を行います。
Yelp.javaのmain()の頭で先ほど取得したキーを設定します。

public static void main(String[] args) {
    // Update tokens here from Yelp developers site, Manage API access.
    String consumerKey = "**********************";
    String consumerSecret = "***************************";
    String token = "********************************";
    String tokenSecret = "***************************";
    

これでとりあえず動くようになりましたので実行してみます。

実行結果はコンソールにjsonのテキストが1行出力されて終わりです。このままでは何が何やら分かりませんので、簡易的にパースして見やすくするために今回は以下Webサービスを利用させていただきました。
Json Parser Online

ここにコンソール出力されている文字列を貼り付けるとパースされて表示されます。画面右上のOptionsから表示形式を変更出来ますので見やすいようにしてみてください。

008_jsonparser

検索パラメータと戻りの形式は以下ページに記載されています。
Search API

今回実行したデフォルトの検索条件は、キーワード”burritos”、地理座標の経度30.361471、地理座標の緯度-87.164326という指定のみです。

この検索の結果、件数は”total”で10件、その10件の内容が”businesses”配列に入っています。

配列1件目にはTaco Bellというお店が入っており、レーティングは3.0、レビュー数は4件、などの情報が入っていることが分かります。

検索結果をプログラム内でパースして扱うには以下のようにします

	String response = yelp.search("burritos", 30.361471, -87.164326);
	
    // jsonをパース
    JSONObject obj = null;
    JSONArray ar = null;
	try {
	    obj = new JSONObject(response); // responseには戻り値のjson文字列が入っています
	    
	    //件数を取得する場合
	    System.out.println("検索結果件数 : " + obj.get("total"));
	    
	    // businesses配列をJSONArrayに格納
	    JSONArray array = obj.getJSONArray("businesses");
	    for(int i = 0 ; i < array.length() ; i++){
			//配列のオブジェクト毎に名前を取得する場合
	        System.out.println("名前 : " + array.getJSONObject(i).getString("name"));
	    }
	} catch(JSONException je) {
		je.printStackTrace();
	}

検索条件を指定するには以下のようにします。searchメソッドをオーバーロードするなりして書き換えればよいでしょう。

    // 検索キーワード General Search Parameters
    request.addQuerystringParameter("term", "検索キーワードを指定"); 
    
    // businessesリストの件数制限(未指定は20件)
    request.addQuerystringParameter("limit", "10"); // 例:結果を10件に制限する場合
    
    // 何件目から取得するかの設定
    request.addQuerystringParameter("offset", "4"); // 例:結果を5件目からに指定する場合
    
    /* Sort mode: 
     * 		0=Best matched (default), 
     * 		1=Distance, 
     * 		2=Highest Rated. If the mode is 1 or 2 a search may retrieve an additional 20 businesses past the initial limit of the first 20 results. This is done by specifying an offset and limit of 20. Sort by distance is only supported for a location or geographic search. The rating sort is not strictly sorted by the rating value, but by an adjusted rating value that takes into account the number of ratings, similar to a bayesian average. This is so a business with 1 rating of 5 stars doesn't immediately jump to the top.
     * */
    request.addQuerystringParameter("sort", "1"); // 例:検索結果リストを指定地域の中心地点から近い順に並べ替える場合
    
    // カテゴリフィルタ http://www.yelp.co.jp/developers/documentation/category_list
    request.addQuerystringParameter("category_filter", "pets"); // 例:ペット関連施設のカテゴリに絞る場合
    
    // 指定した緯度経度を中心地点とした半径の検索範囲の設定。メートル単位でMax40000
    request.addQuerystringParameter("radius_filter", "10000"); // 例:指定地域の中心地点から半径10km以内のみを検索結果に絞る場合
    
    // お得情報に絞る設定。デフォはfalse。
    request.addQuerystringParameter("deals_filter", "true"); // 例:レーティング5のみに絞る場合
	
    
    // 検索キーワード Locale Parameters
    request.addQuerystringParameter("cc", "JP");	// 検索地域	http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
    request.addQuerystringParameter("lang", "ja");	// 言語		http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
	
    
    // 検索場所の指定
    // 検索キーワード Specify Location by Geographical Bounding Box
    // bounds=sw_latitude,sw_longitude|ne_latitude,ne_longitude 南西の経度、南西の緯度、北東の経度、北東の緯度を指定し、その2点間の四角形の範囲を検索する
    //String swlat = "35.67438047492466";		// 南西 経度
    //String swlng = "139.73922729492188";		// 南西 緯度
    //String nelat = "35.69313404759997";		// 北東 経度
    //String nelng = "139.76463317871094";		// 北東 緯度
    //request.addQuerystringParameter("bounds", swlat + "," + swlng + "|" + nelat + "," + nelng); // 東京都千代田区の範囲を指定する場合
	
    
    // 検索キーワード Specify Location by Geographic Coordinate
    //String lat = "35.68469897115985";	// 経度
    //String lng = "139.7523593902588";	// 緯度
    //request.addQuerystringParameter("ll", lat + "," + lng); // 例:皇居を中心地点と指定する場合
	
    
    // 検索キーワード Specify Location by Neighborhood, Address, or City
    request.addQuerystringParameter("location", "東京都");	// 例:東京都を検索地域として指定する場合
    //request.addQuerystringParameter("cll", "35.68469897115985,139.7523593902588");

このように、様々な検索条件で最新情報を取得しプログラム内で扱うことが出来ます。
APIは1日10000回までアクセス可能ですので、そこそこのことは出来そうですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>