Debug- Official Website -


犬土偶日記

海の近くに住みたい

Debug日記の使い方

話題:Webプログラミングとか

2009年12月14日

Z店リアルタイムデータ取得CGI

最終更新日: 2009年12月15日 00時32分16秒

昨日の日記にも少し書いたが、あるCGIスクリプトを昨日からコツコツと書いてゐた。完成したのでDebugサイトのSpecialのページにリンクを張つておいた。何のCGIかといふと、俺がいつも行くパチ屋Z店のサイトにあるリアルタイムデータを引つ張つて来て見やすいやうに処理して表示するやつ。本家のサイトは携帯電話で見ることが可能といふか、主に携帯向けな感じの作りになつてゐる。だから1画面での情報量が少ない。ページ遷移に何度もクリックが必要になつたりする。ある台の過去1週間のデータを見ようと思つたらまづ本日のデータのページにアクセスしてから7回もページ遷移する必要がある。1週間前のデータを見てゐる頃には3日前がどうだつたか覚えてゐないなんてことにもなりかねない。また、同一機種の全台をある特定の日だけで横の比較をするといふやうな時にも同じことが起こる。手間が掛かるし移動するたびに読み込みに時間が掛かるし、とにかく面倒臭いし不便だ。なので、データを引つ張つて来て一覧表示できるやうにしたら便利なのではないかと思つたのだ。こんなプログラムを作つても俺以外には役に立たない。地元の人間でZ店でスロを打つ人間には有用かもしれない。俺が苦労して作つたプログラムで楽をするのは勝手だが、感謝の気持ちを込めてinuzonで買ひ物でもしてくれるとありがたい。

今日は昼前に一瞬目が覚めた。携帯電話が激しく鳴つたのだ。開いてみたら知らん番号からだつた。普段だつたら完全無視のところだが、この番号は先週にも見た。先週は当然完全無視をしたのだが、また掛かつて来たといふことは何か用事があるんだらう。誰だか知らんが激しく面倒臭い。出てあげたらクレジットカードの会社だつた。エイデンのeeカードといふのがあつて、ライフとかいふカード会社との提携が切れるからセディナといふところのカードに変更しろとエイデンからDMが来てゐた。なので変更の書類を書いて送つたのだが、その本人確認の電話だつた。職業を聞かれたので力強く誇らしげに無職と答へた。職があるお前らには分かるまい。職が無くても何故か卑屈なカスにも分かるまい。感動に震へる瞬間だ。無職と答へたり職業欄に無職と書き込む瞬間、生きてることを実感できる。それにしても、職業欄に力強く楷書で無職と書き込んだのに何故また確認するんだらうか。読めないのか?まあいい。あとは住所と生年月日を聞かれた。これで本人確認は終了らしい。これから審査に入るんだと。これが怖い。無職がクレカの審査に通るのか?前回のライフの時はどういふわけか通つたんだが。ここで蹴られたら非常に鬱陶しい。カードの無い生活は不便過ぎるからな。電話を切ると同時に気絶したらしい。次に起きた時には外が暗かつた。

プログラミングの続き。まづ、店のサイトからデータを取つて来るためには向うのサイトがどういふ仕組みになつてゐるのか解析する必要がある。ただデータを取得するなんて言つても簡単にできるわけではない。まづは普通にブラウザからアクセスして通常利用する場合。Z店のサイトのTOP(ttp://www.p-do.ne.jp/pg_k/top.cgi?ln=zent-kani&Apdo)から下の方にある「リアルタイムデータをGET」といふリンクへ。そこから例へば青ドン花火の極のデータへ行くには下の画像のやうに4段階のページ遷移が必要になる。

Z店サイトのリアルタイムデータのコンテンツ

@の画面はどうでも良いだらう。そこから「スロット」へ進む。URLは ttp://www.p-do.ne.jp/pg_k/sp_mch_list.cgi?ln=zent-kani&pg=01&psg=S だ。ここでのCGIのファイル名はsp_mch_list.cgi。ファイル名からして機種リストを表示するだけのCGIだらう。次に何でもいいのだが「青ドン 花火の極」を選択し、Bの画面へ。ここは青ドンの台番号が並んでゐる。どの台のデータを見るか選択させる画面だ。URLは ttp://www.p-do.ne.jp/pg_k/sp_mch_machine.cgi?ln=zent-kani&pg=01&mid=M0103 で、CGIファイル名はsp_mch_machine.cgi。似てゐるがAの画面とは違ふCGIだ。次に531番台を選択してみる。URLは ttp://www.p-do.ne.jp/pg_k/sp_mch_outinfo.cgi?ln=zent-kani&pg=01&hcid=2059&numb=531 で、また違ふCGIだ。1つのCGIで条件分岐してページを表示し分けてゐるのではなく、ページごとに個別のプログラムが動いてゐる。厄介だ。引数が共通ではない可能性があるからだ。

CGIプログラムに値を渡す時、主に4つの方法がある。1つは環境変数。ブラウザ等が勝手に送る情報だ。偽装可能なものもある。2つめはCOOKIE。セッション等に使はれる。掲示板などで一度書き込んだら次にアクセスした時に名前欄に前回と同じ名前が入力済みになつてゐたりするのもCOOKIEの仕業。アクセス時に向うのプログラムがこちらのPCにCOOKIEといふテキストファイルを作る。次回以降、同じURLにアクセスした時にだけ同じCOOKIEが読み込まれる。3つ目はフォーム。掲示板で名前や本文を入力する場所とか、ショッピングサイトでは住所やクレジットカード番号を入力したりする。さういふフォームを通じてプログラムに情報を送ることができる。最後に、URLの後ろに「?」を付けてデータを付け加へてアクセスする方法。このZ店のCGIでは4つ目の方法が採られてゐる。通常のリンク(A要素によるアンカー)をクリックして情報の受け渡しをするならこれ。このプログラムに送る情報といふのは、「名前=値」の組を「&」で繋いだ形になる。全てのCGIに共通のln=zent-kaniといふのは、lnといふ名前にzent-kaniといふ値をセットするといふ意味。これはどう見ても店舗名の情報だらう。このプログラムはZ店の自前のプログラムではなく、パチ屋向けにデータ公開サービスを提供してゐる会社が作つてゐる。契約してゐる複数の他店舗も使用してゐるので、どの店のデータなのか識別するための情報が必要になる。それがこの値だらう。どの値にどういふ意味があつて、どのやうに使はれてゐるのか全く推測できない場合には必要なデータを取り出すことができない。完全にランダムな文字列を値の名前にしてゐたりすると非常に困難になる。だが、このプログラムは簡単に解析できさうだ。まづpg=01といふのがあるが、01以外の値は使はれてゐないので意味が分からなくても01固定で良いだらう。たぶんページ番号。どうでもいい。Bの画面のCGIにあるmid=M0103といふのは何だらうか。Aの画面に戻つて機種一覧のリンクにカーソルを合はせてURLを見てみると機種ごとにこのmidの値が違ふことが分かる。機種に番号を付けてゐるだけだらう。midとはMachine IDの略なのではないか。安易なネーミングだ。分かりやすくて良い。機種名とこの記号を対応付ければOK。Bの画面からCの画面に行くリンク(台番号を選択する)のURLにhcid=2059とnumb=531といふのがある。numbは台番号だ。hcidは何だらうか。numbが決まれば必然的に機種が決まるはずなので機種の番号ではないだらうし、違ふCGIだがmidといふデータが機種番号として使はれてゐた。他の機種のページにアクセスしてみると機種ごとに固有の番号に思へる。でもmidを使ひ回さない理由が何かあるのではないか。何か理由があるならそれが分からないとデータ取得できない可能性もある。ここで一旦悩む。取り敢へず保留。

プログラムでデータを取得する際に、単純に必要な値を付け加へたURLから普通に取れるのだらうかといふ疑問がある。他サイトからのアクセスを禁止してゐたり、何らかのセッション機能を使つてゐたりするかもしれない。さういふ確認もしておかねばならない。まづはブラウザからアクセスしてリファラチェックしてゐるかどうかの確認をする。Z店のサイトから普通にリンクを辿るのではなく、URLをコピペして直に飛んでみる。そしたら「期限切れです」といふやうなエラーメッセージが表示された。ん?期限?何の?一見するとセッションの期限切れに見える。しかしここはセッションなんか使つてないのではないか。携帯電話からのアクセスがメインだらう。未だにCOOKIE機能を搭載してゐない携帯電話は多いのでCOOKIEによるセッションは無いはず。COOKIEが使へるかどうかを判別して振り分けてゐる可能性もあるのでブラウザの設定でCOOKIEを完全にシャットアウトして普通にZ店のTOPページからアクセスし直してみた。普通に表示された。COOKIEによるセッションではない。しかしURLにセッション情報を埋め込んでPATH_INFOで取るタイプでもないのはリンクのURLを見れば明らかだ。セッションなど使つてゐない。そもそもログインとかが必要無いところでセッションなど使ふわけが無い。ならば何の期限だ?いつを始点にした期限だ?始点の時刻はどこに記録してゐるんだ?COOKIEでないなら向うのサーバー側にファイルとして記録してゐることになるが、毎日膨大なアクセスがあるのにそんな無意味なことをしたらサーバーの負荷が凄いことになる。これは。嘘のエラーだな。サイトの作りもいい加減だし、これは思つた以上に拍子抜けなプログラムなんぢやないか?リファラチェックをしてゐるだけのやうな気がする。ダウンロードソフトのIrvineでアクセスしてみることにした。これはリファラを偽装することができる。ブラウザで画面に表示するのもダウンロードソフトでHTMLファイルをダウンロードするのも原理的には同じことだ。Cの画面のURLをIrvineにブチ込み、リファラ無しで試した。期限切れのエラーが表示されたHTMLが落ちて来た。次にBの画面のURLをリファラにセットしてダウンロードしてみた。無事にCのHTMLが落ちて来た。やはりリファラチェックだけのやうだ。何が期限切れだ。しかしこの件に関してはここで終るわけにはいかない。どこまで厳密にリファラチェックしてゐるのか知る必要がある。機種ごとにBのURLの引数が変つてしまふのだから、完璧なチェックをしてゐるならば毎回正確なリファラの文字列を作つてアクセスする必要が出て来る。さうなるとプログラムが煩雑になる。非常に面倒臭い。できるなら全部共通のリファラでGETできるのが望ましい。といふわけで、リファラを ttp://www.p-do.ne.jp/ ここまで削つてダウンロードを試みた。普通に落ちてきた。アホだな。何のためにリファラチェックしてるのかも分からん。だが、とにかくシンプルにドメインまでのURLをリファラにして全データを取得できることが判明した。

さて、必要なのはCの画面にある情報だ。台番号のリストとか、後で必要になる物もあるが、肝心の重要データはCの画面にある。このHTMLを丸ごと取得して中から必要なデータだけ正規表現で取り出すことになる。まづはCの画面のHTMLソースを見てみる。改行も字下げも無く、延々と横に長く続くHTMLだつた。非常に読みにくい。以下抜粋。適宜改行を入れ、絵文字等のゴミデータは省略。強調部分が特に必要なデータ。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
 <head>
  <title>ZENT 可児店</title>
  <meta http-equiv="Cache-Control" content="no-cache" />
 </head>
 <body style="(略)" bgcolor='' link='#000000' vlink='#000000'>
☆ 青ドン 花火の極 ☆<br>[531番台]<br>
  <div align=left>
  <hr>
 本日(19:00更新)<br>
[翌日]<a href='sp_mch_outinfo.cgi?ln=zent-kani&pg=01&hcid=2059&numb=531&day=1'>[前日]</a><br>
[前の台]<a href='sp_mch_outinfo.cgi?ln=zent-kani&pg=01&hcid=2059&day=&numb=532'>[次の台]</a><br><br>
総スタート&nbsp;4457回転<br><br>
出玉数&nbsp;1385P<br>
<img src='graph_slamp.php?p=L1278&g=G1055&h=2059&n=531&d=2009.12.13&u=5000&l=-5000' width='232'><br><br>
19:00更新&nbsp;372回転<br>
BB&nbsp;16回/RB&nbsp;3回<br>
<img src='graph_his.php?p=L1278&g=G1055&h=2059&n=531&d=2009.12.13' width='232'><br>
18:05&nbsp;BB&nbsp;403回転<br>
17:20&nbsp;BB&nbsp;39回転<br>
(以下略)

これは酷い。CGIの引数やリファラチェックの部分を見てゐる間に薄々感じてゐたが、素人同然の奴が組んだシステムだな。昔からWebプログラマといふ奴はマークアップに無頓着な傾向があるが、これは酷過ぎだらう。XHTML1.0 Transitionalの文書型宣言があるのに全然XHTML1.0 Transitional DTDに沿つてゐない。属性値を引用符で括らないとか未定義の要素を使つてゐるとか空要素を閉ぢてゐないとか。属性値のURI(A要素のHREF属性とかIMG要素のSRC属性とか)に引数のデリミタ「&」をそのまま使つてゐるし。普通にURLを書く場合には&のままで良い。しかし(X)HTMLの属性値はRCDATA(Replaceable Character Data)なので実体参照が展開される。&は&amp;と書かないとダメだ。色々と突つ込みどころが多い。何のために文書型宣言をしてるのか分からん。意味も分かつてないんだらうと思ふ。まあどうでもいい。スランプグラフは通常の画像だと思つてゐたが、アクセスするたびに向うのサーバーのプログラムが書き出してゐた。まあリアルタイムデータだからそれが当り前か。常にサーバーが画像を作り出してファイルとして保存してたら大変だ。これは厄介だな。スランプグラフもうちのサイトから見れるやうにしたいんだが、これもリファラチェックとかあるんだらうな。引数の解析もしないとな。面倒臭いな。

まづはIrvineを使つてスランプグラフのリファラチェックについて調べる。何とノーチェック。次に引数のチェック。p=L1278は何の値か知らんが全機種全台固定らしいのでこのままで良い。店舗番号かな。g=G1055は何だらう。これも固定なのでこのままで良いのだが、意味が分からないのが気になる。試しにG1054に変へてアクセスしてみた。まつさらなグラフが表示された。店舗番号と思はれるp=L1278の値も色々弄つてみたが、やはり何も書き込まれてゐないグラフが表示される。分からない。後で絶望的な不都合が生じるかもしれない。取り敢へず保留。h=2059は簡単だ。データ表示CGIでのhcidと同一の値だ。たぶん機種番号なんだらう。n=531は当然台番号。d=2009.12.13は日付に違ひ無い。これが日付でなかつたらお手上げだ。u=5000とl=-5000はグラフの画像から見て、グラフのY軸の上端と下端の値だらう。±5000枚のグラフを表示するといふこと。オリジナルがこの値だからこのままでも良いだらう。上限を万枚にすると、普段の激渋な時には全台0のライン付近を這ひつくばつてゐるやうな感じになつて比較しにくい。さて、スランプグラフの方は若干不安な要素もあるが何とかなりさうだ。まだ見るべきところはある。[前日][翌日][次の台][前の台]のところのリンク。未知の引数がある。day=1といふやつ。[前日]をクリックしながら過去のデータに遡つて行くと、1日戻るごとにこの値が1づつ増えて行く。31までしか無いらしい。過去1ヶ月分まで見ることができる。0が今日、1が昨日、2が一昨日といふ具合だ。

hcidの値が何なのか不明だが、出力されるHTMLを見るとあまり論理的な思考ができる奴が作つたやうにも思へんし、midとダブるけれども機種番号といふことにしておいて良からうと思ふ。固定のデータは変に弄らずそのまま使へば良い。後はプログラムするだけ。

俺が作るプログラムではある機種について縦の比較と横の比較を一覧表示したい。縦の比較とは、ある1台について時間方向に比較すること。今日から1ヶ月前までのデータを順に表示する。横の比較は同一日における特定機種の全台比較。これだけでは芸が無い。オリジナルサイトでは表示されてゐないデータも表示するやうにしよう。BIG・REGの出現率とその合算確率とか。これはデータを取得して計算すれば良い。青ドンなんかは宵越し天井があるから、データを計算して天井までの残りゲーム数なんかも自動的に計算して表示するやうにすると便利だらう。ハイエナは無能の証なので俺はやらないけども。まあ天井に関しては後日やることにして、今日は一覧表示をするプログラムを一通り動くところまで作ることにした。

俺のプログラムが向うのプログラムにアクセスする際にHTTP_USER_AGENTの値が送られる。ブラウザの種類とか携帯の機種とかの情報。これがPHPプログラムの場合はPHP5.5.2みたいな感じの文字列になる。まあ今まで見た感じではアクセスログをチェックしてゐるとはとても思へんからどうでも良いのだが、これも一応偽装しておくことにした。WindowsXPのIE6.0のUA。まづどういふ構成にしようか考へた。最終的な出力がイメージできてないと組めない。TOPは必要な機種一覧にしよう。絶対打たないやうな機種の情報は省く。次に機種ごとのTOPページ。ここには本日のデータ(横の比較)と、機種ごとの縦横の比較へのリンクを置く。次は横の比較のページ。最後に縦の比較のページ。メインルーチンはこの条件分岐にして、4系統の動作を作つて行く。まづは何も処理の要らない機種一覧のページを作る。次は機種ごとのTOPページ。メニューと本日のデータを表示する。本日のデータを表示するためにはTOPページからのリンクに含まれてゐた文字列から機種を特定し、その機種には何台あり台番号は何なのかといふのを本家サイトから取得する。番号が分かつたら全台の本日のデータ(Cのページ丸ごと)を取得し、必要な要素を抜き出して表示する。グラフも無事に表示された。本家のデータと見比べて矛盾は無い。正しく取得できてゐる。実は何度も何度もエラーを出して苦しんだが無事に完成した。次は横の比較。機種と日付の指定が必要になる。引数からそれらの情報を取り出してデータを本家サイトから取得する。で、必要な要素を抜き出して整形して表示。最後に縦の比較。1ヶ月分一気に表示するとなると読み込む量が非常に多くなるので多少時間が掛かる。10日分づつ分けた方が良かつたかもしれない。まあ取り敢へず苦労したが無事に一通り動くところまでできた。引数は当然プログラム内部でキッチリとチェックしてゐるから数値が期待されるところに文字列を入れたり巨大過ぎる数値を入れたり明らかにをかしなことをしても無駄だよ。スクリプトを埋め込まうとかそんなこと考へても無駄。まあどうでもいい。

早速UPしてDebugサイトのSpecialのページにリンクした。実際にサーバー上でも動かしてみた。今のところ大丈夫。後で何か不具合が発見されるかも。ずいぶん苦労したな。たつたこれだけのことなのに。Perlだつたら2割の時間で組めた気がする。まだPHPには慣れないな。これを台選びの参考にして勝つぞ!なんて思つてもそれが猛烈に裏目に出たりするんだらうな。俺はさういふ仕組みの宇宙に生きてゐる。で、このプログラムを利用した他の奴は楽に勝てるやうになつたりするんだらうな。死んで欲しい。これ使つて勝つたらinuzonで買ひ物してね。

話題:Webプログラミングとか

Info.
公開日時2009年12月15日 00時30分59秒
最終更新日2009年12月15日 00時32分16秒 (更新回数: 2)
本文文字数9309文字 (タグ込み)
URLhttps://orca.xii.jp/debug/diary/diary.cgi?id=dogoo;date=20091214
RSS1.0https://orca.xii.jp/info/diary-dogoo.rdf
Comments
コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しDebugger」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。