coco漫畫獲取隱藏的圖片鏈接


  1. 網站分析

打開目標網站:https://www.cocomanhua.com/, 隨便打開一部漫畫: https://www.cocomanhua.com/10330/1/205.html

F12 打開工具開始分析

912700fd2806e18cc5afeb173b18fcd9.png

先直接發送GET請求看是否可以拿到圖片的下載鏈接

76fae2d132383d8c65df675781b45457.png

繼續查看源代碼, 找到突破口

13383bfdeaee3b049fda27157fdfa652.png

adac43fae4f483992a26b405ab69659d.png

80ea21b85348fdb49a1b8e615bb841b8.png

4cc46b8c36c88d641cce226a783efe90.png

e6c630f849680bd5786f9c8fc23230cf.png

cc9412602fa017ca4c9e21c38c4347b9.png

2870b61cb4fadbdf518b2cd75fc9c027.png

最后得到一個名為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 ,到這里線索好像就斷了沒什么頭緒那怎么辦?我們再往下看看,有沒有新的發現。

4e8d6f3821d235e69840e0b962d2ee3b.png

再打個斷點調試一下看看,

90c1522d792c20559c9ed8ece310aaa0.png

ba36826882d82a8d19cbcec17941d025.png

兩個字符串一模一樣, 那么和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鏈接:

5dcb859b6b9d7267509db8d718477770.png

//img.cocomanhua.com/comic/10330/Z2hWczlBTFBwQzE2OW1hV2F3UW1LcnBrUzJiLzE2Wkw3YVdjc3FlOTZvYz0=/0002.jpg

只有后面得0001.jpg 變成了 0002.jpg , 可以得到規律,下一張圖片得鏈接就是變成0003.jpg

回頭再看看剛才獲得得mh_info 里面的數據只有一個stratimg,但是發現並不知道每一章節漫畫你一共有多少張圖片?

回到渲染好得頁面看下, 找下突破口。

1c99602a3eff3f21a8e7fcaeb1fd2d94.png

7c6258d3d471309bb3ea00e559fd8411.png

f607320f2f899ca739cae1b3909390fc.png

fd242074d1cf0beaf1efaaece224360a.png

的到結論,總的圖片頁數就

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的代碼

0c3aa260f5d4a96f62b43d5a3ad82877.png

按照分析時候的套路扒到底后得到以下代碼

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);

7a2c81d4cb97e9d2c31018a636ef8d70.png

整理一下得到最后的代碼

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環境,運行看下結果

4739755d99b27242f77428e65529159e.png

 

獲取img_path

483d1cc043f623de46c12d55d4a94f12.png

上面的函數整理一下大概的意思就是

__cdecrypt( __READKEY,CryptoJS.enc.Base64.parse(enc_code2).toString(CryptoJS.enc.Utf8))

不難發現其實就是上面的decode_data函數, 所以最后就是

decode_data(mh_info.enc_code2, "fw125gjdi9ertyui", "")

獲取totalImageCount

b46066561cc7d627b987428007c4d18d.png

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);
}

完整運行一下代碼看下結果

f35d494c7528a4d40f5eef90f57b0e45.png

 

下載圖片

# !/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'))

先運行下代碼看下能不能得到鏈接

fbcec719c2511e70137dc12a79ab0b67.png

最后整合到主程序中運行看下效果

641ac9c1c433c75172612a919632e766.png

5d636b14a4bcb24deceab415dc74747d.png

測試運行一下

17e1a5ff8b667bb1e1fb4d436670e6c1.png

a75fd7ecea6f425b610e66321098d095.png

文章下方直接留言,請在備注中注明轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM