请问可以说一下思路吗?我刚接触这个但也想试着搞一下,从网页上我只知道能弄到swf文件 ![]()
大部分网页的json和alats可以直接下 有些则是打包成了mix文件 下载解压了 都在里面 至于png基本都是可以直接下的 有的是别的格式 需要你转成png 可以在altas用文本打开看到png的名字
请问要怎么批量下载,抓包吗?
浏览器自带F12就行
感谢,我自己试出来了,从h5提取才有spine模型,网页上只有swf的flash文件
大佬,能问问具体提取过程吗?我f12网络监测到两个文件,一个是mix,另一个好像是图片,但是是失效的。mix文件预览全是乱码,直接解压也是失败。怎么处理才能拿到spine
原文件
peticon6305~20211126.zip (1005.4 KB)
-
f12 打开网页自带开发者工具 选择网络
可以看到 预览哪个角色服务器就会发哪个角色的文件

我们将这两个文件存储下来

将mix文件后缀改为zip解压
得到骨架和纹理图集
将图片改为和骨架同名并转成png格式

用文本的方式打开altas 将素材后缀改为png
最后用spineviewer开放
这个spineviewer哪里有啊
这只是一个预览工具git上一堆 spine官网也有
2dWaifuLooker兼容性最多,批量浏览spine方便
批量导出spine动图和将多个spine合并播放好用
上面大佬教程使用的那个Spine-Viewer-Vue观看单个spine和导出图片好用,兼容性略差
我用的是Internet Download Manager
简称idm下载器 直接复制要下载文件的url就可以直接下载
成功了,谢谢大佬
用7z解开了,这里我试的少了
不会啊 我用spine 3.8可以正常打开 live2dEX也可以
前言
因為懶人包很大所以這邊給個選擇 : )
這邊給一個最小的懶人包 aoqi.rar
aoqi.rar (3.0 MB)
資源下載和python腳本批次處理文件都自己整
按目錄編號順序運行python腳本即可
不用下84.7GB的懶人包 : )
下載所有遊戲原始未整理數據 : 28.1GB (最低消費)
mix文件分割完後數據由28.1GB增為50.0GB ( + 21.9GB)
zip解壓縮完後數據由50.0GB增為51.9GB ( + 1.9GB)
webp轉png後數據由51.9GB增為81.9GB ( + 30.0GB)
SPINE文件
mix = zip + webp (where zip = atlas + json)
所以
mix = atlas + json + webp (非官方版skeletonViewer即可開啟) (anosu Spine-Viewer-Vue)
webp 轉成 png (官方版skeletonViewer即可開啟)
這邊解釋為什麼會多那30GB : )
Spine圖片檢查過 , 不用再修改尺寸
python腳本已測試過
到新安裝python的電腦上運行
應該會出現
ModuleNotFoundError: No module named ‘PIL’
表示你執行的 Python 環境裡沒有安裝提供 PIL 套件的模組
嘗試 pip install PIL 會失敗
因為原始的 PIL (Python Imaging Library) 已經停止維護並且不在 PyPI 上發佈
現在要安裝的是其被廣泛使用且維護中的分支 Pillow
套件名稱是 Pillow
匯入時仍然使用 from PIL import Image
更新 pip(建議先更新)
python -m pip install --upgrade pip setuptools wheel
安裝 Pillow(正確套件名稱)
python -m pip install Pillow
常見問題與對應處理
pip 安裝到和你執行 .py 使用不同的 Python
請永遠用 python -m pip install …
這會保證 pip 對應到你用來執行腳本的 Python
教程已寫好 : )
教程圖片和教程詳細文字敘述
需要的工具軟件與python腳本都放在懶人包內
這邊略過工具軟件教程 (詳懶人包內)
Fiddler + Python + EmEditor + 7-zip
Fiddler分析遊戲資源URL
由Fiddler解包分析
可知遊戲資源列表檔案清單
https://aoqi.100bt.com/h5/version~202510101760026048.json
這個json檔案(3444KB) 會不定期更新
並更換日期
2025101017 就是日期
用EmEditor開啟查看
可看到 目錄名稱 + 檔案名稱
搭配Fiddler解包分析URL找出規律
可使用python批次生成下載清單
檔案清單內有目錄名稱 + 檔案名稱
批次在前面加上 https: //aoqi.100bt.com/h5/
即可生成下載URL
舉例 :
目錄名稱 + 檔案名稱
battlebuffer/buffer20461.png
生成url
使用python腳本將json文件生成下載清單
使用python腳本將json文件生成下載清單aoqi_url.txt
python 腳本
讀取目錄下json檔案
這個json檔案
由一連串很長的字串組成
字串頭為 {
字串尾為 }
python腳本功能
首先去除字串 { 與 }
遇到字串 , 先自動換行然後再刪除字串 ,
等所有字串都自動換行完畢後
刪除每一行包含 " 的字串
刪除每一行包含字串 : 後面所有字串)
最後每行字串前面統一加上新字串 https: //aoqi.100bt.com/h5/
並生成aoqi_url.txt 文件
將3個檔案放在同一個目錄下
version~202510101760026048.json
json2url.bat
json2url.py
運行json2url.bat後自動生成aoqi_url.txt
使用wget下載遊戲資源
使用wget下載遊戲資源
將3個檔案放在同一個目錄下
aoqi_url.txt
wget.bat (wget.bat 內部本文 wget -i aoqi_url.txt -c -r -P ./DL )
wget.exe
運行wget.bat後自動開始下載遊戲資源
下載完後資料共28.1GB
子細查看各目錄資源
沒Sound、Voice、BGM等音頻類資源
可能在另外一個清單內
也可能根本沒音頻類資源清單
mix文件組成分析 - 內含圖檔推測
mix文件組成分析
由Google Chrome 開發者模式可知
當讀取角色spine動畫時
spine 圖檔路徑會產生Blob URL
這個不是指向伺服器上的真實檔案路徑
而是瀏覽器讀取到某個檔案內的圖檔資料
存入記憶體再從記憶體讀取出來
使用Fiddler分析
當讀取角色spine動畫時
url只有列出讀取到*.mix文件
沒看到圖檔的url
因此可以確定
spine圖檔就在mix文件裡面
這邊不直接寫png圖檔
是因為後來才發現
mix文件包含的圖檔可能情況
總共有jpg png webp這三大類圖檔
不然我的直覺
Spine角色動畫貼圖一定是png圖檔
mix文件組成分析 - 7zip解壓縮 - spine角色動畫文件分析
使用WinRAR 與 WinZip 開啟mix文件支援效果都沒有7zip好
所以這個遊戲解包使用7zip分析mix文件內容是首要工作
這邊我挑一個包含spine角色動畫mix文件 : peticon2872.mix
mix文件可以使用7zip開啟 (所以mix文件看起來是一個壓縮包)
peticon2872.mix 文件組成
peticon2872.atlas
peticon2872.json
names.txt
但只能解壓縮出spine文件 *.atlas *.json
還有一個_names_.txt 的文件
可以在_names_.txt 內看到記載圖檔的檔名
peticon2872.webp
所以spine角色動畫文件組成
peticon2872.atlas
peticon2872.json
peticon2872.webp
其中peticon2872.atlas
記載使用圖檔
peticon2872.webp
size: 5965,1568
確定Spine動畫使用圖檔類別為webp
並非使用png圖檔
SPINE官方出的 skeletonViewer
只支援PNG圖檔 不支援WEBP圖檔
要支援WEBP圖檔
只能使用網友做的skeletonViewer才行
後面還會提到webp轉png
方便使用SPINE官方出的skeletonViewer開啟
spine目錄mix文件組成分析 - spine角色動畫切片圖檔尋找思考
由Fiddler分析
當讀取角色spine動畫時
url只有列出讀取到*.mix文件
沒看到spine圖檔的url
因此可以確定
spine圖檔就在mix文件裡面
然後由7zip解壓縮mix文件分析後可知
spine動畫使用webp圖檔
問題來了
有讀取到圖檔資料
卻無法解壓縮出來
peticon2872.mix (2163KB)
7zip 只解壓出
peticon2872.atlas
peticon2872.json
names.txt
這3個文件才322KB
很明顯還有東西沒有抽出來 : )
要怎麼抽出來 ?
要怎麼把webp圖檔從mix文件抽出來 ?
spine目錄mix文件組成分析 - spine角色動畫切片圖檔尋找實作
點選peticon2872.mix
滑鼠右鍵
使用EmEditor 以HEX模式開啟mix文件
mix整體檔頭 (6D 69 78)
ZIP檔頭 (50 4B 03 04)
ZIP檔尾 (50 4B 05 06)
WEBP檔頭 (52 49 46 46)
peticon2872.mix = mix整體檔頭 + ZIP檔頭 + ZIP檔尾 + WEBP檔頭
由HEX可以確定MIX文件的確包含了webp圖檔
peticon2872.mix = zip + webp
zip = peticon2872.atlas + peticon2872.json + names.txt
因為ZIP檔尾(50 4B 05 06)在WEBP檔頭(52 49 46 46)前面
所以ZIP壓縮檔範圍並沒有包括webp圖檔
這就是為什麼7zip無法解壓縮出webp圖檔的原因
因此懷疑單純是兩個不同類型的文件"銜接"在一起而已
(9月30日到10月8日思考和測試了幾天才想通)
10月9日到10月11日測試mix文件分割
使用python腳本將peticon2872.mix分割成zip + webp
測試mix文件分割點 :
mix整體檔頭 (6D 69 78) 到 WEBP檔頭前 (不包含 52 49 46 46) 為zip文件數據範圍
WEBP檔頭後 (包含 52 49 46 46) 為webp圖檔數據範圍
10月9日成功分割mix文件為zip壓縮檔 + webp圖檔
zip壓縮檔可以用7-Zip、WinRAR、WinZip開啟成功解壓縮
使用WinRAR與WinZip開啟mix文件效果不好的原因
WinRAR與WinZip會偵測檔尾一定要50 4B 05 06結束
因為mix文件=zip壓縮檔 銜接 webp圖檔
使WinRAR與WinZip直接看到mix文件檔尾
mix文件檔尾 = webp圖檔檔尾
略過mix文件中間夾帶的zip檔尾(50 4B 05 06)
誤判檔尾認為這不是正確zip壓縮檔
而7-Zip容錯率比較高 , 可以忽視檔尾錯誤
所以能開啟解壓縮 , 這是我能想到合理的解釋
webp圖檔也可以正常開啟
webp圖檔成功從mix文件分離出來
這邊也確定後綴的含意(.mix)
mix = 混合
心得 : 這題很趣 : ) 解題過程獲益良多 : )
遊戲沒AB包只有mix文件
mix混合文件包含壓縮檔 + 圖檔
一開始沒想那麼多
我以為到這邊就行了
mix = zip + webp 結案
只要python腳本自動讓各子目錄底下
mix批次分割成zip + webp
python分割腳本實際運行後
發現我錯了 : (
mix = zip + webp
在角色spine目錄mix文件
\h5\peticon\spine
組成是這樣沒有錯
但其他目錄不見得是這樣
於是又再花2天時間思考
如何處理其他目錄mix文件
各目錄mix文件組成分析-1
這邊用9月30日下載的遊戲數據來分析各目錄mix文件組成
使用7-Zip查看mix文件 + EmEditor mix文件HEX分析
花了一些時間確定mix文件組成
version~202509301759166068.json
DL\aoqi.100bt.com\h5,(28.0GB),mix = zip + webp + png + jpg
\h5\activity,(12.0KB),mix = zip
\h5\activityext,(3.49GB),mix = zip or zip + webp
\h5\aoqigrowth,(2.23MB),mix = zip + webp
\h5\aoqih5charge,(164KB),mix = zip + webp
\h5\app,(36KB),mix = zip + webp
\h5\arena,(5.36MB),mix = zip + webp
\h5\arenav2,(4.73MB),mix = zip + webp
\h5\arenav3,(11.6MB),mix = zip + webp
\h5\astrolabe,(1.58MB),mix = zip or zip + webp
\h5\avatar,(148KB),mix = zip + webp
\h5\basis,(147MB),mix = zip + basis
\h5\battle,(5.61MB),mix = zip + webp
\h5\battleaction,(8.93GB),mix = zip + webp
\h5\battlebg,(188KB),mix = zip
\h5\battlebuffer,(4.11GB),mix = zip + webp
\h5\battlechangeavatar,(11.7MB),mix = zip + webp
\h5\battleeffect,(1.84GB),mix = zip + webp
\h5\battlesummon,(52.9MB),mix = zip + webp
\h5\buddy,(8KB),mix = zip
\h5\buddylist,(476KB),mix = zip + webp
\h5\bufferstate,(232KB),mix = zip + webp
\h5\buyback,(68KB),mix = zip + webp
\h5\carnivalrun,(12KB),mix = zip + webp
\h5\carry,(1.11MB),mix = zip + webp
\h5\challengeguide,(16.0KB),mix = zip + webp
\h5\changepetskinv2,(448KB),mix = zip + webp
\h5\changepetskinv3,(11.6MB),mix = zip + webp
\h5\chat,(408KB),mix = zip + webp
\h5\closed,(368KB),mix = zip + webp
\h5\common,(6.01MB),mix = zip or zip + webp or zip + png
\h5\config,(26.0MB),json or aqz = zip
\h5\configfuture,(28.0KB),json
\h5\controlbar,(256KB),mix = zip or zip + webp
\h5\dailytask,(1.93MB),mix = zip or zip + webp or zip + png
\h5\dragonsoul,(1.17MB),mix = zip + webp
\h5\equipment4pet,(1.73MB),mix = zip + webp
\h5\equipment4petres,(63.4MB),mix = zip + webp
\h5\exmonitormore,(8KB),mix = zip + webp
\h5\extmonitor,(36.0KB),mix = zip
\h5\faceview,(1.17MB),mix = zip + webp
\h5\farm,(3.48MB),mix = zip or zip + webp
\h5\fonts,(8.30MB),ttf or aqz = zip
\h5\formation,(1.15MB),mix = zip + webp
\h5\formationpanel,(2.03MB),mix = zip or zip + webp
\h5\formationpanelv3,(6.92MB),mix = zip + webp
\h5\geniusreform,(852KB),mix = zip + webp
\h5\honormedal,(4.10MB),mix = zip + webp
\h5\hud,(0.97MB),mix = zip + webp or zip + png
\h5\interact,(2.28KB),mix = zip + webp
\h5\item,(260KB),png
\h5\jpg,(496KB),jpg
\h5\js,(58.9MB),json
\h5\league,(2.78MB),mix = zip + webp
\h5\legend,(464KB),mix = zip + webp
\h5\library_res,(144KB),mix = zip + webp
\h5\libs,(4.70MB),js
\h5\loader,(692KB),mix = zip + webp
\h5\login,(40.7MB),mix = zip + webp or zip + png
\h5\material,(8.00KB),mix = zip + webp
\h5\materialuse,(400KB),mix = zip + webp
\h5\money,(32.0KB),png
\h5\navigate,(1.53MB),mix = zip + webp + webp
\h5\nicknamecard,(248KB),mix = zip or zip + webp
\h5\nowebp,(290MB),mix = zip + png + png
\h5\npc,(136KB),mix = zip + webp
\h5\npcview,(1.73MB),png
\h5\onepiece,(1.23MB),mix = zip + webp
\h5\petbadge,(1.75MB),mix = zip + webp
\h5\petcollection,(1.03MB),mix = zip + webp
\h5\petevopanel,(2.58MB),mix = zip + webp
\h5\petflaunt,(2.03MB),mix = zip + webp + jpg
\h5\peticon,(7.26GB),png or webp or mix = zip + webp
\h5\petinfo,(5.25MB),mix = zip + webp + webp +webp
\h5\petpackage,(2.98MB),mix = zip + webp
\h5\petwarehouse,(144KB),mix = zip + webp
\h5\petwarehousev2,(200KB),mix = zip + webp
\h5\plantview,(1.48MB),mix = zip + webp
\h5\pokemon,(8.42MB),mix = zip + webp
\h5\prettyimpress,(140KB),mix = zip or zip + webp
\h5\proficient,(160KB),mix = zip + webp
\h5\proficienttreasury,(2.85MB),mix = zip + webp
\h5\promotenewbiev2,(9.62MB),mix = zip + webp
\h5\qualifyingcompetition,(11.8MB),mix = zip + webp
\h5\questionbank,(388KB),mix = zip + webp
\h5\randomguardstone,(124KB),png
\h5\relation,(7.51MB),mix = zip + webp
\h5\ridev2,(1.71MB),mix = zip + webp
\h5\robot,(23.1MB),mix = zip + webp
\h5\sacredequipment,(3.05MB),mix = zip + webp
\h5\scene,(9.32MB),mix = zip + jpg + webp + webp
\h5\secondpassword,(1.39MB),mix = zip + webp
\h5\skin,(44.0KB),mix = zip + webp
\h5\skinicon,(216KB),png
\h5\skintips,(4.16MB),mix = zip + webp
\h5\skinview,(213MB),mix = zip + webp
\h5\spine,(26.9MB),mix = zip + webp + webp + webp
\h5\stargod,(3.08MB),mix = zip + jpg + webp
\h5\stargodres,(6.89MB),mix = zip + webp
\h5\stargodv3,(2.60MB),mix = zip + jpg + webp
\h5\strengthencomboservice,(4.30MB),mix = zip + webp
\h5\summon,(1.30MB),mix = zip + webp
\h5\superstar,(220KB),mix = zip + webp
\h5\survey,(20.0KB),mix = zip + webp
\h5\talk,(120KB),mix = zip + webp
\h5\usercard,(2.16MB),mix = zip + webp
\h5\vip,(380KB),mix = zip + webp
\h5\wealthmanager,(116KB),mix = zip + webp
\h5\yearpayx,(86.3MB),mix = zip + webp + webp
各目錄mix文件組成分析-2
看完各目錄mix文件組成
大致上得到一個結論
mix = zip 壓縮檔 + 圖檔 (多數)
mix = zip
mix = zip + png
mix = zip + webp
mix = zip + webp + jpg
mix = zip + webp +png
mix = zip 壓縮檔 + 其他非圖檔文件 (少數)
mix = zip + basis (basic為二進制文件) (檔案大小不大)
mix文件一定最少含有zip壓縮檔
zip壓縮檔後面多數情況銜接圖檔
圖檔可以銜接另一張圖檔
另一張圖檔可以是不同格式的圖檔
可以很多張圖檔銜接在一起
可以很多張圖不同格式的圖檔銜接在一起
mix文件組成把所有遇到狀況考慮進去後
可以來至制定mix文件分割python腳本
mix文件分割python腳本邏輯分析-1 (有BUG版)
經過多次測試後
找到合理的分割點
mix檔案檔頭(6D 69 78)當分割起始點
這邊不使用ZIP檔頭(50 4B 03 04)當分割起始點
理由1: 一個zip壓縮檔內若有多個檔案 , HEX(50 4B 03 04)也會有多個
理由2 : (6D 69 78) HEX有唯一性 , 整個mix文件找不到第2個HEX
理由3 : (6D 69 78) HEX保留下不影響WinRAR、WinZip、7-Zip解壓縮
理由4 : (6D 69 78) HEX保留下不影響ZIP python腳本批次解壓縮
ZIP壓縮檔與圖檔之間的分割點 : 圖檔的檔頭
圖檔與圖檔之間的分割點 : 後一張圖檔的檔頭
mix檔案檔頭 : 6D 69 78
webp圖檔檔頭 : 52 49 46 46
png圖檔檔頭 : 89 50 4E 47 0D 0A 1A 0A
jpg圖檔檔頭 : FF D8 FF E0 (JFIF標準)
jpg圖檔檔頭 : FF D8 FF E1 (EXIF標準)
jpg圖檔檔頭 : FF D8 FF EE (Adobe標準)
jpg圖檔檔頭 : FF D8 FF E8 (SPIFF格式)
jpg圖檔檔頭 : FF D8 FF DB (Raw Minimal JPG)
jpg圖檔檔頭 : FF D8 FF C0 (Raw Minimal JPG)
其中jpg圖檔檔頭是分割測試失敗幾次後
去查資料後才知道有那麼多種
mix文件分割python腳本邏輯分析-2 (有BUG版)
python 腳本
瀏覽所有子目錄底下 *.mix 檔案
將mix檔案分離成多個檔案
已知mix檔案組成主要分成兩大部份 : zip壓縮檔 + 圖檔
而圖檔類型有 webp、png、jpg
mix檔案分割規則 mix
由檔頭 6D 69 78 開始
到下個圖檔檔頭前為止
可能情況 1
比如 zip壓縮檔 + webp圖檔
從6D 69 78開始
到52 49 46 46之前
不包含52 49 46 46
這一段數據另存成zip文件
可能情況 2
比如 zip壓縮檔 + png圖檔
從6D 69 78開始
到89 50 4E 47 0D 0A 1A 0A之前
不包含89 50 4E 47 0D 0A 1A 0A
這一段數據另存成zip文件
可能情況 3
比如 zip + jpg
這個jpg圖檔是JFIF標準
從6D 69 78開始
到FF D8 FF E0之前
不包含FF D8 FF E0
這一段數據另存成zip文件
可能情況 4
比如 zip + jpg
這個jpg圖檔是EXIF標準
從6D 69 78開始
到FF D8 FF E1之前
不包含FF D8 FF E1
這一段數據另存成zip文件
可能情況 5
比如 zip + jpg
這個jpg圖檔是Adobe標準
從6D 69 78開始
到FF D8 FF EE之前
不包含FF D8 FF EE
這一段數據另存成zip文件
可能情況 6
比如 zip + jpg
這個jpg圖檔是SPIFF格式
從6D 69 78開始
到FF D8 FF E8之前
不包含FF D8 FF E8
這一段數據另存成zip文件
可能情況 7
比如 zip + jpg
這個jpg圖檔是Raw Minimal JPG
從6D 69 78開始
到FF D8 FF DB之前
不包含FF D8 FF DB
這一段數據另存成zip文件
可能情況 8
比如 zip + jpg
這個jpg圖檔是Raw Minimal JPG
從6D 69 78開始
到FF D8 FF C0之前
不包含FF D8 FF C0
這一段數據另存成zip文件
webp、png、jpg 圖檔之間的分割點
選用圖檔文件檔頭當作分割點
jpg圖檔要包含以下幾種檔頭
JFIF標準 : FF D8 FF E0
EXIF標準 : FF D8 FF E1
Adobe標準 : FF D8 FF EE
SPIFF格式 : FF D8 FF E8
Raw Minimal JPG : FF D8 FF DB 或 FF D8 FF C0
然後mix檔案切割出來的zip和圖檔
放在自動生成資料夾內
資料夾名稱同mix檔名
若zip後面無圖檔檔頭
可能的情況 9
這個mix文件到檔尾
只有zip檔案結尾的EOCD
整個mix文件就是單純的zip文件
這一段數據另存成zip文件
可能的情況 10
這個mix文件到檔尾
除了有zip檔案結尾的EOCD
(End of Central Directory)
zip EOCD後面接著其他非圖檔類型文件檔頭
這一段數據另存成bin文件
mix文件分割python腳本 (有BUG版)
將mix_split.bat與mix_split.py
放到整個遊戲目錄最外層
運行mix_split.bat
自動運行mix_split.py
自動開始分離mix文件
以mix原文件名生成新目錄
在新目錄下生成zip、jpg、png、webp
生成新目錄理由是等下還要使用python腳本
批次解壓縮zip , 批次webp轉png , 批次altas文件內容修改
避免生成的文件與原本既有的文件名稱衝突
python腳本運行完畢後
全部目錄文件大小由28.1GB增為50.0GB ( + 21.9GB)
等下還要使用python腳本zip批次解壓縮
文件大小會再增加
10月19日發現少部份webp會分割錯誤
分割成不完整的文件 (1個webp切成2份)
導致後面webp轉成png時發生錯誤
於是腳本重新思考 : )
mix文件分割python腳本邏輯分析 (DEBUG版)
WebP (網路資料)
要安全地從「一個混合檔(mix file)」中切出多張 WebP
不要只用像 VP8 / VP8L / VP8X 這類子 chunk 的標記來分割 — 這些 FourCC
很容易在資料區中誤匹配
正確且可靠的做法是以 WebP的RIFF container 頭(RIFF + size + WEBP)作為切割單位
並且依照 RIFF的size 欄位來計算每張檔案的長度
再做額外驗證(避免誤判)
PNG (網路資料)
要安全且不會出錯地把混合檔(mix file)拆出多張 PNG
不要只靠搜尋 “IHDR” 或 “IDAT” 這類子區塊字串 ——
這些字串可能會出現在資料區中導致誤切
可靠的做法是以完整PNG檔頭(signature)+ chunk 流直到 IEND 來切割
JPG (網路資料)
以 JPEG 的完整檔頭(SOI = 0xFF 0xD8)當作起點
並以完整 JPEG 結束標記(EOI = 0xFF 0xD9)作為終點
但不要只靠單純的 FF D8 → FF D9 搜尋
正確的做法是從 SOI 開始「解析 JPEG 的 marker 流」
直到遇到 EOI(在 SOS/entropy 資料後出現)
這樣可正確處理 byte-stuffing
restart marker 等情形
避免誤切與截斷
ZIP (網路資料)
安全且可靠地從一個混合檔(mix file)裡切出完整的 ZIP 檔案
不要只靠搜尋 PK\x03\x04(local file header)——
因為 PK\x03\x04 在 zip 內會頻繁出現(每個檔案一個 local header)
用它當切點會把一個 zip 切成很多段
正確方法是以 End Of Central Directory (EOCD) 為切割核心
根據 EOCD 內的 central-directory size / offset 推回整個 zip 的起始位置
再以 EOCD(含 comment)確定 zip 的結尾
python腳本
瀏覽子目錄下所有 *.mix 文件
已知mix文件大多數為 zip webp png jpg
和少數二進制文件混合在一起
python腳本自動分析
所有mix文件可能的類型
依照組成順序
嚴謹切割不切錯為主
切割輸出成單一文件
加上相對應的附檔名
mix文件切割時
生成新目錄
新目錄名稱同mix文件
mix文件切割出來的文件都放在新目錄內
mix文件切割出來的bin文件
若切割出來的文件頭為6D 69 78
這屬於mix文件前端一小部分
這小部分捨棄不切割輸出
其他少數二進制文件輸出為bin文件
bin文件名同mix文件
切割輸出的文件名同mix文件
若有多個相同類別文件輸出
切割輸出的文件名同mix文件
加上字串 _1 _2 _3 _4 _5 這樣
並生成切割log記錄
記錄路徑與文件名
mix文件分割python腳本 (DEBUG版)
重新使用新的python腳本
分割文件比較嚴謹
將demix.bat與demix.py
放到整個遊戲目錄最外層
運行demix.bat
自動運行demix.py
自動開始分離mix文件
以mix原文件名生成新目錄
在新目錄下生成zip、jpg、png、webp
生成新目錄理由是等下還要使用python腳本
批次解壓縮zip , 批次webp轉png , 批次altas文件內容修改
避免生成的文件與原本既有的文件名稱衝突
python腳本運行完畢後
全部目錄文件大小由28.1GB增為50.0GB ( + 21.9GB)
等下還要使用python腳本zip批次解壓縮
文件大小會再增加
zip壓縮檔批次解壓縮python腳本
將unzip.bat與unzip.py
放到整個遊戲目錄最外層
運行unzip.bat
自動運行unzip.py
自動對zip壓縮檔批次解壓縮
解壓縮出來的文件放在與mix文件同目錄下
python腳本
瀏覽所有子目錄底下 *.zip 檔案
並自動將zip解壓縮
遇到重複檔名覆蓋原檔
zip解壓縮完畢後
全部目錄文件大小由50.0GB增為51.9GB ( + 1.9GB)
因為zip內文件大小 , 大多數不大的關係
使用空間增加量不多
webp文件名修改符合atlas內容 - 批次處理python腳本思路
因為mix文件內的與zip壓縮檔和圖檔數據是沒有文件名稱的
zip壓縮檔是採用mix文件原名稱 , python腳本自動生成
圖檔名稱是採用mix文件原名稱 , python腳本自動生成
而zip壓縮檔解壓出來的_names_.txt 內有記載圖檔原始文件名
因此以_names_.txt 內原始文件名去對同目錄下圖檔重新命名
符合spine文件要求
names_.txt 內原始文件名同atlas文件內使用圖檔名稱
但有些spine是缺圖的 , 此python腳本會自動略過不處理
圖要自己手動去找或追加
webp文件名修改符合atlas內容 - 批次處理python腳本
將pics_rename.bat與pics_rename.py
放到整個遊戲目錄最外層
運行pics_rename.bat
自動運行pics_rename.py
自動對webp重新命名
全部目錄文件大小維持51.9GB不變
python腳本
瀏覽所有子目錄底下 names.txt 檔案
先讀取 names.txt 本文內字串
比如讀取到本文字串
petflaunt_res_atlas0.webp
petflaunt_res_atlas_q1tdt.jpg
再讀取同目錄下png webp jpg 已存在的圖檔檔名
比如讀取到
petflaunt_res_1.webp
petflaunt_res_2.jpg
無論是哪一種類型圖檔
無論是png webp jpg
檔名都有數字順序標記
比如
_1.png _2.png _3.png _4.png _5.png
_1.jpg _2.jpg _3.jpg _4.jpg _5.jpg
_1.webp _2.webp _3.webp _4.webp _5.webp
在依照txt本文字串順序
所記載圖檔名稱排列順序
對應到已存在的圖檔檔名數字順序標記
將同目錄內圖檔重新命名
重新命名範例
petflaunt_res_1.webp —> petflaunt_res_atlas0.webp
petflaunt_res_2.jpg —> petflaunt_res_atlas_q1tdt.jpg
names.txt 本文內字串
記載圖片數量要與目標修改圖片數量一致
數量不一致則不做修改
副檔名也要一致
副檔名不一致則不做修改
變更紀錄輸出到 rename_log.txt
webp轉png與修改atlas內容 - 批次處理python腳本思路
原由 :
因為SPINE官方版skeletonViewer對於切片圖檔只支持png格式 , 不支持webp格式
所以要將webp轉成png , 連帶atlas本文內字串webp也要改成png
考慮到非官方版skeletonViewer對於切片圖檔已支持webp格式
如 anosu SpineViewer
所以新建目錄保留webp格式
spine文件會分成兩份 , 供不同版本skeletonViewer使用
(1) webp : *.atlas + *.json + *.webp
(2) png : *.atlas + *.json + *.png
原目錄下*.atlas本文內字串修改webp換成png , 輸出生成新的atlas文件 , 放入新目錄內
webp圖檔轉成png格式 , 輸出生成png , 放入新目錄內
複製原目錄下.json 檔 , 輸出生成新的json文件 , 放入新目錄內
webp轉png與修改atlas內容 - 批次處理python腳本
將webp2png.bat與webp2png.py
放到整個遊戲目錄最外層
運行webp2png.bat
自動運行webp2png.py
自動建立新目錄
webp自動轉檔成png
自動修改atlas內容
自動複製json文件
全部目錄文件大小由51.9GB增為81.9GB ( + 30.0GB)
python 腳本
瀏覽所有子目錄底下 *.atlas檔案
讀取 *.atlas檔案
將atlas檔案內本文字串webp改成png
另外生成新的atlas檔案
將新的atlas檔案放入新的目錄內
新目錄名稱使用原始atlas檔案檔名
瀏覽所有子目錄底下 *.webp圖檔
將webp圖檔轉檔成png圖檔
將新的png圖檔放入新的目錄內
目錄名稱使用原始atlas檔案檔名
瀏覽所有子目錄底下 *.json檔案
複製一份json檔案
將新的json檔案放入新的目錄內
目錄名稱使用原始atlas檔案檔名
若atlas檔案內本文無webp字串
則不修改也不生成新的atlas檔案到新的目錄內
則不複製json檔案到新的目錄內
生成log文件記錄無操作的目錄路徑
Spine文件使用skeletonViewer開啟
Spine版本 : 3.6.53、3.8.98
EmEditor 開啟json文件可以查看使用的spine版本號碼
使用官方版與非官方版skeletonViewer皆可正常開啟
若不能開啟 , spine版本正確性之外 , 有很大的機率是缺圖
H5目錄底下主要使用空間較大的子目錄
這也是SPINE文件大部份所在的目錄
activityext 7.52GB (UI圖 精靈圖)
battleaction 33.5GB (戰鬥特效圖 - 物件)
battlebuffer 8.84GB (戰鬥buffer特效圖)
battleeffect 8.08GB (戰鬥特效圖 - 光影)
nowebp 2.90GB (角色SPINE動畫 + 戰鬥特效圖)
peticon 18.9GB (角色SPINE動畫)
查找SPINE所在目錄
可以使用python腳本
運行find_spine_dirs.bat
自動運行find_spine_dirs.py
自動生成find_spine_dirs_result_log.txt
方便查找那個目錄有spine文件
python腳本
瀏覽子目錄下所有檔案
找出同時存在三種類型文件的目錄
並生成log文件
記錄詳細目錄路徑
CASE 1
同一目錄下有這三種文件
*.png *.atlas *.json
log文件記錄 [PNG-SPINE] + 目錄路徑
CASE 2
同一目錄下有這三種文件
*.webp *.atlas *.json
log文件記錄 [WEBP-SPINE] + 目錄路徑
遊戲資源mix包與抽出資源懶人包載點詳情
遊戲資源mix包與抽出資源懶人包
aoqi.100bt.com_20251016_full_work.rar (84.7GB)
Google Drive載點
Mega.nz載點
百度盤載點
我先跪下了











