Skip to content

规则实战其六:不可能的世界APP

yiranww edited this page Jul 23, 2020 · 9 revisions

关于

不可能的世界官网宣称“中国最大的二次元小说平台”。

需要准备的东西:不可能的世界app、抓包工具(我用的安卓版httpcanary)、亦搜(我用的手机版)。

示例模板套用了已经写好的规则实战其一、其二的内容,示例规则大致类似。做源的过程得到了西红柿大佬和温佬大量的指正,发现规则地址里面的函数原型是西红柿大佬提供,搜索规则地址的模板是温佬提供的,我加以整合,有一些js代码或规则可能有更好的写法,有基础的可以自行优化,反正我做完了能用就满足。本示例没有附图,如果有看的,并且不附图实在看不懂的,我可以在关键的地方加上图片。

基本规则

规则编辑界面有基本规则发现规则搜索规则章节规则正文规则五块可以伸缩的面板,我们按顺序来填。

  • 类型选择文字

  • 名称不可能的世界,也可以随意填,方便自己查找即可。

  • 域名http://inf.8kana.com,地址是抓包的时候取的,后面会说。

  • 作者填什么随意,如果不介意可以填撒旦的微笑,我也不介意。

  • 登录地址字面意思,我没做。

发现规则

  • 首先要打开启用,发现才会生效。同样,关闭后将隐藏该规则。

  • 打开不可能的世界app,开启httpcanary抓包,app没有抓包检测,也没有加密。打开app后,进入'分类',大分类有'VIP'、'付费'、'免费'。选择'免费',下拉刷新。返回httpcanary看抓包数据,排查抓包所得地址,发现地址是http://inf.8kana.com/book/channel,为什么是这个地址,因为它的响应里包含了书籍列表,所以域名就取http://inf.8kana.com,我做的这个源域名用不到。进入抓包记录,查看请求信息,text里找到了请求内容Sex=1&Class0Id=0&VipType=0&SeriesStatus=0&SearchType=1&Page=1&system=android&model=V1813T&deviceNo=866444042975352&UUID=866444042975352&version=61&brand=vivo&resolution=1080*2154,model=V1813T及以后的信息是我的手机信息,可以省略,简化后的请求内容可以是Sex=1&Class0Id=0&VipType=0&SeriesStatus=0&SearchType=1&Page=1&system=android,可以不可以省略的,尝试几次就知道了。

  • 发现地址,通过多次抓包会发现,请求内容里的Class0Id=0指的是免费下的全部Class0Id=1指的是免费下的轻幻想Class0Id=2指的是免费下的重幻想,其他的一模一样,自己慢慢抓。规则用的是地址模板。

@js:
(() => {
function findfuc(pagg){
  var url = "http://inf.8kana.com/book/channel";
  var method = "post";
  var body = "Sex=1&Class0Id="+pagg+"&VipType=0&SeriesStatus=0&SearchType=1&Page=$page&system=android";
  var headers = {
     "content-type":" application/x-www-form-urlencoded; charset=utf-8"
  };
  return JSON.stringify({url, method, body, headers})
}
var 发现=[];
var a=[['全部::','轻幻想::','重幻想::'],['0','1','2']];
for (var i in a[0]){
    发现.push(a[0][i]+findfuc(a[1][i]));
}
return 发现.join("\n")
})();

现在ESO内置了很多get、post请求的模板,可以套用,我习惯用这个模板,至于为什么不在直接用地址而要用这种格式,你可以自己尝试一下直接用地址可以不可以。

  • 列表,查看抓包响应数据,列表规则应为$.data.books

  • 完成列表规则后,可在名称写入$,右上角测试规则,验证返回结果是否有问题。

  • 名称填入$.BookName

  • 作者填入$.AuthorName

  • 标签填入$.Class0Name&&$.ClassName

  • 最新章节没有可不填。

  • 简介填入$.Note

  • 封面填入$.BookCover

  • 结果填入$.BookId。取得书籍id,是一个数字,需要处理成地址,可以在章节列表规则里处理。

以上,是发现规则,没有的可以不填。

章节规则

皇家密探为例,进入书籍的时候,选择开始阅读,找到目录,开启抓包后点击目录,会抓到目录地址http://inf.8kana.com/book/newcatalog,简化后的请求内容BookId=13178&UpdateTime=0&ChapterNo=2413&UserId=&system=android,写法同发现,毕竟都是json的,将其中的书籍BookId=13178替换成BookId=$result,从而拼接成目录地址,请求内容中有个需要注意的地方就是ChapterNo=2413,里面的2413是皇家密探的总章节数,这个不是通用的,每本书的总章节数不同这个数字也会变,这里可以把数字改成0,最终章节规则地址为http://inf.8kana.com/book/newcatalog&BookId=$result&UpdateTime=0&ChapterNo=0&UserId=&system=android

  • 章节列表看抓包响应数据,填$.data.ChapterList

  • 章节名称$.Title

  • 结果填入$.ChapterId。 再次抓包找单章阅读地址,是http://inf.8kana.com/long/readbook请求数据简化后是userId=&bookId=13178&chapterId=105436&lastModifyTim=0&system=android,拼接成完整地址http://inf.8kana.com/long/readbook&userId=&bookId=13178&chapterId=105436&lastModifyTim=0&system=android,用浏览器打开后发现没有数据,仍需要用地址模板处理,用哪个模板处理凭经验,没有经验就一个一个试吧。最终结果规则是:

$.ChapterId@js:
(() => {
 var url='http://inf.8kana.com/long/readbook';
  var method = "post"; // or "post"
  var body ={"userId":"","bookId":lastResult,"chapterId":result,"lastModifyTime":"0","system":"android"};
  var headers = {"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"};
  // var encoding = "gbk";
  return JSON.stringify({url, method, body, headers})

})();

lastResult表示取上一级也就是发现页取得的结果,书籍id也就是$.BookId;result代表前边的刚刚取到的$.ChapterId也就是章节id。

正文规则

-地址规则因为在上面章节规则的结果进行了处理,空着就可以。

-内容通过抓包检查数据,填入$.data.chapters.sections

测试

测试界面右上角是发现测试,点击按钮自动测试规。搜索和发现一样,用的地址模板,搜索地址是:

{
  "url":"http://inf.8kana.com/book/search",
  "method":"post",
"body":"UserId=&Keyword=$keyword&SearchType=3&Page=$page&system=android",
  "headers": {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"}
}

结果

最终结果如下

{"id":"463fd9fd-27b2-402d-9da1-76c1532a8b62","createTime":1595170235305286,"modifiedTime":1595476982224140,"author":"阅读","postScript":"","name":"不可能的世界","host":"","group":"我自己的","contentType":1,"sort":0,"useCryptoJS":false,"loadJs":"","userAgent":"","enableDiscover":true,"discoverUrl":"@js:\n(() => {\nfunction findfuc(pagg){\n  var url = \"http://inf.8kana.com/book/channel\";\n  var method = \"post\";\n  var body = \"Sex=1&Class0Id=\"+pagg+\"&VipType=0&SeriesStatus=0&SearchType=1&Page=$page&system=android\";\n  var headers = {\n     \"content-type\":\" application/x-www-form-urlencoded; charset=utf-8\"\n  };\n  return JSON.stringify({url, method, body, headers})\n}\nvar 发现=[];\nvar a=[['全部::','轻幻想::','重幻想::'],['0','1','2']];\nfor (var i in a[0]){\n    发现.push(a[0][i]+findfuc(a[1][i]));\n}\nreturn 发现.join(\"\\n\")\n})();","discoverItems":"","discoverList":"$.data.books","discoverTags":"$.Class0Name&&$.ClassName","discoverName":"$.BookName","discoverCover":"$.BookCover","discoverAuthor":"$.AuthorName","discoverChapter":"","discoverDescription":"$.Note","discoverResult":"$.BookId","enableSearch":true,"searchUrl":"{\n  \"url\":\"http://inf.8kana.com/book/search\",\n  \"method\":\"post\",\n\"body\":\"UserId=&Keyword=$keyword&SearchType=3&Page=$page&system=android\",\n  \"headers\": {\"Content-Type\":\"application/x-www-form-urlencoded;charset=UTF-8\"}\n}","searchItems":"","searchList":"$.data.Books","searchTags":"","searchName":"$.BookName","searchCover":"$.BookCover","searchAuthor":"$.AuthorName","searchChapter":"","searchDescription":"$.NoteForMobile","searchResult":"$.BookId","enableMultiRoads":false,"chapterRoads":"","chapterRoadName":"","chapterUrl":"http://inf.8kana.com/book/newcatalog&BookId=$result&UpdateTime=0&ChapterNo=0&UserId=&system=android","chapterItems":"","chapterList":"$.data.ChapterList","chapterName":"$.Title","chapterCover":"","chapterLock":"","chapterTime":"$.LastModifyTime","chapterResult":"$.ChapterId@js:\n(() => {\n var url='http://inf.8kana.com/long/readbook';\n  var method = \"post\"; // or \"post\"\n  var body ={\"userId\":\"\",\"bookId\":lastResult,\"chapterId\":result,\"lastModifyTime\":\"0\",\"system\":\"android\"};\n  var headers = {\"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\"};\n  // var encoding = \"gbk\";\n  return JSON.stringify({url, method, body, headers})\n\n})();","contentUrl":"","contentItems":"$.data.chapters.sections","loginUrl":"","cookies":"","viewStyle":2}