hiroumauma

hiroumauma kancolle memo!


: メンバー向け
: 基本的に公開禁止ページ (制限緩)

[開発版]

8月17日

http://kancolle.kadokawa.jp/

ここで表示されている画像がゲーム内素材より高画質だと気がつく
通信キャプチャを見たところ画像名ランダムっぽい文字列が使われている・・・

ソースを見たところ jQuery の sha1 で文字列を暗号化している模様
とりあえず艦娘の名前で sha1 をかけてみるが文字列が一致しない

ソースをちゃんと読んだところ id+kancolle を sha1 にかけている模様
例) 夕張 id=99 sha1("99kancolle") = 55e328555d5ab3a4f9a815646e9ab756855526e0
となると画像は
http://kancolle.kadokawa.jp/img/character/f/099_55e328555d5ab3a4f9a815646e9ab756855526e0.png
となる。


for(var i=0; i<150; i++)
{
  var id = ("000"+i).slice(-3);
  document.write("img src=\"http://kancolle.kadokawa.jp/img/character/f/" + id + "_"+$.sha1(i+"kancolle")+".png\"");
}

こんなコードを書いたら無事取得できた。
このままだと無駄が多いから取得できるidだけ取り出したほうが◎ 100回以上がNG

伊勢,赤城,加賀,島風,吹雪,大井,北上,最上
翔鶴,夕張,大和,金剛(改二)

が取得できた。

5月10日
音声へのアクセス方法が変更

PortMainの初期化部分

public function initialize():void{
    BlockerLayer.actionBlockLayer = _mainView.blockActionLayer;
    Connector.actionBlockLayer = _mainView.blockActionLayer;
    SceneLoadThread.actionBlockLayer = _mainView.blockActionLayer;
    Tween24.serial(_preShowBefore(), Tween24.prop(this).alpha(1), 
             _mainView.fadeLayer.getTween(0, 1),
             Tween24.func( function (): void{
                    (AppFacade.root as DisplayObject).dispatchEvent(new Event("Core:FurnitureShowEnd"));
                    var flagShipCharaID:int = DataFacade.getUserDeckData().getFlagShipData(1).getCharaID();
                    SoundUtil.playVoice(flagShipCharaID, 1); //コレ!
                    standardAfterInitPort();
                 })
               ).play();
}

SountUtilはCore内で宣言
/Core/common/util/SoundUtil.as 内
SoundUtil.playVoiceから呼び出される SoundUtil.getVoiceURL をチラリ

public static function getVoiceURL(charaID:int, voiceID:int):String{
    var charaKey = null;
    if ((((SettingFacade.IGNORE_SHIP_FILENAME == true)) || ((charaID == 9999)))){
         return ((((((SettingFacade.URLROOT_SOUND + "kc") + charaID) + "/") + voiceID) + ".mp3"));
     };
    charaKey = DataFacade.getStartData().getShipFileName(charaID); //コレ!
    return ((((((SettingFacade.URLROOT_SOUND + "kc") + charaKey) + "/") + voiceID) + ".mp3"));//コレ!
}

DataFacade.getStartData().getShipFileName(charaID)
これは Core/connection/APIConnectionBase.as をみるに
shipgraphと同じ文字列でいけそう
URLROOT_SOUNDもこの辺で宣言されているはずですが、探すまでもなく
/kcs/sound/
なので

http://鎮守府URL/kcs/sound/kc[api_name]/ID.mp3
9999(任務娘)の時だけ注意

*---------------------------------------------------------

***追記!!
api_start2にてapi_mst_shipgraphを取得しているのを確認

#cat shipgraph.json | jq ".[].api_filename" > names.txt

1,snohitatusbk
・・・
これで一発変換できそうです。
一つずつパケット覗くのはかっこ悪いのでスクリプトに落とし込み。

以下自動生成ファイル
整形済み
艦娘統合

◎鯖負荷分散方策
現在の wget と呼び出しと18鯖切り替えをうまい具合に変更

SET "%_WGET%=CALL :SelectServer && wget "
%_WGET%   %BASE_URL%/resources/swf/ships/%3.swf > NUL 2>&1
 展開ーーー> CALL :SelectServer && wget %BASE_URL%/resources/swf/ships/%3.swf > NUL 2>&1 
IF NOT EXIST %3.swf (
    ECHO [ %1 ] = NOT_FOUND
    EXIT /B
)

FOR /F "usebackq" %%h IN (`.¥tools¥md5.exe -n %3.swf`) DO SET HASH=%%h
SET HASH=%HASH:‾0,32%
ECHO  %HASH%
IF "%HASH%" == "%DUMMY_HASH%" (
    ECHO [ %1 ] = DUMMY
    DEL /Q %3.swf
    EXIT /B
)

↓サブルーチンに分離

:SelectServer
SET /A SERVER_RAND_NUM=%RANDOM% %% 18

IF %SERVER_RAND_NUM%==0  (  SET "SERVER_IP=203.104.105.167" )
IF %SERVER_RAND_NUM%==1  (  SET "SERVER_IP=125.6.184.15"    )
IF %SERVER_RAND_NUM%==2  (  SET "SERVER_IP=125.6.184.16"    )
IF %SERVER_RAND_NUM%==3  (  SET "SERVER_IP=125.6.187.205"   )
IF %SERVER_RAND_NUM%==4  (  SET "SERVER_IP=125.6.187.229"   )
IF %SERVER_RAND_NUM%==5  (  SET "SERVER_IP=125.6.187.253"   )
IF %SERVER_RAND_NUM%==6  (  SET "SERVER_IP=125.6.188.25"    )
IF %SERVER_RAND_NUM%==7  (  SET "SERVER_IP=203.104.248.135" )
IF %SERVER_RAND_NUM%==8  (  SET "SERVER_IP=125.6.189.7"     )
IF %SERVER_RAND_NUM%==9  (  SET "SERVER_IP=125.6.189.39"    )
IF %SERVER_RAND_NUM%==10 (  SET "SERVER_IP=125.6.189.71"    )
IF %SERVER_RAND_NUM%==11 (  SET "SERVER_IP=125.6.189.103"   )
IF %SERVER_RAND_NUM%==12 (  SET "SERVER_IP=125.6.189.135"   )
IF %SERVER_RAND_NUM%==13 (  SET "SERVER_IP=125.6.189.167"   )
IF %SERVER_RAND_NUM%==14 (  SET "SERVER_IP=125.6.189.215"   )
IF %SERVER_RAND_NUM%==15 (  SET "SERVER_IP=125.6.189.247"   )
IF %SERVER_RAND_NUM%==16 (  SET "SERVER_IP=203.104.209.23"  )
IF %SERVER_RAND_NUM%==17 (  SET "SERVER_IP=203.104.209.39"  )

SET BASE_URL=http://%SERVER_IP%/kcs
SET DATA_URL=http://%SERVER_IP%/kcs
SET REFERER=http://%SERVER_IP%/

SET HIROUMA2=http://www.darkhorse.mydns.jp/kancolle
EXIT /B

取得のたび、取得サーバを切り替え可能

*---------------------------------------------------------
140 酒匂
169 谷風
173 ビスマルクツヴァイ
181 天津風
182 明石
187 明石改
188 利根改二
189 筑摩改二
313 谷風改
314 酒匂改
316 天津風改

*---------------------------------------------------------
BGMとSEは
kcs/resources/swf/sound_bgm.swf
kcs/resources/swf/sound_se.swf

あと細切れになったデータがいくつか(イベント用?)

*---------------------------------------------------------
家具
/kcs/resources/image/furniture/wall/00X.png
/kcs/resources/image/furniture/floor/00X.png
/kcs/resources/image/furniture/desk/00X.png
/kcs/resources/image/furniture/window/00X.png
/kcs/resources/image/furniture/object/00X.png
/kcs/resources/image/furniture/chest/00X.png

*---------------------------------------------------------
装備
/kcs/resources/image/slotitem/・・・
/kcs/resources/image/slotitem/btxt_flat/

*---------------------------------------------------------
肝心の艦娘画像データですが

private var _shipGraphData:Dictionary;

    public function StartData(){
        super();
        _shipGraphData = new Dictionary();
    }
    public function setData(obj:Object):void{
        var i:int;
        var charaID:int;
        var arr:Array = obj["api_mst_shipgraph"];
        i = 0;
        while (i < arr.length) {
            charaID = arr[i]["api_id"];
            _shipGraphData[charaID] = arr[i];
            i++;
        };
    }
    public function getShipFileName(charaID:int):String{
        if (_shipGraphData.hasOwnProperty(charaID.toString())){
            return (_shipGraphData[charaID.toString()].api_filename);
        };
        return ("");
    }
    public function getShipVersion(charaID:int):int{
        if (_shipGraphData.hasOwnProperty(charaID.toString())){
            return (_shipGraphData[charaID.toString()].api_version);
        };
        return (1);

     }

この辺にそれっぽいことが記述されていますが
今のところスクリプトには落とし込めていません。

((_shipGraphData[charaID.toString()].api_filename)).swf?VERSION=((_shipGraphData[charaID.toString()].api_version))

で良さそうですが obj["api_mst_shipgraph"];は何処… → あった

*---------------------------------------------------------
/kcs/mainD2.swf
/kcs/Core.swf
/kcs/scenes/TitleMain.swf
/kcs/resources/swf/font.swf
/kcs/resources/swf/icons.swf
/kcs/resources/swf/commonAssets.swf
/kcs/resources/swf/sound_bgm.swf
/kcs/resources/swf/sound_se.swf
/kcs/PortMain.swf
/kcs/scenes/SallyMain.swf
/kcs/resources/swf/map/02_03.swf
/kcs/scenes/BattleMain.swf
/kcs/scenes/SupplyMain.swf
/kcs/scenes/RepairMain.swf
/kcs/scenes/ArsenalMain.swf

コメントを追加する