eagateのfacility search画面の挙動解析

店舗検索

URL例は以下の通り

  • https://p.eagate.573.jp/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=1
  • https://p.eagate.573.jp/game/facility/search/p/list.html?gkey=IIDX&paselif=false&finder=keyword&keyword=新宿

パラメータ説明:

gkey ゲームの種別を表す文字列 -
paselif PASELI対応店舗の絞込検索フラグ PASELI対応のみ=true、すべて表示=false
area "AR-nn"書式で、地方を表す文字列 AR-01=北海道・東北、AR-02=関東、…
pref "JP-nn"書式で、日本の都道府県を表す文字列 JP-01=北海道、JP-13=東京、…
finder 検索方式を表すタブの情報 area=エリアから検索、keyword=フリーワード検索
keyword 検索するキーワード フリーワード検索時のみ指定
page 検索結果のページ番号を指定 1ページあたりの件数はCookieで指定

1ページ当たりの件数

画面では「10件表示/ページ」「30件表示/ページ」「50件表示/ページ」のセレクトボックスが画面下部に用意されている。これが選択されたとき、JavaScriptにて「key:facility_dspcount, value:30」というCookieが設定される。次回以降のp.eagate.573.jpへのアクセス時に併せてリクエストに載る。このCookieが送られない場合(未設定の場合)はデフォルトの「10件表示/ページ」が適用される。10, 30, 50以外の値はサーバー側で受け付けず、デフォルト値(10)で動く。

gkey の取得

  • https://p.eagate.573.jp/game/facility/search/p/index.html

上記URLにアクセスすると、ゲームタイトル選択のセレクトボックスがある。ここには、検索に対応しているすべてのゲームが選択肢として用意されている。

<select id="id_gkey">
  <option value="MFCU" >麻雀格闘倶楽部</option>
  <option value="MFCU_HG" >麻雀格闘倶楽部(ハイグレードモデル)</option>
(中略)
  <option value="SMASTA" >スマッシュスタジアム</option>
  <option value="IIDX_LN" >beatmania IIDX LIGHTNING MODEL</option>
  <option value="IIDX" >beatmania IIDX</option>
  <option value="NOSTALGIA" >ノスタルジア</option>
(中略)
</select>

option要素のvalue属性が、gkeyパラメータに渡すべき文字列である。option要素のテキスト部はvalue属性が表すゲーム(あるいはモデル)である。

店舗情報

以下のようなHTMLで店舗情報が記述されている。

<div class="cl_shop_bloc" id="id_shop_aa92829b67458ee20f2450430349c44b" data-fdesc="aa92829b67458ee20f2450430349c44b" data-name="エムエムランド" data-address="世田谷区北沢2-3-6" data-access="小田急線下北沢駅南口から徒歩3分" data-telno="03-6804-0373" data-operationtime="" data-holiday="無し" data-latitude="" data-longitude="">
  <div class="cl_shop_title">
    <div class="cl_shop_distance"></div>
    <div class="cl_shop_name">
      <a href="/game/facility/search/p/detail.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&fdesc=aa92829b67458ee20f2450430349c44b">エムエムランド</a>
    </div>
    <div class="cl_shop_paseli"><img src="/game/facility/search/p/img/ico_paseli_s.gif" alt="[P]" /></div>
    <div style="clear:both;"></div>
</div>

class属性が"cl_shop_bloc"であるdiv要素に定義されている他の属性を抽出するのがよい。

属性:

id "id_shop_ハッシュ値" で店舗を一意に識別するコード ハッシュ値は数日ごとに更新される
data-fdesc 店舗詳細画面を表示するために必要なハッシュ値 ハッシュ値は数日ごとに更新される
data-name 店舗名 -
data-address 住所 都道府県名は省略される
data-access 店舗までのアクセス方法 -
data-telno 店舗の電話番号 -
data-operationtime 店舗の営業時間 -
data-holiday 店舗の定休日 -
data-latitude 店舗の緯度情報 35.12345のような表記
data-longitude 店舗の経度情報 135.34567のような表記

PASELIに対応しているかどうかは、class属性が"cl_shop_paseli"であるdiv要素の子要素として、img要素があるかどうかを調べればよい。

ページ移動

<div id="id_pager_bloc">
  <table class="cl_pager_table">
    <tr>
      <td class="cl_pager_number"><b><span>1</span></b></td>
      <td class="cl_pager_separator"></td>
      <td class="cl_pager_number"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=2"><span>2</span></a></td>
      <td class="cl_pager_separator"></td>
      <td class="cl_pager_number"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=3"><span>3</span></a></td><td class="cl_pager_separator"></td>
      <td class="cl_pager_mark"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=2"><span>></span></a></td>
      <td class="cl_pager_separator"></td>
      <td class="cl_pager_mark"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=3"><span>>></span></a></td>
    </tr>
  </table>
</div>

いま表示しているページが最終ページなのかどうかを判定するには、次ページ(あるいは最終ページ)への汎用リンクがあるかをチェックする。次ページは

<a href="..."><span>></span></a>

であり、最終ページへのリンクは

<a href="..."><span>>></span></a>

である。

都道府県内に1店舗も稼働していない場合

ゲームを1つ選び、「エリアから検索」タブで都道府県名にリンクが張られていないときは、指定したゲームがその都道府県内で1店舗も稼働していないことを表す。

  • https://p.eagate.573.jp/game/facility/search/p/index.html?gkey=MUSECA

上記URLの応答HTMLには、XMLHttpRequest 呼び出しをする JavaScript が含まれている。

  • https://p.eagate.573.jp/game/facility/search/json/facilityarealist.html?gkey=MUSECA&paselif=false

XMLHttpRequest 呼び出しの応答形式は、Content-type: application/json;charset=Shift_JIS である。

{
  "arealist":{
    "status":"ok","areaid":"","areaname":"", "modelname":"MUSECA", "modelpaseli":"1"
    , "areainfo":[
      {"id":"AR-01","name":"北海道・東北","exist":"true"},
      {"id":"AR-02","name":"関東","exist":"true"},
  // (中略)
    ]
  },
  "preflist":{
    "status":"ok","areaid":"","areaname":"全ての地域","prefid":"","prefname":"","modelname":"MUSECA","modelpaseli":"1"
    , "prefinfo":[
      {"area_id":"AR-01","id":"JP-01","name":"北海道","exist":"false"},
      {"area_id":"AR-01","id":"JP-02","name":"青森県","exist":"true"},
      {"area_id":"AR-01","id":"JP-03","name":"岩手県","exist":"false"},
      {"area_id":"AR-01","id":"JP-04","name":"宮城県","exist":"true"},
  // (中略)
      {"area_id":"AR-07","id":"JP-46","name":"鹿児島県","exist":"false"},
      {"area_id":"AR-07","id":"JP-47","name":"沖縄県","exist":"false"},
      {"area_id":"","id":"","name":"","exist":"false"}
    ]
  }
}

このJSONから preflist の prefinfo 配列を走査し、exist 属性が true である都道府県について、area_id 属性と id 属性を店舗検索のパラメータに指定するとよい。