首页 > 其他分享 >js逆向获取小说数据

js逆向获取小说数据

时间:2024-01-08 14:08:03浏览次数:23  
标签:逆向 item url chapterdata js 获取 import replace data


本文仅用于技术交流,不得以危害或者是侵犯他人利益为目的使用文中介绍的代码模块,若有侵权请练习作者更改。

网站链接:

aHR0cHM6Ly93d3cuc2h1cWkuY29tLw==

分析加密

开始的时候直接进入小说正文,打开抓包工具,直接进行检索。我们会发现这是一个ajax请求发送。

js逆向获取小说数据_html

我们查看请求参数,只有这个看起来像是加密过的,我们直接搜索这个sign

 

js逆向获取小说数据_网络爬虫_02

这里边有几个sign,我们依次查找。这里我直接明说吧,最下面的就是结果。但是我还是想按流程给大家跑一下,这样我们面对不同场景的话可以有着自己的分析。

js逆向获取小说数据_网络分析_03

开始调试js代码

打开第一个,打上断点,开始调试。

js逆向获取小说数据_网络爬虫_04

但是你会发现,就算你刷新页面或者是拉到下一章节,他都没有进入调试状态,那么这个加密可能不是我们需要的网络请求中的一个,先筛出他

打开第二个,打上断点,开始调试。

js逆向获取小说数据_js逆向_05

和第一个一样的情况,依旧没有进入调试状态,那么这一个也不是正文请求中携带的参数,现在开始第三个。

js逆向获取小说数据_xml_06

 同样如此,依旧摒弃

但是我们注意到下方有很多个sign,并且是已经赋值的,现在打开其中的第一个。这不就是请求中的参数吗,打工搞成,我们呢现在只需要把这个html页面获取之后进行解析然后就可以解决了。

js逆向获取小说数据_网络分析_07

现在开始解析这个位置,可以通过多种手段,这里我采用的正则

import requests
import json
from lxml import etree
import re
import execjs
headers = {
    'authority': 'www.aliwx.com.cn',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
}

url = "https://www.shuqi.com/reader?bid=7969805&cid=1187207"
html = requests.get(url).text
a_str = re.findall(re.compile(r'dataChapters">(.*?)</i>', re.S), html)[0]
data_info = str(a_str).replace('"', '"').replace('true', 'True').replace('false', 'False').replace('amp;', '')
item = eval(data_info)
data_list = item['chapterList']
info = {
    volumedata['volumeName']: {
        chapterdata['chapterName']: chapterdata['contUrlSuffix'] if chapterdata['isFreeRead'] else None
        for chapterdata in volumedata['volumeList']
    }
    for volumedata in data_list
}


for volumeName, item in info.items():
    for chapterName, url_suffix in item.items():
        if url_suffix:
            print(f'当前进度: {volumeName}, {chapterName}')
            url = f'https://c13.shuqireader.com/pcapi/chapter/contentfree/{url_suffix}'
            results = requests.get(url, headers=headers).json()
            encrypt_data = results['ChapterContent']
        else:
            print(f'收费章节: {volumeName}, {chapterName}')
    break

获得到这个加密数据的话,我们现在需要对正文进行解密,这是代码运行之后的结果,解密的话还是比较简单的。

js逆向获取小说数据_js逆向_08

js逆向获取小说数据_网络爬虫_09

直接搜索这个,找到文件点击进入

js逆向获取小说数据_网络爬虫_10

这边我们发现这个加密后的参数是再这个函数中的,所以可以确定这个函数就是加密参数

js逆向获取小说数据_html_11

开始扣这个函数

js逆向获取小说数据_html_12

扣下来改一下格式

function dt(t) {
    return t = function(t) {
        return t.split("").map(function(t) {
            var e, i;
            return t.match(/[A-Za-z]/) ? (e = Math.floor(t.charCodeAt(0) / 97),
            i = (t.toLowerCase().charCodeAt(0) - 83) % 26 || 26,
            String.fromCharCode(i + (0 == e ? 64 : 96))) : t
        }).join("")
    }(t),
    function(t) {
        var e, i, a, n, r, c, o, s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", d = "", l = 0;
        for (t = t.replace(/[^A-Za-z0-9\+\/\=]/g, ""); l < t.length; )
            n = s.indexOf(t.charAt(l++)),
            r = s.indexOf(t.charAt(l++)),
            c = s.indexOf(t.charAt(l++)),
            o = s.indexOf(t.charAt(l++)),
            e = n << 2 | r >> 4,
            i = (15 & r) << 4 | c >> 2,
            a = (3 & c) << 6 | o,
            d += String.fromCharCode(e),
            64 != c && (d += String.fromCharCode(i)),
            64 != o && (d += String.fromCharCode(a));
        return function(t) {
            for (var e, i = "", a = 0, n = 0, r = 0; a < t.length; )
                n = t.charCodeAt(a),
                n < 128 ? (i += String.fromCharCode(n),
                a++) : n > 191 && n < 224 ? (r = t.charCodeAt(a + 1),
                i += String.fromCharCode((31 & n) << 6 | 63 & r),
                a += 2) : (r = t.charCodeAt(a + 1),
                e = t.charCodeAt(a + 2),
                i += String.fromCharCode((15 & n) << 12 | (63 & r) << 6 | 63 & e),
                a += 3);
            return i
        }(d)
    }(t)
}
function main(data){
    return dt(data)
}

与python联立,解析并输出密文内容

import requests
import json
from lxml import etree
import re
import execjs
headers = {
    'authority': 'www.aliwx.com.cn',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
}

url = "https://www.shuqi.com/reader?bid=7969805&cid=1187207"
html = requests.get(url).text
a_str = re.findall(re.compile(r'dataChapters">(.*?)</i>', re.S), html)[0]
data_info = str(a_str).replace('"', '"').replace('true', 'True').replace('false', 'False').replace('amp;', '')
item = eval(data_info)
data_list = item['chapterList']
info = {
    volumedata['volumeName']: {
        chapterdata['chapterName']: chapterdata['contUrlSuffix'] if chapterdata['isFreeRead'] else None
        for chapterdata in volumedata['volumeList']
    }
    for volumedata in data_list
}

for volumeName, item in info.items():
    for chapterName, url_suffix in item.items():
        if url_suffix:
            print(f'当前进度: {volumeName}, {chapterName}')
            url = f'https://c13.shuqireader.com/pcapi/chapter/contentfree/{url_suffix}'
            results = requests.get(url, headers=headers).json()
            encrypt_data = results['ChapterContent']
            ts = str(execjs.compile(open('D:\桌面\pythoncode\书旗小说逆向\书旗小说.js', 'r', encoding='utf-8').read()).call('main',encrypt_data))
            print(ts)
        else:
            print(f'收费章节: {volumeName}, {chapterName}')
    break

输出结果

js逆向获取小说数据_网络爬虫_13

成功解决,点赞再走吧!

标签:逆向,item,url,chapterdata,js,获取,import,replace,data
From: https://blog.51cto.com/u_16426526/9143883

相关文章

  • 某省资源交易中心 (js逆向)
    该文章只是用于逆向学习,不得以商用或者是破坏他人利益的目的进行使用。如有侵权请联系作者。网站链接:bse64aHR0cHM6Ly9nZ3p5ZncuZnVqaWFuLmdvdi5jbi9idXNpbmVzcy9saXN0Lw==分析环节进入网站进行翻页请求时我们会发现改请求时ajax请求。这里,我们可以直接看一下请求参数和返回结果,以......
  • 猿人学12 13 简单的js逆向
    解题过程通过网络抓包工具找到请求页 观察参数,我们会发现中间有一个m是被加密过的由于请求是ajax请求直接进行xhr断点找到m被加密的位置我们发现他的加密是使用btoa函数将页数和yuanrenxue结合加密的。而这个函数在js中是一个内置函数,是通过编码的方式进行加密,所以只需要在js文件......
  • 逆向微博热搜时光机(js逆向)
    直接分析,我们需要先查询一下网络请求的方式,通过使用反页请求,我们可以知道这个时光机的本质上是通过ajax请求进行的数据传输,所以这里我们可以减少查询的范围,可以直接调试查找XHR类型的数据传输内容,这里我推荐大家使用翻页后的数据查询,主要是为了鉴定一下该参数的携带加密位置(timeid......
  • 猿人学第一题 js混淆 双重加密(详解)
    当我们点击分页的时候可以确定这个请求过程是ajax请求,所以直接使用抓包工具找到储存信息的请求。找到这个请求之后,我们明显发现?后面的参数m是一个加密过的由于这个请求属于ajax请求,现在我们可以直接使用xhr断点调试找到位置打上断电之后直接分页请求。进入调试直接在右边堆栈中开......
  • #星计划#OpenHarmony轻量系统-获取当地时间
    前言在轻量设备里面,我们常常需要获取本地时间,用于时间显示,log记录,帮助RTC芯片纠正时间等等。我们在之前设计了一个智慧时钟,需要使用到本地当前时间,因此本篇文章想在OpenHarmony上实现SNTP获取本地时间,并将此功能集成为一个模块,便于我们的主程序调用。环境OpenHarmony3.1润和his......
  • 使用Jsoup的Java网络爬虫示例:抓取在线考试平台试题数据
    网络爬虫是一种强大的工具,用于从互联网上收集信息。而在Java中,Jsoup是一款常用的HTML解析库,提供了便捷的API来解析、提取和操作HTML数据。在本文中,我们将深入探讨如何利用Jsoup库构建一个Java网络爬虫,并使用代理服务器来抓取在线考试平台的试题数据。介绍Jsoup和网络爬虫首先,我们将......
  • Lua网络爬虫实战:使用http服务器获取虾皮商品信息的全过程
    这段Lua代码是一个简单的爬虫示例,使用了Lua中的http模块进行网络请求,并设置了代理信息。以下是对代码的一些解释和注意事项:安装http模块:luarocksinstallhttp这个命令用于安装Lua的http模块,以便在程序中使用HTTP请求功能。代理设置:localproxy_host="www.duoip.cn......
  • 基于Go语言的简单网络爬虫示例:获取智联招聘网页内容
    发起HTTP请求:使用Go的net/http包发起HTTP请求以获取网页内容。解析HTML内容:使用HTML解析器(如Go的golang.org/x/net/html包)来解析网页内容,找到你感兴趣的信息。提取目标数据:通过使用正则表达式或者更好的选择是HTML解析库来提取所需信息。存储或处理信息:将提取的信息存储到文件、数......
  • # yyds干货盘点 # 想要获取某某查上面网址这个数据获取怎么获取呀?超好用工具分享!
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python网络爬虫的问题。问题如下:大佬们想要获取某某查上面网址这个数据获取怎么获取呀为什么返回的源码就这一点 有没有什么比较好上手的工具啥的页面图:网络爬虫结果:二、实现过程这里【黑科技......
  • JS加密/解密之常见的JS代码加密
    在软件开发领域,混淆(JS)是一种常见的技术,通过改变代码结构、命名和逻辑,增加代码的复杂性,使其对于逆向工程者变得更加困难。然而,有时候开发者可能需要解开混淆,以便理解、维护或修改代码。在本文中,我们将简要讨论一些可能用于obfuscated代码解密的基本逻辑。JS解密的基本思路JS代码......