Thor过滤器:追书神器fix

文章末尾有录屏

得益于Thor的强大功能,给追书神器添加换源功能,早在一个月前就实现了。从最开始完全搞不懂Thor的用法到现在能完整的写一个过滤器出来还是有很大进步的,刚开始我觉得写一个过滤器需要许多专业知识…然后就退缩了,很长时间没有去理会这个。后来去学Python爬虫的时候发现需要抓包,所以又拿出了这个工具,手机用Thor,电脑用Fiddler,成功的写了几个还算有用的爬虫。

其实吧,使用Thor并不是很难,有耐心就够了,半天就可以熟练使用,但是真要弄出一个过滤器需要分析大量的请求信息,耐心才是最重要的。但是我有点困惑,这玩意!!花了我好多时间,到底有个什么用,哭了…

之前抓过追书神器的很多包了,现在一些常见的接口还是知道,当然,网上有人整理了追书神器的接口啦:Gayhub。不过这些接口没啥用….又不是写爬虫,要这个干嘛!!!

首先创建一个过滤器

没啥特殊的需要的话就用下面的配置就好了,在抓包的协议这块最常见的还是HTTP和HTTPS,而WS这种协议我只在哔哩哔哩的弹幕加载那里看到过(对于爬弹幕这件事没啥兴趣)。匹配HTTP的方法的话也是GET / POST比较常见,当然,抓追书神器的时候还见到了一个OPTIONS方法,下面再说这个方法干嘛用的。还有其他配置先默认设置,还需要修改也只有域名和关键字那一块,填好这一块可以排除许多无用数据包。

1
2
3
过滤器名称:追书神器fix
抓包的协议:HTTP / HTTPS
匹配 HTTP 方法:GET / POST

断点的设置

在Thor里面有一个挂载断点的选项,如果一个过滤器没有断点就相当于没有灵魂(什么鬼…),Thor的强大之处就在于挂载断点,只是抓包的话还有很多其他的软件不比它差。断点的字面意思就是在此处断开连接,比如我打算访问一个网站www.google.com,我就可以用断点设置一个TCP连接前的规则重定向到www.baidu.com,意思呢就是在满足一点条件的情况下可以暂时断开连接然后执行具体的操作,最后再发起请求。当然也可以拦截响应信息体,修改之后再给软件,用的最多的就是这个了。

1
2
3
4
5
6
7
8
9
10
11
断点名称:nullptr
备注:空
命中条件:空(不填的意思就是不需要满足任何条件断点都会被触发)

1.TCP连接前
2.请求头发送前
3.请求信息体发送前
4.响应头回传前

//上面四个就算了,水平不到家,修改那些玩意有点奇怪...
5.响应信息体回传前

实现具体的功能

其实吧,这个东西很简单,特别是追书神器,几乎没啥难度,只要抓包就能找到。书籍信息是存在他们服务器上面的,本地的软件只需要解析就行了,要解析的话就需要数据,而发起请求之后就有响应信息体,在回传的时候可以对其拦截并修改。对于换源功能,其实早期追书神器是都有换源的,后来越做越大,许多书籍不再提供盗版书源,而且加了很多广告…因此一般书能不能换源它应该是写的清清楚楚的,能换源我就开启换源接口,不能换源我就关闭,大概就是这样了。当然,一本书的信息里面是不可能说用中文写着“此书能换源”,可以参考下面一本书的具体信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{
"_id": "592fe687c60e3c4926b040ca",
"longIntro": "大千世界,无奇不有。我陈平安,唯有一剑,可搬山,倒海,降妖,镇魔,敕神,摘星,断江,摧城,开天!",
"title": "剑来",
"majorCate": "仙侠",
"minorCateV2": "古典仙侠",
"creater": "Meizu m1 metal",
"minorCate": "古典仙侠",
"author": "烽火戏诸侯",
"cover": "这里是书籍封面,太长,去掉....",
"majorCateV2": "仙侠",
"isMakeMoneyLimit": false,
"isFineBook": false,
"safelevel": 0,
"allowFree": false,
"originalAuthor": "",
"anchors": [],
"authorDesc": "",
"rating": {
"count": 21686,
"score": 9.405,
"isEffect": true
},
"hasCopyright": true,
"buytype": 0,
"sizetype": -1,
"superscript": "",
"currency": 0,
"contentType": "txt",
"_le": false,
"allowMonthly": false,
"allowVoucher": true,
"allowBeanVoucher": true,
"hasCp": true,
"banned": 0,
"postCount": 53276,
"latelyFollower": 86486,
"followerCount": 0,
"wordCount": 4273279,
"serializeWordCount": 4268,
"retentionRatio": "54.34",
"updated": "2019-05-16T16:03:50.745Z",
"isSerial": true,
"chaptersCount": 552,
"lastChapter": "第八卷 思无邪 第五百四十九章 横剑在膝四顾茫然",
"gender": ["male"],
"tags": ["古典仙侠", "坚毅", "孤儿", "热血"],
"advertRead": true,
"cat": "古典仙侠",
"donate": false,
"_gg": false,
"isForbidForFreeApp": false,
"isAllowNetSearch": false,
"limit": false,
"copyrightDesc": "本书由上海元聚进行电子本制作与发行",
"discount": null
}

其实吧,打开一本书的时候就有这个请求:
https://*.zhuishushenqi.com/book/592fe687c60e3c4926b040ca,域名有变动,固定的是后面的部分,那个字符串是追书神器给书编的id值,用get请求就能得到上面的json数据。基本上一本书的所有数据都在里面了,我们要做的就是在这个数据被追书神器拿到之前对它做一点点的修改即可。

对比了几本书,发现换源功能的开关由"_le": false决定,这个值为false的书不能换源,反之则反。所以在过滤器的响应信息体回传前里面添加一个规则,条件为空,然后添加一个表达式:

1
2
^@rsp.bodyText "_le":false" "_le":true"
^为插入或替换符,@rsp.bodyText表示响应(response)的(body)信息体。

这句话的大概意思呢就是把_le”:false替换成_le”:true,第一个双引号里面写的原值,第二个里面写着替换值。

保存之后开启这个过滤器然后在书架以外的地方打开任何一本书都能看到换源选项,进入阅读之后就可以把Thor关掉了,追书神器就是这么智能,只有刚打开一本书的时候会判断究竟能不能换源….然后有一点是这个抓到的数据包比较多,所以在过滤的基础设置里面的关键字选项添加一个/book,因为每次请求一本书都有这个path,然后其他的数据包都不会抓取,节省空间。

然后咱们要开启vip功能,这里先在关键字选项那里添加一个/user,然后在断点里面再添加一个表达式:

1
2
^@rsp.bodyText "isMonthly":false" "isMonthly":true"
^@rsp.bodyText "monthly":\d+" "monthly":1000000000"

这个也很好抓,在打开追书神器之后就会有这个信息,在个人信息里面。第一个式子的作用和前面那个换源一样,把false改成true,当然这里只改一个是没用的,还需要把monthly修改一下,这个是剩余的天数,这个数字没注意怎么算的,随便打就完事了(可怜我花了12块钱才发现这个数字很大很大),这里保存之后重启追书神器就…广告都没了,暂时就是vip用户了,我大概试了一下,vip用户的功能大概都有,所以…追书神器这个破解真的很简单啊。

有了vip用户就去除了广告,所以就不用分析怎么去广告了(这玩意web选手能做?),vip用户特权里面有一条“免费阅读部分数据”,随便点开一本vip免费阅读的书籍,切换到后面收费章节…提示!!网络错误连接。好吧,不知道怎么搞的,虽然提示我是vip,但是实际上我还是一个假的vip,这个vip真正做到的只有去广告…但是,好像还挺不错的。

但是我想到了一点,追书神器里面书籍分类其实有点多。第一,vip免费读;第二,所有章节免费读;第三,普通用户免费读vip用户免费读的书,但是隔一页一个广告,也就是参合着广告读书;第四,部分章节免费,后面章节收费,vip用户打折购买。

首先,假vip没办法读vip免费读的书,然后也不打折…那我要这个vip有何用…bingo,把所有的书全部搞成免费读且非vip用户免费读,首先,添加两条规则:

1
2
^@rsp.bodyText "allowFree":false" "allowFree":true"
^@rsp.bodyText "allowMonthly":true" "allowMonthly":false"

其中allowFree控制的是该书能不能免费读,当然,把所有书的值都搞成true就行了,然后要把所有的allowMonthly的值改成false,因为前面证明vip是假的,根本没办法读那些包月用户的书籍,所有把这些书搞成不是包月的,同时又是免费的,什么概念呢?就是所有书都变成了可以免费读但是要看广告的那种….前面那个假的vip刚好可以去广告….所有书都是免费读,无广告,不可缓存,正版源…

有什么必要

不是加了一个换源功能吗?还要搞这么多干什么,后面搞那么多其实也就是为了去广告和阅读正版源,如果有钱,何必这么麻烦呢?支持就好了…但是没钱,草…

前面还有说到一个OPTIONS方法,其实就是用在解密这一块,正版源只有部分章节免费,我们请求收费的章节的时候得到的不是章节内容,而是一个混合加密的东西,很长串,而且需要用key去解密。我们用购买,点击广告获得key值之后就有一个OPTIONS请求,然后那串加密文本就解密了,我想大概解密过程还是在服务器段,软件段还是只接受,对于这个请求,没用返回值,得不到章节的真正信息,它就那么突然的解密之后出现在了软件上,不然我可以用爬虫模拟点击广告获得每个章节的key值,然后请求真正的文本信息…真正搞定正版源这一块还是有点不可能的,虽然追书神器的信息结构有点简单,但是章节内容加密只管用那些超强加密方法就行了….前面那个其实算一个取巧过程,不过也挺好的,只是得不到真正的正版源文本有点可惜。

点击观看录像