June 3, 2015

製作艦隊收藏(艦これ)外掛 (六) 快速搜尋裝備


目錄


(零) 聲明

此程式僅為個人學習 Python 的實作練習,並藉由此遊戲來分析與驗證網路傳輸行為,所有程式及文章僅為程式學習目的,架設於 Bitbucket 的私人 repository 中,無任何公開、散佈或任何營利行為,

不正ツール使用は規約違反です。お辞め頂けますようお願い申し上げます。 – 艦これ開発/運営 公式ツイート

本人不鼓勵也不贊同於艦これ使用任何形式的外掛或任何不正的工具,使用此類工具違反 艦これ 的 利用規約,並可能導致帳號被永久刪除。

The program was built for Python learning purpose only. Both the source codes and the program are stored in Bitbucket’s private repository. They are not disclosed to anyone in any form. Using such programs violates kancolle’s Terms of Use and may result in a permanent account ban.


(一) 快速搜尋裝備

0. 影片展示、說明

在 Youtube 可選擇 HD 高畫質。

1. 目的

如同影片所示,我們想達成幾個目的:

  • 印出玩家擁有的所有裝備的名稱、數量。
  • 印出玩家擁有的所有裝備的名稱、數量以及持有該裝備的艦娘。
  • 印出玩家擁有的重要裝備的名稱、數量以及持有該裝備的艦娘。

(二) 印出玩家擁有的所有裝備的名稱、數量

1. 分析 API

製作艦隊收藏(艦これ)外掛 (四) 解析 API part I 中提到,當遊戲進入 Start 頁面時,伺服器會傳來下列 JSON:

  • api_start2
  • get_incentive
  • basic
  • furniture
  • slot_item
  • useitem

其中 api_start2slot_item 有我們需要的資訊。

我們要從 api_start2 抓出「官方的裝備資訊」;

然後從 slot_item 抓出「玩家的裝備資訊」。

2. api_start2

api_start2 含有非常多的值,明明是純文字檔案,大小卻高達 1.2 MB。

但是跟艦これ其他 API 一樣,這個 JSON 也充滿了許多無意義的資訊。

我懶得打字了就直接寫結論,我們需要的是 api_mst_slotitem 這個陣列。

api_mst_slotitem 裡面的物件長這個樣子:

        "api_id": 1,
        "api_sortno": 1,
        "api_name": "12cm単装砲",
        "api_type": [
          1,
          1,
          1,
          1
        ],
        "api_taik": 0,
        "api_souk": 0,
        "api_houg": 1,
        "api_raig": 0,
        "api_soku": 0,
        "api_baku": 0,
        "api_tyku": 1,
        "api_tais": 0,
        "api_atap": 0,
        "api_houm": 0,
        "api_raim": 0,
        "api_houk": 0,
        "api_raik": 0,
        "api_bakk": 0,
        "api_saku": 0,
        "api_sakb": 0,
        "api_luck": 0,
        "api_leng": 1,
        "api_rare": 0,
        "api_broken": [
          0,
          1,
          1,
          0
        ],
        "api_info": "旧型の小型砲です。<br>旧型駆逐艦に標準的主砲として搭載..",
        "api_usebull": "0"
      }

我們需要的資訊是:

  • api_sortno:裝備的官方類別,唯一且獨立。
  • api_name:裝備的官方名稱,唯一且獨立。

寫一個簡單的程式去 Parse api_start2,擷取出下列資訊並另存新檔:

{
  "api_mst_slotitem": [
    {
      "api_sortno": 1,
      "api_name": "12cm単装砲"
    },
    {
      "api_sortno": 2,
      "api_name": "12.7cm連装砲"
    },
    ...
    {
      "api_sortno": 42,
      "api_name": "応急修理要員"
    },
    ...
}

如此一來我們就有了所有 裝備的官方類別裝備的官方名稱 的對照表。

3. slot_item

接下來看 slot_item 這個 API,slot_item 紀錄「玩家擁有的所有裝備的資訊」,可惜這些資訊並不如我們想像的有用,必須配合上述 api_mst_slotitem 做轉換才有意義。

slot_item 裡面的物件長這個樣子:

    {
      "api_id": 1,
      "api_slotitem_id": 42,
      "api_locked": 1,
      "api_level": 0
    },
    {
      "api_id": 2,
      "api_slotitem_id": 42,
      "api_locked": 1,
      "api_level": 0
    },
    ...
  • api_id
    • 所代表的意義是:「此帳號中,第幾個入手的裝備。」
    • api_id 從 1 開始往上累加,一次加一,不會往後退。
    • 這個概念跟 Port API 中的 api_shipapi_id 一樣。
    • 為了避免混淆,我在之後的文章會以 裝備的 local ID 稱呼此值。
  • api_slotitem_id
    • 代表「這個裝備所對應的官方類別」。
  • api_locked
    • 代表「這個裝備是否有上鎖(不能廢棄)」。
  • api_level
    • 沒意義,應該又是個多餘的值。

舉例來說,

{
  "api_id": 1,
  "api_slotitem_id": 42
  "api_locked": 1,
  "api_level": 0
}

代表:

  • 這個裝備為此帳號第一個入手的裝備。
  • 這個裝備所對應的官方類別是 42,對照剛剛 api_mst_slotitem 的表格,得知是「応急修理要員」
  • 這個裝備被玩家上鎖,無法直接廢棄。

其中最重要的就是將 api_slotitem_id 對應到 api_mst_slotitem 的過程,了解這個小技巧後,就能印出玩家擁有的所有裝備的名稱、數量


(三) 印出玩家擁有的所有裝備的名稱、數量以及持有該裝備的艦娘

接下來我們想知道「艦娘們分別擁有那些裝備」。

如同前幾篇文章所提,Port API 的 api_shipapi_slot 即是我們想要的資訊。

舉例來說,

      "api_slot": [
        5,
        70,
        113,
        -1,
        -1
      ],

代表:

  • 此艦娘擁有三個裝備,裝備的 local ID 分別是 5, 70, 113。
  • slot_item 裡我們可以用裝備的 local ID 找到其對應的官方類別;
  • api_mst_slotitem 裡我們可以用其對應的官方類別找到其官方名稱。

api_ship 裡面所有艦娘重複上述步驟後,就能夠找出哪些裝備在哪些艦娘身上了。

同理,如果有裝備出現在 slot_item 內,卻不在任何艦娘身上,表示這個裝備閒置中。


(四) 印出玩家擁有的重要裝備的名稱、數量以及持有該裝備的艦娘。

如果我們都已經可以印出「所有」裝備的名稱、數量以及持有該裝備的艦娘,那麼要印出「貴重」裝備,只需要加個 filter 就可以了。

這功能並不難,實作方式也與每個人的程式風格有關,這邊就不多班門弄斧。

建議在實作時能將「分類」功能考慮進去,找裝備時會更快速,詳請可參考我上面的展示影片。


(五) 延伸閱讀