艦娘所有一覧をExcel VBAから作ろう(開発が完了しました編)

艦娘所有一覧をExcel VBAから作ろう(開発開始!!編) – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5112

の続きです。

艦娘所有一覧
http://dunkel.halfmoon.jp/kancolle/index.html

image

艦娘所有一覧に、諜報員でCSVファイルを吐き出した後、Excel VBA で投稿をします。直接投稿すればいいのですが…まあ、Excel VBAで試したかったというところで。

■諜報員でパース

艦これ諜報員が動いている状態で「図鑑表示」から、艦船図鑑の1,2,3をクリックします。このときのレスポンス(/api_get_member/book2)を調べて、所有している艦船を収集します。たぶん、他でもできそうな気もするんですが…ひとまずこれで。

image

諜報員を右クリックして「オプション」を選択した後に「艦娘所有一覧」でOKを押すと、CSVをデスクトップに出力します。ファイルは面倒なので決め打ち。

image

こんな感じで図鑑番号が取れます。

public List<Ship> ParseBook2( string json )
{
    var reader = JsonReaderWriterFactory.CreateJsonReader(
        Encoding.UTF8.GetBytes(json),
        XmlDictionaryReaderQuotas.Max);
    var el = XElement.Load(reader);
    var doc = ExDocument.Load(el);

    var lst = doc * "api_id" != "-1";
    var res = new List<Ship>();
    foreach (var it in lst)
    {
        var pa = it.Parent;
        var ship = new Ship() {
            id = pa / "api_id",
            index_no = pa / "api_index_no",
            ship_id = pa / "api_table_id",
            name = pa / "api_name"
        };
        res.Add(ship);
    }
    return res;
}

JSONをパースしているところの抜粋はこんな感じで。JsonReaderWriterFactory から XElement を使って ExDocument を作るという流れです。ExDoc は、なんとなくイイ感じに XML が扱える自作ライブラリです。XPath でもいいのですが、試行錯誤がやりやすいかなと。

■艦娘所有一覧に投稿する。

このCSVファイルを同梱してある「艦娘所有一覧へ投稿.xlsm」に貼り付けて投稿します。所有一覧のページは、マウスでぽちぽちクリックするのですが、これならば一発で投稿完了…つーか、ぽちぽちクリックしている方が楽しくていい感じがするのですが、まあ、このあたりはプログラマの性ということで。

Private Const url = "http://dunkel.halfmoon.jp/kancolle/index.html"
Public Sub 艦娘所有一覧を投稿()
    Dim ie As New InternetExplorer
    ie.navigate url
    ie.Visible = True
    ' 完了待ち
    While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Wend
    ' optionタグを取得
    Dim doc As HTMLDocument
    Set doc = ie.document
    Dim coll As IHTMLElementCollection
    Set coll = doc.getElementsByTagName("option")
    Dim dic As New Dictionary
    Dim el As IHTMLOptionElement
    For Each el In coll
        dic.Add 0 + el.Value, el
    Next

    ' 図鑑のcellとマッチングさせる
    Dim i
    For i = 2 To 1000
        Dim 図鑑番号
        図鑑番号 = Sheet1.Cells(i, 2)
        If 図鑑番号 = "" Then Exit For
        If dic.Exists(図鑑番号) Then
            Set el = dic(図鑑番号)
            el.Selected = True
        End If
    Next
    ' サブミット
    doc.forms(0).submit
End Sub

Excel VBA の全文はこんな感じです。さっくりと短い感じになっています。これは、yuki(siro) さん のソースがきれい≒操作しやすい、ってのもありますね。option タグが並んで、jQuery で操作しているので、そのあたりを拾い集めればOKです。艦これ諜報員じゃなくても、使えるように別ツールにしてあるので、適当に活用して頂ければと。

■サンプルコード

サンプルコードはこちら http://sdrv.ms/19xmMD0

そのうち、データベース艦これ! にも対応したい。でも、これって母数が不明(失敗は投稿しないだろうから)なので、相対的に特定の艦娘がでやすい、という見方が正しいかも。

カテゴリー: C#, 艦これ パーマリンク