早く馬券投票支援ツールを作りたい!
という訳で、IPAT(即PAT)の仕様解析を急いで進めます。
まずは一番重要な馬券データのフォーマット仕様についてです。
■馬券データのフォーマット
投票画面のJavascriptのNb変数に配列で格納されているデータ
[状態コード1桁]-[購入番号3桁]-[競馬場Indexコード1桁16進]-[レース番号1桁16進]-[曜日ID1桁]-[購入方式1桁16進]-[式別1桁]-[組番データとマルチフラグ14桁]-[金額4桁16進]-[※地方競馬場ID]
投票画面のJavascriptのNb変数に配列で格納されているデータ
[状態コード1桁]-[購入番号3桁]-[競馬場Indexコード1桁16進]-[レース番号1桁16進]-[曜日ID1桁]-[購入方式1桁16進]-[式別1桁]-[組番データとマルチフラグ14桁]-[金額4桁16進]-[※地方競馬場ID]
中央例27桁)10004A73500800000000200XXXX
1-000-4-A-7-35-00800000000200-XXXX
※XXXXは金額データ
地方例29桁)10000930640002000000000XXXX56
1-000-0-9-3-0-6-40002000000000-XXXX-56
※XXXXは金額データ 最右端2桁はMg変数で定義された競馬場IDで56だと浦和
1-000-4-A-7-35-00800000000200-XXXX
※XXXXは金額データ
地方例29桁)10000930640002000000000XXXX56
1-000-0-9-3-0-6-40002000000000-XXXX-56
※XXXXは金額データ 最右端2桁はMg変数で定義された競馬場IDで56だと浦和
■状態コード
画面により若干異なるが、馬券購入時は1固定で良い
※購入画面
固定で常に1
※購入完了画面
1:正常
2:締切で未購入
3:取消で未購入
8:除外で未購入
A:不明なエラー等
※照会画面
1:未確定
5:的中
7:返還
8:特払
9:不成立
■購入番号
0始まりの通番 ※送信時のFORM要素名は01始まりなので注意すること
■競馬場Indexコード
ログイン後や投票画面のMg変数でセットされている順の各競馬場Index
画面により若干異なるが、馬券購入時は1固定で良い
※購入画面
固定で常に1
※購入完了画面
1:正常
2:締切で未購入
3:取消で未購入
8:除外で未購入
A:不明なエラー等
※照会画面
1:未確定
5:的中
7:返還
8:特払
9:不成立
■購入番号
0始まりの通番 ※送信時のFORM要素名は01始まりなので注意すること
■競馬場Indexコード
ログイン後や投票画面のMg変数でセットされている順の各競馬場Index
中央の場合は普通に競馬場コードの16進数化されたものでした。
地方競馬の場合は常に未使用の0で、馬券データの右端に地方競馬場IDを付加して競馬場を識別する。
中央の競馬場コード
1:札幌
2:函館
3:福島
4:新潟
5:東京
6:中山
7:中京
8:京都
9:阪神
A:小倉
■レース番号
16進数なので10R以降はA/B/Cになる
■曜日ID
1:日
2:月
3:火
4:水
5:木
6:金
7:土
■購入方式
今回は馬券を1点づつばらして買う方式なので通常しか使わないが一応フォーマット仕様として記載。
0:通常
1:フォーメーション
2:BOX
3:1頭軸1着流し
4:1頭軸2着流し
5:1頭軸3着流し
6:2頭軸1-2着流し
7:2頭軸1-3着流し
8:2頭軸2-3着流し
9:1頭軸流しマルチ ※三連単のみ
A:2頭軸流しマルチ ※三連単のみ
■式別
自前の購入シミュレータでは拡張して9:枠単として使用しているがIpatでは枠単は対応していない。
1:単勝
2:複勝
3:枠連
4:馬連
5:ワイド
6:馬単
7:三連複
8:三連単
■組番データとマルチフラグ
枠連と枠連以外では内容が異なる。
※枠連の場合
14桁(56bit)のうち左6桁(24bit)を枠番に使用
2:函館
3:福島
4:新潟
5:東京
6:中山
7:中京
8:京都
9:阪神
A:小倉
■レース番号
16進数なので10R以降はA/B/Cになる
■曜日ID
1:日
2:月
3:火
4:水
5:木
6:金
7:土
■購入方式
今回は馬券を1点づつばらして買う方式なので通常しか使わないが一応フォーマット仕様として記載。
0:通常
1:フォーメーション
2:BOX
3:1頭軸1着流し
4:1頭軸2着流し
5:1頭軸3着流し
6:2頭軸1-2着流し
7:2頭軸1-3着流し
8:2頭軸2-3着流し
9:1頭軸流しマルチ ※三連単のみ
A:2頭軸流しマルチ ※三連単のみ
■式別
自前の購入シミュレータでは拡張して9:枠単として使用しているがIpatでは枠単は対応していない。
1:単勝
2:複勝
3:枠連
4:馬連
5:ワイド
6:馬単
7:三連複
8:三連単
■組番データとマルチフラグ
枠連と枠連以外では内容が異なる。
※枠連の場合
14桁(56bit)のうち左6桁(24bit)を枠番に使用
1ワーク18bitのうち上位8bitを枠番に使用 (14桁56bitは変わらず)
枠番1:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番2:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番3:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番1~3をシフトして連結
※馬連/馬単/ワイド/三連複/三連単の場合
14桁(56bit)のうち左54bitを馬番に使用。
馬番1:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番2:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番3:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番1~3をシフトして連結
マルチフラグ:右端1bit(最下位Bit)でマルチの場合に立てる。
■組番データの組み合わせ仕様
※各枠番/馬番データは購入方式によって使用する枠番/馬番ワークが異なる。全て解析済みではあるが今回は通常しか使わないのでその他の組み合わせ仕様は割愛。
※馬連/馬単/ワイドの流し系は枠番1-3/馬番1-3を使うのが注意するところ。Boxは1しか使わない。
方式=通常の場合 ※ワークの使い方を間違っていたので修正
単勝/複勝/馬連/ワイド/三連複
馬番ワーク1のみ使用
枠番1:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番2:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番3:8bitで左(最上位Bit)1-8枠。購入枠のBitを立てる。
枠番1~3をシフトして連結
※馬連/馬単/ワイド/三連複/三連単の場合
14桁(56bit)のうち左54bitを馬番に使用。
馬番1:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番2:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番3:18bitで左(最上位Bit)から1番-18番の馬番。購入馬番のBitを立てる。
馬番1~3をシフトして連結
マルチフラグ:右端1bit(最下位Bit)でマルチの場合に立てる。
■組番データの組み合わせ仕様
※各枠番/馬番データは購入方式によって使用する枠番/馬番ワークが異なる。全て解析済みではあるが今回は通常しか使わないのでその他の組み合わせ仕様は割愛。
※馬連/馬単/ワイドの流し系は枠番1-3/馬番1-3を使うのが注意するところ。Boxは1しか使わない。
方式=通常の場合 ※ワークの使い方を間違っていたので修正
単勝/複勝/馬連/ワイド/三連複
馬番ワーク1のみ使用
馬単
馬番ワーク1/馬番ワーク2を使用
馬番ワーク1/馬番ワーク2を使用
三連単
馬番ワーク1/馬番ワーク2/馬番ワーク3を使用
■金額
金額÷100円を16進化した値
16進数なので6,553,500円までは表現可能だがScript側で999,900円に制限している。
■地方競馬場ID
中央競馬の場合には競馬場Indexを使うので不要。
ログイン後に取得した2桁の数値
30番台の開催を見てみないと分からないが
下記の本来の競馬場IDと比例関係があり、今の所
馬券に付与する地方競馬場ID = 本来のID + 30 - (5 - 本来のID/10)×2
あたりが成り立っているような気はする。
馬番ワーク1/馬番ワーク2/馬番ワーク3を使用
■金額
金額÷100円を16進化した値
16進数なので6,553,500円までは表現可能だがScript側で999,900円に制限している。
■地方競馬場ID
中央競馬の場合には競馬場Indexを使うので不要。
ログイン後に取得した2桁の数値
30番台の開催を見てみないと分からないが
下記の本来の競馬場IDと比例関係があり、今の所
馬券に付与する地方競馬場ID = 本来のID + 30 - (5 - 本来のID/10)×2
あたりが成り立っているような気はする。
算出できそうな式は思い当たらないので、IPAT連携開催時に拾ってきて固定MAPで変換することにます。
30:門別 4/17確認時38
35:盛岡 5/12確認時49
36:水沢 3/23確認時50
42:浦和 以前確認した時は56
43:船橋 2/19確認時57
44:大井 2/6確認時61
45:川崎 2/26確認時62
46:金沢 3/17確認時67
47:笠松 以前確認した時は66
48:名古屋 2/26確認時26
50:園田 2/6確認時13
54:高知 以前確認した時は78
55:佐賀 本日確認したら80だった
35:盛岡 5/12確認時49
36:水沢 3/23確認時50
42:浦和 以前確認した時は56
43:船橋 2/19確認時57
44:大井 2/6確認時61
45:川崎 2/26確認時62
46:金沢 3/17確認時67
47:笠松 以前確認した時は66
48:名古屋 2/26確認時26
50:園田 2/6確認時13
54:高知 以前確認した時は78
55:佐賀 本日確認したら80だった
①上記のフォーマットで生成した馬券データをPOSTする
※次の合計金額入力画面も自前で処理したい場合はAjaxでPOSTする
action先:/sp/pw_741_i.cgi
POSTパラメータ
01~50:上記馬券データ ※最大50件まで
g:740
inetid:ログイン時に取得した値
uh:ログイン時に取得した値
u:ログイン時に取得した値
nm:ログイン時に取得した値
zj:ログイン時に取得した値
※次の合計金額入力画面も自前で処理したい場合はAjaxでPOSTする
action先:/sp/pw_741_i.cgi
POSTパラメータ
01~50:上記馬券データ ※最大50件まで
g:740
inetid:ログイン時に取得した値
uh:ログイン時に取得した値
u:ログイン時に取得した値
nm:ログイン時に取得した値
zj:ログイン時に取得した値
②直接POSTした場合はIpatの合計金額入力画面になり金額を入力して投票完了。
③AjaxでPOSTした場合は受信結果(合計金額入力画面HTML)から必要なパラメータをスクレイピングする
t:ワンタイムパスワード?必要
inetid:取得済みなので不要
uh:取得済みなので不要
u:取得済みなので不要
nm:取得済みなので不要
zj:取得済みなので不要
③AjaxでPOSTした場合は受信結果(合計金額入力画面HTML)から必要なパラメータをスクレイピングする
t:ワンタイムパスワード?必要
inetid:取得済みなので不要
uh:取得済みなので不要
u:取得済みなので不要
nm:取得済みなので不要
zj:取得済みなので不要
④馬券データと合計金額をPOSTする
※次の投票完了画面も自前で処理したい場合はAjaxでPOSTする
action先:/sp/pw_742_i.cgi
POSTパラメータ
01~50:上記馬券データ
l:購入馬券の合計金額
s:購入馬券の合計金額(本来は手入力した金額)
g:741
inetid:ログイン時に取得した値
t:②で取得した値
uh:ログイン時に取得した値
u:ログイン時に取得した値
nm:ログイン時に取得した値
zj:ログイン時に取得した値
※次の投票完了画面も自前で処理したい場合はAjaxでPOSTする
action先:/sp/pw_742_i.cgi
POSTパラメータ
01~50:上記馬券データ
l:購入馬券の合計金額
s:購入馬券の合計金額(本来は手入力した金額)
g:741
inetid:ログイン時に取得した値
t:②で取得した値
uh:ログイン時に取得した値
u:ログイン時に取得した値
nm:ログイン時に取得した値
zj:ログイン時に取得した値
⑤直接POSTした場合はIpatの投票完了画面が出て投票完了
⑥AjaxでPOSTした場合は受信結果(投票完了画面HTML)から使いたいパラメータをスクレイピングする。
馬券毎の投票結果等(締切に間に合わなかったりや除外などの場合は馬券データ1桁目の状態コードが変わる)
⑥AjaxでPOSTした場合は受信結果(投票完了画面HTML)から使いたいパラメータをスクレイピングする。
馬券毎の投票結果等(締切に間に合わなかったりや除外などの場合は馬券データ1桁目の状態コードが変わる)
大体、以上の手順で馬券が投票できるはずなので
早速、Ajaxでログインさせるテストコードから着手したいと思います。
【関連する記事】