切換
舊版
前往
大廳
主題

伸摩之塔一抽迎新活動網頁分析結果

晴空和聲 | 2021-08-04 18:25:34 | 巴幣 26 | 人氣 243

其實這次的一抽迎新大家應該都有發現,
就是跟過年期間的bug周年一抽大進化根本是同一個模子吧。

先來說一下MH最近用的網頁框架

自從一抽五選一出包那次可以亂改之後,MH就開始用webpack的網頁框架(同時後台的驗證也有加上了),基本上webpack就是用一些模組化/比較動態的方式開發網頁,然後再把原始檔build成JS、CSS、圖片等靜態資源(不包含HTML)。

所以就是說,全部的網頁版面都是收錄在JS(webpack build出來的bundle)裡面,載入的時候才動態產生DOM,而其他大多互動的javascript也被打包在同一個JS bundle裡面。

當然,每次MH有網頁活動的時候我都會拆來看

就在我檢視API來往紀錄的時候,都發現了連上次的friendChoice(一抽送朋友)的資訊都還在,各個API名稱也一模一樣,於是越想越不對勁,就找出了上次一月一抽大進化的script做比較。(不要問我怎麼拿到的,反正我就拿到了)

這一比較就好玩了

經過研究之後發現,這次的js bundle跟上次的基本上形狀是一模一樣,除了混淆的變數名稱是由webpack產生的會有所不同之外,基本上把卡池與獎勵的資料陣列長度對齊之後,連行數都可以完全match。

這次留下來的還包含但不限於:宣告不能送的蚩尤ID,送給朋友的API呼叫等等。

比對完成之後認為:
這次MH只是把webpack原始檔的送朋友UI那段砍掉、文字和圖片換掉,就這樣又是一個新的活動了。

這時候要幹嘛呢

當然就是要呼叫看看舊的送朋友API看看會不會動啊,順便兌換一下看能不能婊到卡片
但因為之前的送朋友API我沒有留下呼叫格式紀錄,也懶得看被混淆過的script來分析,反正能用最原生的方法就用最原生的,於是我就把舊的JS套到了這次的網頁上。

結果完美運作

可以登入,可以抽那五張,就除了選擇卡片送出的API不相容以外,其他都運作正常,可以操作。

整個UI和圖片都變回一抽大進化的樣子,選擇卡片送出的第一次不相容是因為舊的JS資料裡面沒有定義新的卡片,所以在客戶端就被阻擋下來一次。

這個就把新的卡池資料貼到舊的JS裡面就可以解決,但是選擇卡片的API有更新了,故舊的介面唯一無法做的事情就是選擇卡片。

原本的一抽大進化的選擇卡片API(chooseMonster)是傳送JSON資料回去,格式如下:
{"mosterId": id}

但是新版的長這樣:
{"monsterIds": [id]}

對的,加上複數了,還用陣列儲存資料,可以期待以後的這種活動是可以選擇多於一張的卡片的。

至於選擇API的錯誤訊息,選擇沒有抽到的卡依舊會拿到:
"錯誤的召喚獸,請重新選擇 Wrong monster choice. Please choose again."

但是傳送選擇多於一張的要求,則會得到:
"錯誤的召喚獸數目 Wrong number of monsters"

越看越有趣,看來這次不是非本意搞出來的複數,而是以後真的可能會有多重選取的活動了。

順便說一下,這次的選擇卡片API多檢查了Content-Type標頭,必須是text/json才會給過。

反正妳們也知道,檢查header是什麼樣的存在。

但妳們關心的好像是一抽送朋友對吧

沒錯,UI還原之後送朋友的流程,可以正常操作。
選完自己的第一張之後可以選朋友的第二張,序號也能正常產生,兌換介面也能使用,也會傳回成功訊息,但就是不會進背包,非常可惜

對啦這不是我的主要帳號,怎麼可能那麼歐呢?



我猜測有兩個可能:
  1. 工程師直接把該API操作資料庫的程式片段註解掉了(直升機鴿準備
  2. 背包資料庫格式有改過,舊的API沒有用就沒有維護(比較不可能,畢竟誰也不會想要動祖傳程式碼的大樑
雖然進不了背包,但是從API還是可以照常看到領到了誰的卡,送的卡誰領走了等等資訊。

總之,這次沒有嚴重出包感到很慶幸。

改進方式

我認為改進方向應該要是:
  • 活動過完API就關掉,傳個403、404或是寫一句「活動已結束」都好,到時後哪天真的可以操作就好玩了
  • 或是把API分活動用不同路徑,就算名稱相同換個路徑也好,活動過完就把整個路徑關掉就好
  • 整個網頁只砍UI,後面對應的script都還留著真的有點母湯,要砍就砍乾淨嘛

也說一下MH的API回傳錯誤訊息也有可以改進的地方

MH現在每個API如果傳回錯誤,一率都用HTTP 500(Internal Server Error),但500通常只會出現在伺服器內部發生runtime error的時候。

如果是資料錯誤,應該要用HTTP 400(Bad Request),意思就是要求有錯誤,無法理解。

或是用HTTP 403(Forbidden),代表存取不允許。

4開頭跟5開頭意思差很多,4開頭代表是客戶的問題,5開頭代表是伺服器的問題,但亂傳錯誤資料本身就是客戶的問題吧。

順便一提,本人已經處於半退坑狀況,只有技術上需要拆解的時候才會回來。

創作回應

更多創作