July 2, 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. 影片

所有功能(影片)的合輯:

https://www.youtube.com/watch?v=J5FkO7qKq4c

在 Youtube 可選擇 HD 高畫質。


(二) 程式架構

1. Overview

整個 git 資料夾內容如下圖:

其中 kcClasses 資料夾內容如下圖:

kcScripts 資料夾內容如下圖:

kcScripts 資料夾內的兩個 sikuli 專案內容如下圖:

2. 架構說明

DATA 檔案

JSON 檔案

PY 檔案

資料夾

  • kcAudio - 撥放音效 時會用到的音效。

    • nanodesu.mp3
    • honkiwommiru.mp3
  • kcClasses - 抓取 Port API 時儲存對應資料結構的物件。

    • ship.py - 對應 api_ship
    • ndock.py - 對應 api_ndock
    • material.py - 對應 api_material
    • deck.py - 對應 api_deck_port
    • player.py - 將上述物件資訊整合,提供 Method 給其他 Module 使用,包含 自動維修、進階維修資訊快速更換艦娘、艦隊 等,都透過此 Class 存取 Port API。
  • kcScripts - 存放 各種腳本

    • plan_1_1.sikuli - 自動練等 時的Sikuli project,無大破的話就進擊到底,適用 map1-1, 2-1, 2-2, 2-3。
      • 各種 Sikuli project 判斷所需之圖片。
      • plan_1_1.py - Sikuli project 的主要邏輯。
      • plan_1_1.html - Sikuli project 自動產生的。
    • plan_3_2_1.sikuli - 自動練等 時的Sikuli project,適用 map3-2-1。
      • … (內容跟 plan_1_1.sikuli 類似)
    • auto_repair.py - 自動維修 的腳本。
    • auto_sikuli.py - 自動練等 時用來連接 kcScript 和啟動各 Sikuli project
    • change_ship.py - 快速更換指定艦娘 的腳本。
    • factory_build.py - 快速鍵造 的腳本。
    • factory_uc.py - 提升稀有艦娘裝備的建造成功率 的腳本。
    • refill_fleet_all.py - 快速補給 的腳本。
    • refill_fleet_daily.py - 每日補給 的腳本。

3. 另一個範例

如果看完我寫的這麼多篇文章,還是不知道該怎麼做的話,建議研究一下這個 javascript。

https://github.com/rhenium/kancolle_helper/blob/master/devtools.js

基本上我所做的事情許多原理與他是一樣的,差別在於:

  • 他是用 javascript,我是用 Python。
  • 他是用 chrome.devtools.network.onRequestFinished.addListener(),我是用 dirty hack。
  • 他是用 localStorage,而我是直接 I/O 到檔案。

※ 其實我開始寫外掛前沒有 survey 到這份 code,不然進度應該會快很多。
※ 他 parse API 的方法可能是舊的,可能不適用新的 API。


(三) 心得

1. Python 與愉快的夥伴們

如同最初所提,我當初是為了 練習 Python 才開始寫這個外掛,真正開始用 Python 後才明白為什麼這麼多人喜歡 Python,也更明白 Python 的優缺點

除了 Python 外,對 javascript, JSON, Flash, Chrome Extension, HTTP, 瀏覽器運作等等都有更進一步的認識。

2. Unicode

在擷取 API 的過程中,受盡 Python 2.x 處理 Unicode 字串的苦頭,好不容易搞清楚解決方法後,順便找出以前記錄的 Unicode 資料,重新整理成下列這些文章:

3. OSX 相容性

購買 MAC 至今快要一年,OSX 的確有其優秀之處,但也有些不是很人性的設計,好險有 Homebrew 幫我們解決不少困擾。即使如此,許多在 Unix 和 Windows 上可以輕鬆安裝的東西,到了 OSX 上卻變得很複雜:

4. 英文與日文

英文 對於資工與科技領域而言是個完全 Dominated 的語言,遇到不懂的地方,上 StackOverflow 或丟 Google 查,馬上就可以找到相關資訊,想要哪些 Module 或 Library,國外網站也有許多豐富資料。英文不好的話,完全無法想像找資料要找多久。

日文 在這次的實作過程也意外的重要,我一開始算是被學長拉進來玩艦娘的,老實說不太清楚遊戲規則在幹麻,但花了一整天閱讀 日版的 wiki 資料後,瞬間變成了艦娘專家;也因為會日文的關係,上網可以找到 前人的研究資訊

由於這是日本人寫的遊戲,很多 URL, Method, Variable, JSON Key/Value 都是以羅馬拼音的方式命名,例如 補給 羅馬拼音就是 hokyu

Request URL:http://125.6.189.103/kcsapi/api_req_hokyu/charge

當我看到上面這樣的 url ,就瞬間知道這是補給的 API call。

除了 Request Call 以外,伺服器與客戶端的 API 也有不少變數以羅馬拼音命名,例如 Port API圖鑑 API。因為會日文的關係,這些變數對我而言一眼就了解,不會日文的人可能就還要推敲或建立表格對照。

5. 其他

這次很幸運沒有碰到需要操作記憶體的部分,之後針對這種網頁 Flash 遊戲,可使用新的工具像是 https://github.com/jindrapetrik/jpexs-decompilerhttp://www.showmycode.com/ 來操作看看。


(四) Milestone

關於滑鼠點擊座標偵測 (2015/10/02 更新)

前幾天網路上出現一則貼文,這推文讓我笑了:

我只針對推文部分做回覆,如下:




上圖是我今天登入遊戲的畫面,如圖所示,我沒有被 Ban。

我上網查了一下,推文說的 6/3 的更新 實裝了滑鼠點選座標的監視系統 ,我還真不知道有這個更新,感謝網友讓我長知識。不過就 Flash 而言實作這功能也不難,Flash 本身內建的 API 就可以回報滑鼠點擊位置了。

那為什麼我沒有被 Ban?

因為我的程式在做任何點擊前都會隨機等待一小段時間模擬滑鼠點擊的位置也會有隨機的 offset,為的就是要模仿人類玩家點選時的不規律感。

我沒將這個功能寫在文章裡面不代表沒寫在程式碼裡面啊…

有點躺著也中槍的感覺。

不過如果哪天帳號真的被 Ban 了,我也會更新這篇文章檢討被 Ban 原因,做為以後改進的空間。

Milestone

  • 2015/3 月開始玩艦娘。
  • 2015/3/28 開始寫外掛。
  • 2015/5/31 全部完成。
  • 約耗時兩個月,約 30 小時工作時間。


(五) 延伸閱讀

VoiceTube 看影片學英文