-
網站分析
打開目標網站:https://www.cocomanhua.com/, 隨便打開一部漫畫: https://www.cocomanhua.com/10330/1/205.html
F12 打開工具開始分析
先直接發送GET請求看是否可以拿到圖片的下載鏈接
繼續查看源代碼, 找到突破口
最后得到一個名為mh_info 的json數據
mh_info = { startimg: 1, enc_code1: "aVp6aWlITE1XcGJmSllMd0Z2NFhIZz09", mhid: "10330", enc_code2: "dzNaUXJ5SXFUangvNFZDQzZPdjRFSGpsMEVyYzdtTFdNMUsyR2pXcHIzWVRuTGxqZlVYTkFwenhxWENDajVrYXlvS0ZOQkV1T0w3N0pDTDFneHhkblpobkwyWWx4ank3c0tCZ3ZDUk05c1k9", mhname: "未婚爸爸", pageid: 2823662, pagename: "二十幾個壯漢", pageurl: "1/205.html", readmode: 3, maxpreload: 5, defaultminline: 1, domain: "img.cocomanhua.com", manga_size: "", default_price: 0, price: 0 };
然后又發現兩個加密的東西enc_code1和enc_code2 ,到這里線索好像就斷了沒什么頭緒那怎么辦?我們再往下看看,有沒有新的發現。
再打個斷點調試一下看看,
兩個字符串一模一樣, 那么和mh_onfo聯系起來了,好像有那么一點思路了。可以得到圖片得地址就是:
' + mh_info['domain'] + '/comic/'+ __cdecrypt(_0xad15x7c, CryptoJS[__Oxa17db[0x4f]][__Oxa17db[0x52]][__Oxa17db[0x51]](mh_info[__Oxa17db[0x1c3]]).toString(CryptoJS[__Oxa17db[0x4f]].Utf8)) + 0001.jpg
我們點擊翻頁, 看一下下一張圖片得url鏈接:
//img.cocomanhua.com/comic/10330/Z2hWczlBTFBwQzE2OW1hV2F3UW1LcnBrUzJiLzE2Wkw3YVdjc3FlOTZvYz0=/0002.jpg
只有后面得0001.jpg 變成了 0002.jpg , 可以得到規律,下一張圖片得鏈接就是變成0003.jpg
回頭再看看剛才獲得得mh_info 里面的數據只有一個stratimg,但是發現並不知道每一章節漫畫你一共有多少張圖片?
回到渲染好得頁面看下, 找下突破口。
的到結論,總的圖片頁數就
if (typeof mh_info[__Ox97c0e[0x0]] == __Ox97c0e[0x1]) { totalImageCount = mh_info[__Ox97c0e[0x2]] } else { totalImageCount = parseInt(eval(base64[__Ox97c0e[0x4]](__Ox97c0e[0x3]))) }
獲取圖片下載鏈接
整理一下思路就是 詳情頁---->獲取C_DATA---->mh_info, 通過enc_code2 獲取img_path, 通過enc_code1獲取到totalImageCount
扒得到mh_info的代碼
按照分析時候的套路扒到底后得到以下代碼
var __READKEY = 'fw12558899ertyui'; var DECRIPT_DATA; try { DECRIPT_DATA = __cdecrypt(__READKEY, CryptoJS.enc.Base64.parse(C_DATA).toString(CryptoJS.enc.Utf8)); } catch (error) { DECRIPT_DATA = __cdecrypt("JRUIFMVJDIWE569j", CryptoJS.enc.Base64.parse(C_DATA).toString(CryptoJS.enc.Utf8)); } eval(DECRIPT_DATA);
整理一下得到最后的代碼
var __READKEY = 'fw12558899ertyui'; function __cdecrypt(key, word) { var key = CryptoJS.enc.Utf8.parse(key); var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return CryptoJS.enc.Utf8.stringify(decrypt).toString() }; function decode_data(C_DATA, key, default_key) { C_DATA = CryptoJS.enc.Base64.parse(C_DATA).toString( CryptoJS.enc.Utf8); try { C_DATA = __cdecrypt(key || __READKEY, C_DATA); } catch (e) { C_DATA = __cdecrypt( typeof default_key === 'string' ? default_key : "JRUIFMVJDIWE569j", C_DATA); } return C_DATA; } var image_info = eval(decode_data(C_DATA));
安裝一下node環境,運行看下結果
獲取img_path
上面的函數整理一下大概的意思就是
__cdecrypt( __READKEY,CryptoJS.enc.Base64.parse(enc_code2).toString(CryptoJS.enc.Utf8))
不難發現其實就是上面的decode_data函數, 所以最后就是
decode_data(mh_info.enc_code2, "fw125gjdi9ertyui", "")
獲取totalImageCount
var __READKEY = 'fw12558899ertyui'; var DECRIPT_DATA; try { DECRIPT_DATA = __cdecrypt(__READKEY, CryptoJS.enc.Base64.parse(mh_info.enc_code1).toString(CryptoJS.enc.Utf8)); } catch (error) { DECRIPT_DATA = __cdecrypt("JRUIFMVJDIWE569j", CryptoJS.enc.Base64.parse(mh_info.enc_code1).toString(CryptoJS.enc.Utf8)); } eval(DECRIPT_DATA);
整理一下就是
decode_data(mh_info.enc_code1)
最后就是合成完整的圖片路徑
var base_URL = 'https://www.cocomanhua.com/' var chapter_data = {} var chapter_image_base_path = base_URL.replace(/:\/\/.+/, '://') + mh_info.domain + "/comic/" + encodeURI(chapter_data .imgpath); chapter_data.image_list = []; for (; image_NO <= chapter_data.totalimg; image_NO++) { var image_url = chapter_image_base_path + (Array(4).join("0") + image_NO).slice(-4) + ".jpg"; mh_info.image_list.push(image_url); }
完整運行一下代碼看下結果
下載圖片
# !/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2020/10/28 15:35 # Author : Amd794 # Email : 2952277346@qq.com # Github : https://github.com/Amd794 import re import execjs from threading_download_images import get_response class CoCoManHua(object): @staticmethod def _cocomanhua(detail_url): response = get_response(detail_url) data = re.findall('var C_DATA.*?\'(.*?)\'', response.text)[0] ctx = execjs.get().compile(open('../js/_cocomanhua.js', encoding='utf-8').read(), cwd='../js/node_modules') images_url = ctx.eval(f'getArr("{data}")') return images_url if __name__ == '__main__': print(CoCoManHua._cocomanhua('https://www.cocomanhua.com/11701/1/188.html'))
先運行下代碼看下能不能得到鏈接
最后整合到主程序中運行看下效果
測試運行一下
在文章下方直接留言,請在備注中注明轉載。