Amd794 发表于 2020-11-8 14:54

coco漫画js逆向分析下载漫画

本帖最后由 Amd794 于 2020-12-14 22:19 编辑


[*]网站分析

打开目标网站:https://www.cocomanhua.com/, 随便打开一部漫画: https://www.cocomanhua.com/10330/1/205.htmlF12 打开工具开始分析
https://image.amd794.com/912700fd2806e18cc5afeb173b18fcd9.png

https://image.amd794.com/912700fd2806e18cc5afeb173b18fcd9.png
先直接发送GET请求看是否可以拿到图片的下载链接

https://image.amd794.com/76fae2d132383d8c65df675781b45457.png
继续查看源代码, 找到突破口








https://image.amd794.com/13383bfdeaee3b049fda27157fdfa652.png
https://image.amd794.com/adac43fae4f483992a26b405ab69659d.png
https://image.amd794.com/80ea21b85348fdb49a1b8e615bb841b8.png
https://image.amd794.com/4cc46b8c36c88d641cce226a783efe90.png
https://image.amd794.com/e6c630f849680bd5786f9c8fc23230cf.png
https://image.amd794.com/cc9412602fa017ca4c9e21c38c4347b9.png
https://image.amd794.com/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 ,这两个是啥?有什么用呢?
到这里线索好像就断了没什么头绪那怎么办?我们再往下看看,有没有新的发现。
https://image.amd794.com/4e8d6f3821d235e69840e0b962d2ee3b.png
再打个断点调试一下看看,发现有段字符串好像看到过。
https://image.amd794.com/90c1522d792c20559c9ed8ece310aaa0.png
https://image.amd794.com/ba36826882d82a8d19cbcec17941d025.png
两个字符串一模一样, 其中mh_info]和mh_onfo联系起来了,好像有那么一点思路了。可以得到图片得地址就是:
' + mh_info['domain'] + '/comic/'+__cdecrypt(_0xad15x7c, CryptoJS]]](mh_info]).toString(CryptoJS].Utf8)) + 0001.jpg
我们点击翻页, 看一下下一张图片得url链接:
https://image.amd794.com/5dcb859b6b9d7267509db8d718477770.png
//img.cocomanhua.com/comic/10330/Z2hWczlBTFBwQzE2OW1hV2F3UW1LcnBrUzJiLzE2Wkw3YVdjc3FlOTZvYz0=/0002.jpg
只有后面得0001.jpg 变成了 0002.jpg , 可以得到规律,下一张图片得链接就是变成0003.jpg
回头再看看刚才获得得mh_info 里面的数据只有一个stratimg,但是发现并不知道每一章节漫画你一共有多少张图片?回到渲染好得页面看下, 找下突破口。
https://image.amd794.com/1c99602a3eff3f21a8e7fcaeb1fd2d94.png
https://image.amd794.com/7c6258d3d471309bb3ea00e559fd8411.png
https://image.amd794.com/f607320f2f899ca739cae1b3909390fc.png
https://image.amd794.com/fd242074d1cf0beaf1efaaece224360a.png
得到结论,总的图片页数就是
if (typeof mh_info] == __Ox97c0e) {
                totalImageCount = mh_info]
            } else {
                totalImageCount = parseInt(eval(base64](__Ox97c0e)))
            }

获取图片下载链接
整理一下思路就是 详情页---->获取C_DATA---->mh_info, 通过enc_code2 获取img_path, 通过enc_code1获取到totalImageCount
开始扒mh_info的代码
https://image.amd794.com/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);
https://image.amd794.com/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环境,安装缺少解密需要的库文件,运行看下结果
https://image.amd794.com/4739755d99b27242f77428e65529159e.png
获取img_path, 开始扒代码
https://image.amd794.com/483d1cc043f623de46c12d55d4a94f12.png
上面的函数整理一下大概的意思就是
__cdecrypt( __READKEY,CryptoJS.enc.Base64.parse(enc_code2).toString(CryptoJS.enc.Utf8))
不难发现其实就是上面的decode_data函数, 所以最后就是
decode_data(mh_info.enc_code2, "fw125gjdi9ertyui", "")
最后再扒一下获取totalImageCount的代码结束分析, 开始爬漫画。
https://image.amd794.com/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_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);
}
封装js代码完整运行一下代码看下结果
https://image.amd794.com/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)
      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'))
先运行下代码看下能不能得到链接
https://image.amd794.com/fbcec719c2511e70137dc12a79ab0b67.png
最后整合到主程序中运行看下效果
https://image.amd794.com/641ac9c1c433c75172612a919632e766.png
测试运行一下
https://image.amd794.com/17e1a5ff8b667bb1e1fb4d436670e6c1.png
https://image.amd794.com/a75fd7ecea6f425b610e66321098d095.png​
完整代码:https://github.com/Amd794/kanleying
图片加载不出来可以看下:https://blog.amd794.com/blog/detail/12

xq2581 发表于 2020-11-8 16:27

能看什么 动

小木曾雪菜 发表于 2020-11-8 17:03

图全都加载不出来

麦子1995 发表于 2020-11-9 08:55

Amd794 发表于 2020-11-9 12:06

麦子1995 发表于 2020-11-9 08:55
楼主,麻烦再次修改下帖子,好多图片都没有出来,想学习下

没有啊, 我看得挺正常的{:301_982:}

1132978402 发表于 2020-11-10 17:25

老哥, 文章真及时啊 刚刚也在分析到 初始化加载了 __cr.init , 然后发现mh_info变量, 后面看到加密的数据又追到了好像是加密的函数, 就晕了 百度一搜找到了你前两天刚刚发的文章,太及时了,多谢分享 多谢

cjm612 发表于 2020-11-11 22:30

还算可以吧!!

254682429 发表于 2021-5-6 08:45

你好 能帮我配置一下吗加一下我   254682429

冬日棉田 发表于 2021-5-11 10:38

感谢,正在学习爬虫中
页: [1]
查看完整版本: coco漫画js逆向分析下载漫画