バトルガールハイスクールのカードデータを抽出する

バトルガールハイスクール

一時期遊んでいたソーシャルゲームです。

Unityを利用していたのでいろいろ脆弱性があったことで有名なゲームですね。

そっちの話は長くなる上に、いろいろと危なそうなので今回は割愛します。

カードデータのダウンロード

カードデータはバトルガールハイスクール(以下、バトガ)のサーバからダウンロードするのですが、単純にコマンドを書いてしまうとものすごい勢いでサーバにリクエストを送ってしまいます。

こういうURLを巡回してスクレイピングを行うようなツールはクローラと呼ばれます。

ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

クローラは一般的には違法でないものの、サーバに負荷をかけてダウンさせてしまった場合には裁判沙汰になる可能性があります。

クローラ(Crawler)とは、ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラムである。「ボット(Bot)」、「スパイダー」、「ロボット」などとも呼ばれる。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

クローラには必ずタイムアウトを挟んでください!!

ツール

スクレイピングにはWindowsでデフォルトで実装されているbitsadminを利用します。

コマンドプロンプトから叩けば実行できるので、バッチファイルを作成すれば自動でダウンロードしてくれるはずです。

カードデータのURLの調べ方なのですが、個人的にはFiddlerを利用する方法をおすすめします。

そして、URLは以下のような形式で与えられます。

“https://URL/iOS/1.1.0/Card-Common_V2-10011-card.unity3d”

大事なのはファイル名だけなのでそこだけに焦点を当てます。

XYYZZ-card.unity3d意味
XキャラクターID(最小1, 最大18)
YY基本的に00だが01,80,90も存在
ZZカードID(最小11, 最大56)

仮に全パターン試すとして、23*3*46=3174通り試せばいいことがわかります。

一回のダウンロードに一秒程度の時間をおけば十分サーバに配慮したアクセスなので、小一時間もあれば全データを取得できることになります。

YYに他の値が存在しないかどうかは未確認です…

少なくとも自分が持っているカードではなかった。

新カードについてはキャラクターIDが101~106のものも確認しました。

ただし、後述するように新カードは上手く展開できないようです。

コマンド

コマンドを記事に書こうかどうか迷ったのですが、とりあえず最初は書かないで置くことにします。

要望がありましたので、コードを掲載します。

既存のカードの大部分は取得できますが、全カード把握しているわけではないので何枚か取得漏れがあると思います。

echo off
setlocal enabledelayedexpansion
REM Create Folder
mkdir %~dp0\Data
for /l %%i in (1, 1, 18) do (
for /l %%k in (11, 1, 56) do (
set id=%%i00%%k-card.unity3d
set url=https://i-bgirl-colopl-jp.akamaized.net/asset_bundles/iOS/1.0.52/Card-Common_V2-!id!?v=100005210
set dir=%~dp0Data\!id!
powershell -Command "Sleep -m 500"
REM Skip already file exists
if not exist !dir! (
bitsadmin /TRANSFER bgirl /PRIORITY HIGH !url! !dir!
)))
endlocal

必要そうなファイルを全部詰め込んだファイルを公開しておきます。

スクレイピングしてみた結果
401枚のカードデータ

全部で401枚のカードデータが取得できました。

カードデータの展開

ata4氏がリリースしているdisunityを利用します。

v0.3.4を使用してください!!

Javaで動作するのでJRE(Java Runtime Environment)のインストールが必要です。

以下のようなバッチファイルを作成して、disunity.jarと同じファイルに配置しましょう。

@echo off
for %%f in (%~dp0Data\*.unity3d) do (
    java -jar "%~dp0disunity.jar" extract %%f
)
disunity

あとはバッチファイルを実行すればData内の.unity3dをすべて展開してくれます。

出力されるのはTGAというフォーマットなので適当にPNG等に変換してしまいましょう。

ID:1010044

おつかれさまでした。

未対応?

最新のデータに対してDisunityを実行するとなんだかおかしくなってしまう。

Texture2D出力成功

[info] DisUnity v0.3.4
[info] C:\Users\me\Downloads\extract\Data\1010011-card.unity3d
[info] Uncompressing asset bundle, this may take a while
[info] C:\Users\me\Downloads\extract\Data\1010011-card.unity3d\CAB-9d51291274a534e9cb3a93378b78b28c
[info] Standalone asset file detected, using structure from database
[info] Loading struct database
[warning] FieldTypeMap: Unprecise match for ClassID 28 (required: 4.7.2f1
1, available: 4.1.0f4)
[warning] FieldTypeMap: Unprecise match for ClassID 142 (required: 4.7.2f1
1, available: 4.1.5f1)
[info] Writing Texture2D card.tga

TextAssetが出力されてしまう

[info] DisUnity v0.3.4
[info] C:\Users\me\Downloads\extract\Data\1060138-card.unity3d
[info] C:\Users\me\Downloads\extract\Data\1060138-card.unity3d\CAB-8c7a598be575148f480ad713e0bd43f3
[info] Standalone asset file detected, using structure from database
[info] Loading struct database
[warning] FieldTypeMap: Unprecise match for ClassID 49 (required: 4.7.2f1
1, available: 4.1.1f4)
[warning] FieldTypeMap: Unprecise match for ClassID 142 (required: 4.7.2f1
1, available: 4.1.5f1)
[info] Writing TextAsset Card-Common_V2-1060138-card.txt

disunityのバージョンが低いせいで最新のUnityに対応できていないだけかな?という気もするのだが、調べるのがめんどくさいのでまた今度ということで。

まとめ

以前はちまちまURLを調べていたのですが、コードを書いて全部自動化できるようにしました。

正直、バトルガールハイスクールってそろそろサービス終了してるんじゃないか…っていう不安があったのですが、まだ継続していたようで何よりです。

正しくTGAが展開できなかったファイルに関してはのちのちの宿題ということにしておきます。

自分がとにかくソーシャルゲームに興味が無いので、バトガとミリオンアーサーくらいしか触ってたのがないんですよね。

どっちも既にプレイしてないですし、ソシャゲという仕組みが自分にあっていないのかもしれません。

シェアする

『バトルガールハイスクールのカードデータを抽出する』へのコメント

  1. 名前:happiness 投稿日:2019/06/14(金) 17:58:00 ID:8ef45e89f 返信

    はじめまして。
    サービス開始当初よりバトガを楽しんでいたものですが、この度サービスが終了してしまうことになり、残念に思っています。せめてデータだけでも残しておきたいと思い、色々と方法を探していたところ、こちらにたどり着き救われた思いです。

    不躾なお願いなのですが、Live2Dのデータを取り出す方法をご存知ならばご教授いただくことはできませんでしょうか。
    ご検討いただけますと幸いです。

  2. 名前:ykiyki 投稿日:2019/06/15(土) 09:23:39 ID:367e0fb5c 返信

    TextAssetになる理由はUnityの暗号化を利用してるからだと思います。

    • 名前:me 投稿日:2019/06/16(日) 03:24:17 ID:20249fc22

      暗号化なんでしょうか?詳しく知らないのでなんとも言えないのですが。