XIU2 / Yuedu

📚「阅读」APP 自用书源(网络小说)
https://yuedu.xiu2.xyz
GNU General Public License v3.0
8.32k stars 562 forks source link

反馈问题:69书吧 书源故障 #84

Closed lshilshi closed 1 year ago

lshilshi commented 1 year ago

阅读版本

3.23.061518

书源名称

69书吧

问题描述

看到有新镜像站,以为可以免翻,实在很高兴 但是实际连搜索都不能

在翻墙或免翻情况下 调试搜索,都是如下错误提示

java.io.IOException : Android internal error 
at
okhttp3.internal.platfor m.android.Android10SocketAdapter.configureTlsExtensions ( SourceFile : 55 ) 
at 
okhttp3.internal.platfor m.Android10Platform.configureTlsExtensions ( SourceFile : 43 ) 
at 
okhttp3.internal.connection.RealConnection.connectTls ( SourceFile : 74 ) 
at okhttp3.internal.connection.RealConnection.establishProtocol ( SourceFile : 53 )
at
okhttp3.internal.connection.RealConnection.connect ( SourceFile : 183 )
at
okhttp3.internal.connection.ExchangeFinder.findConnection ( SourceFile : 273 )
at
okhttp3.internal.connection.ExchangeFinder.findHealthyConnection ( SourceFile : 1 )
at
okhttp3.internal.connection.ExchangeFinder.find ( SourceFile : 52 )
at
okhttp3.internal.connection.RealCall.initExchange $ okhttp ( SourceFile : 30 )
at
okhttp3.internal.connection.ConnectInterceptor.intercept ( SourceFile : 12 )
at
okhttp3.internal.http.RealInterceptorChain.proceed ( SourceFile : 157 )
at
okhttp3.internal.cache.CacheInterceptor.intercept ( SourceFile : 195 )
at
okhttp3.internal.http.RealInterceptorChain.proceed ( SourceFile : 157 )
at
okhttp3.internal.http.BridgeInterceptor.intercept ( SourceFile : 168 )
at
okhttp3.internal.http.RealInterceptorChain.proceed ( SourceFile : 157 )
at
okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept ( SourceFile : 33 )
at
okhttp3.internal.http.RealInterceptorChain.proceed ( SourceFile : 157 ) at io.legado.app.help.http.t.intercept ( SourceFile : 72 )
at
okhttp3.internal.http.RealInterceptorChain.proceed ( SourceFile : 157 )
at
okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain $ okhttp ( SourceFile : 113 )
at
okhttp3.internal.connection.RealCall $ AsyncCall.run ( SourceFile : 34 )
at
java.util.concurrent.ThreadPoolExecutor.runWorker ( ThreadPoolExecutor.java : 1137 )
at
java.util.concurrent.ThreadPoolExecutor $ Worker.run ( ThreadPoolExecutor.java : 637 )
at
java.lang.Thread.run ( Thread.java : 1012 ) Caused by : java.lang.IllegalArgumentException : Invalid input to toASCII : www _ 69shu _ co m.lnkr.co
at
java.net.IDN.toASCII ( IDN.java : 115 )
at
javax.net.ssl.SNIHostName.< init > ( SNIHostName.java : 99 ) 
at 
com.android.org.conscrypt.Platform.getSSLParameters ( Platfor m.java:187 ) 
at 
com.android.org.conscrypt.ConscryptEngine.getSSLParameters ( ConscryptEngine.java : 525 )
at
com.android.org.conscrypt.ConscryptEngineSocket.getSSLParameters ( ConscryptEngineSocket.java : 186 )
at
okhttp3.internal.platfor m.android.Android10SocketAdapter.configureTlsExtensions ( SourceFile : 14 )...23 more Caused by : The input does not conform to the STD 3 ASCII rules.line : 0.preContext :.postContext : u _ com at android.icu.impl.IDNA2003.convertToASCII ( IDNA2003.java : 218 ) at android.icu.impl.IDNA2003.convertIDNToASCII ( IDNA2003.java : 276 ) at android.icu.text.IDNA.convertIDNToASCII ( IDNA.java : 654 )
at
com.android.icu.text.ExtendedIDNA.convertIDNToASCII ( ExtendedIDNA.java : 50 )
at
java.net.IDN.toASCII ( IDN.java : 108 )...28 more

的确在浏览器模式下,本镜像站是可用的

为什么会出现如上故障?

附加截图

No response

XIU2 commented 1 year ago

我这边现在调试,随便搜了个关键词没有报错。

而且昨天写书源的时候为了把这两个镜像互补搭配(源注释里写了,就是为了降低我整的这个新镜像的流量压力,如果流量耗尽就会关闭),我来回调试了半天,最少测试了几十遍,最后可以确定是完全没问题了,还顺手加了发现规则、搞了搞正文净化。

keai-1989 commented 1 year ago

我也遇到同样的问题,阅读app版本是3.23,但再反复尝试中有一次成功用69书吧的书源更新了。

目前发现,在书源筛选(就是底部菜单栏第二个)里,选69书吧进入类别,里面所有的书都是没问题的,但是书籍搜索就是不行。唯一一次成功的,也具体忘了当时是如何操作。

手机没有科学上网,书籍管理那,也尝试了禁用所有书源只保留69书吧,然后搜索任意书,都不行

XIU2 commented 1 year ago

@keai-1989 没看明白你说的第二段话。。。

我是在书源管理里找到 69书吧,点击其右侧的 选择 搜索,然后输入框里输入关键词或书名搜索即可。 除此之外,也可以在 里选择调试,然后直接在输入框里输入关键词或书名搜索,这样会输出调试结果。

上面这两处,无论是哪个,我这边都可以正常搜索。

keai-1989 commented 1 year ago

@XIU2 刚调试了下还是不行

[00:00.404] java.io.IOException: Android internal error at okhttp3.internal.platform.android.Android10SocketAdapter.configureTlsExtensions(SourceFile:55) at okhttp3.internal.platform.Android10Platform.configureTlsExtensions(SourceFile:43) at okhttp3.internal.connection.RealConnection.connectTls(SourceFile:74) at okhttp3.internal.connection.RealConnection.establishProtocol(SourceFile:53) at okhttp3.internal.connection.RealConnection.connect(SourceFile:183) at okhttp3.internal.connection.ExchangeFinder.findConnection(SourceFile:273) at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(SourceFile:1) at okhttp3.internal.connection.ExchangeFinder.find(SourceFile:52) at okhttp3.internal.connection.RealCall.initExchange$okhttp(SourceFile:30) at okhttp3.internal.connection.ConnectInterceptor.intercept(SourceFile:12) at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:157) at okhttp3.internal.cache.CacheInterceptor.intercept(SourceFile:195) at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:157) at okhttp3.internal.http.BridgeInterceptor.intercept(SourceFile:168) at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:157) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(SourceFile:33) at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:157) at io.legado.app.help.http.t.intercept(SourceFile:72) at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:157) at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(SourceFile:113) at okhttp3.internal.connection.RealCall$AsyncCall.run(SourceFile:34) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) Caused by: java.lang.IllegalArgumentException: Invalid input to toASCII: www_69shu_com.lnkr.co at java.net.IDN.toASCII(IDN.java:115) at javax.net.ssl.SNIHostName.(SNIHostName.java:99) at com.android.org.conscrypt.Platform.getSSLParameters(Platform.java:182) at com.android.org.conscrypt.ConscryptEngine.getSSLParameters(ConscryptEngine.java:525) at com.android.org.conscrypt.ConscryptEngineSocket.getSSLParameters(ConscryptEngineSocket.java:184) at okhttp3.internal.platform.android.Android10SocketAdapter.configureTlsExtensions(SourceFile:14) ... 23 more Caused by: The input does not conform to the STD 3 ASCII rules. line: 0. preContext: . postContext: u_com

at android.icu.impl.IDNA2003.convertToASCII(IDNA2003.java:218)
at android.icu.impl.IDNA2003.convertIDNToASCII(IDNA2003.java:276)
at android.icu.text.IDNA.convertIDNToASCII(IDNA.java:655)
at java.net.IDN.toASCII(IDN.java:108)
... 28 more
XIU2 commented 1 year ago

@keai-1989 你这个调试结果和楼主的一样,但没啥帮助,我也不清楚这个错误是什么意思。

XIU2 commented 1 year ago

你们通过手机浏览器,能打开 https://www_69shu_com.lnkr.co 并搜索吗?

注意,要用使用 WebView 内核的浏览器,比如系统自带的浏览器、Via 浏览器这些,因为《阅读》APP 是依靠 WebView 内核来访问小说网站的,因此使用同一个内核可以避免内核因素干扰。

keai-1989 commented 1 year ago

你们通过手机浏览器,能打开 https://www_69shu_com.lnkr.co 并搜索吗?

不可以

XIU2 commented 1 year ago

浏览器提示什么? 你们是什么运营商?是不是你们的运营商把该域名屏蔽了?你们是移动么?

我是联通,我宽带/流量都能正常访问该网站。

keai-1989 commented 1 year ago

浏览器提示什么? 你们是什么运营商?是不是你们的运营商把该域名屏蔽了?你们是移动么?

我是联通,我宽带/流量都能正常访问该网站。

https://www_69shu_com.lnkr.co/ 可以打开,但无法搜索,显示 :该网页无法正常运作

https://www_69shu_com.lnkr.co/txt/A47994.htm 这样的页面,内容镜像那个倒是能打开

我是电信,用的阿里DNS

是不是搜索页面和内容镜像没能很好的跳转过去?

XIU2 commented 1 year ago

你搜索的关键词是什么?

keai-1989 commented 1 year ago

你搜索的关键词是什么?

灵境行者 还有其他任意字,比如 龙 道士 什么的

XIU2 commented 1 year ago

我试了下,发现我这边也无法访问 https://www_69shu_com.lnkr.co/txt/A47994.htm 这种详情页了(HTTP ERROR 401)...

69 书吧在搜索时,如果是完整书名就会直接重定向至该书的详情页,而因为详情页打不开就出问题了。
但是如果搜索的部分关键词,我这边是能看到搜索结果列表的:

01

然而奇怪的是,我昨天大量调试时,还一切正常,怎么一晚上过去就 G 了。。。

keai-1989 commented 1 year ago

我试了下,发现我这边也无法访问 https://www_69shu_com.lnkr.co/txt/A47994.htm 这种详情页了(HTTP ERROR 401)...

69 书吧在搜索时,如果是完整书名就会直接重定向至该书的详情页,而因为详情页打不开就出问题了。 但是如果搜索的部分关键词,我这边是能看到搜索结果列表的:

01

然而奇怪的是,我昨天大量调试时,还一切正常,怎么一晚上过去就 G 了。。。

所以,大佬,不是我们的问题,而是真不行了哟,嘿嘿嘿

XIU2 commented 1 year ago

研究了几个小时,无法解决该问题,也想了好几种其他方案,但都无法实现,不折腾了。

69 书吧 书源其实从一个多星期以前,我就给改成这个镜像 https://www_69shu_com.lnkr.co 了,一直到昨天都是能用的。也是昨天我看到有人提到 https://d34xj6zzll2cc7.cloudfront.net 于是考虑到降低流量压力,折腾了下把这两个镜像搭配使用(前者只用于搜索,来解决后者搜索完整书名会重定向到被墙的原域名的问题),结果改完之后,过去一晚上莫名就 G 了,白折腾了。。。不知道是不是 69 书吧做了什么限制?还是其它原因,总之我是懒得研究了。。。

看来镜像啥的,还是不能公开使用。。。

另外,更新了该书源,移除了新镜像相关,完全改成 https://d34xj6zzll2cc7.cloudfront.net 了,但也因此无法免翻搜索完整书名了(也意味着无法在已有书籍上换源了,只能要么搜索部分书名,要么手动添加书籍 URL,要么发现里找)。

XIU2 commented 1 year ago

另外,这类镜像是可以 0 成本 + 无服务器 自建的:

当然,这个 www_69shu_com.lnkr.co 镜像不是 Workers 搭建的,而是服务器上搞得,但原理都一样。

注册一个 Cloudflare 账号,整个免费域名添加进去,然后创建一个 Cloudflare Workers 反代即可,每天有 10 万个请求额度,自用完全够了(但要是公开的话就不够了)。 创建后,把这个书源里的 www_69shu_com.lnkr.co 域名替换为自己的域名即可。

[点击展开] - 查看你们反馈该问题时所用的书源 ``` { "bookSourceComment": "", "bookSourceGroup": "", "bookSourceName": "69书吧", "bookSourceType": 0, "bookSourceUrl": "https://www_69shu_com.lnkr.co", "bookUrlPattern": "", "customOrder": 56, "enabled": true, "enabledCookieJar": false, "enabledExplore": true, "exploreUrl": "全部分类::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/0/{{page}}.htm\n玄幻魔法::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/1/{{page}}.htm\n修真武侠::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/2/{{page}}.htm\n言情小说::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/3/{{page}}.htm\n历史军事::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/4/{{page}}.htm\n游戏竞技::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/5/{{page}}.htm\n科幻空间::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/6/{{page}}.htm\n悬疑惊悚::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/7/{{page}}.htm\n同人小说::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/8/{{page}}.htm\n都市小说::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/9/{{page}}.htm\n官场职场::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/10/{{page}}.htm\n穿越时空::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/11/{{page}}.htm\n青春校园::https://d34xj6zzll2cc7.cloudfront.net/ajax_top/12/{{page}}.htm\n完本排行::https://d34xj6zzll2cc7.cloudfront.net/ajax_wanben/{{page}}", "header": "", "lastUpdateTime": 1686879979855, "loginUi": "", "loginUrl": "", "respondTime": 21167, "ruleBookInfo": { "author": "//meta[@property='og:novel:author']/@content", "coverUrl": "//meta[@property='og:image']/@content", "downloadUrls": "", "intro": "//meta[@property='og:description']/@content", "kind": "//meta[@property='og:novel:category']/@content&&//meta[@property='og:novel:status']/@content", "lastChapter": "//meta[@property='og:novel:latest_chapter_name']/@content", "name": "//meta[@property='og:novel:book_name']/@content", "tocUrl": "class.more-btn.0@href##\\/(\\d+)\\/##https://d34xj6zzll2cc7.cloudfront.net/A$1/" }, "ruleContent": { "content": "class.txtnav@textNodes", "nextContentUrl": "", "replaceRegex": "##^  .+|\\(本章完\\)$" }, "ruleExplore": { "author": "", "bookList": "", "bookUrl": "", "coverUrl": "", "intro": "", "kind": "", "lastChapter": "", "name": "" }, "ruleReview": {}, "ruleSearch": { "author": "tag.label.0@text", "bookList": "class.newbox.0@tag.ul.0@tag.li || tag.li", "bookUrl": "class.imgbox.0@href##.+\\/(\\d+)##https://d34xj6zzll2cc7.cloudfront.net/txt/A$1", "coverUrl": "tag.img.0@src", "intro": "class.ellipsis_2.0@text", "kind": "tag.label.1@text", "lastChapter": "class.zxzj.0@tag.p.0@textNodes", "name": "tag.h3.0@tag.a.1@text" }, "ruleToc": { "chapterList": "id.catalog.0@tag.a", "chapterName": "text", "chapterUrl": "href##www\\.69shu\\.com##d34xj6zzll2cc7.cloudfront.net" }, "searchUrl": "/modules/article/search.php,{'charset':'gbk','body':'searchkey={{key}}&searchtype=all','method':'POST'}", "weight": 0 } ```

如果对 69 书吧需求很大,且想要免翻的,有兴趣可以去研究下(具体如何 Workers 反代就自己搜吧,教程很多)。

XIU2 commented 1 year ago

@lshilshi @keai-1989

你们更新书源试试吧(注意是源域名为 https://d34xj6zzll2cc7.cloudfront.net69 书吧 书源)。


因为还是不甘心这两天白折腾,再加上早上头脑清醒冒出了一些新想法,又折腾了小半天,终于完美解决了。 目前该 69 书吧 书源只用到了 https://d34xj6zzll2cc7.cloudfront.net 这个地址。

另外,我顺便看了一下,该域名并非是第三方镜像,而就是 69 书吧 本身,因为 69 书吧 用的是 AWS CloudFront CDN,因此都会被分配一个专属的 XXX.cloudfront.net 域名。

除了这点外,正常的反代/镜像都会替换网页中的 www.69shu.com 域名为自身,而这货竟然没做(前两天我还很纳闷怎么会有这种奇葩反代,这完全没有实用价值呀...),显然不像是个正常的反代/镜像。

lshilshi commented 1 year ago

@lshilshi @keai-1989

  • 已修复:无法搜索完整书名、书籍换源搜不到 等问题,可 免翻 完美使用。

你们更新书源试试吧(注意是源域名为 https://d34xj6zzll2cc7.cloudfront.net69 书吧 书源)。

因为还是不甘心这两天白折腾,再加上早上头脑清醒冒出了一些新想法,又折腾了小半天,终于完美解决了。 目前该 69 书吧 书源只用到了 https://d34xj6zzll2cc7.cloudfront.net 这个地址。

另外,我顺便看了一下,该域名并非是第三方镜像,而就是 69 书吧 本身,因为 69 书吧 用的是 AWS CloudFront CDN,因此都会被分配一个专属的 XXX.cloudfront.net 域名。

除了这点外,正常的反代/镜像都会替换网页中的 www.69shu.com 域名为自身,而这货竟然没做(前两天我还很纳闷怎么会有这种奇葩反代,这完全没有实用价值呀...),显然不像是个正常的反代/镜像。

谢谢你的辛苦付出!因为上gayhub要翻,平时懒得挂T,所以回复的慢,抱歉。 已经注意到你的新书源了,第一时间食用了(没办法,69比墙内的多数笔趣同库,或其它同库书源要完美太多了,没有假更新章节,没太多干扰广告等等)

比一开始的免翻站要完美太多了,不过在我自己手机上(最新阅读的3.x版本下),还是有些许瑕疵,不知道是不是我的特例 1、霸武,开荒著,https://book.qidian.com/info/1033674106/ 在本源上可以搜出结果(以前免翻源里本书搜不出结果),但是点击换源,会提示"www.69shu.com/xx.xx.xx.xx",说明虽然搜索出来了,但是换源时还会切到69shu去

2、巫师:从骑士呼吸法开始肝经验,田隶著,https://my.qidian.com/author/403390573/ 在本源里也搜不到结果(以前免翻源里本书同样搜不出结果),只能挂T搜索和换源

我手机里10+本69站的书,除这2本外,其余免翻表现的确完美 不过以上两种不知道是否为特例,如可以请继续辛苦修复(本人能力有限)

lshilshi commented 1 year ago

另外提供个ip http://182.160.9.195:3002,可直接访问69shu 不过不适用https模式,和免翻存在一样的问题

我不知道怎么好利用这个ip,你看有没有帮助

XIU2 commented 1 year ago

@lshilshi 搜了下 霸武 发现,这个详情页地址中数字前面不是 A,而是 B,从而导致访问 A 又给重定向到 B 的 URL 了。 https://d34xj6zzll2cc7.cloudfront.net/txt/A43276.htm https://www.69shu.com/txt/B43276.htm

巫师:从骑士呼吸法开始肝经验 原因也是一样: https://www.69shu.com/txt/B46063.htm 因为搜索的是完整书名,因此直接重定向至详情页,而我用的是 A,被重定向 B 了,就无法访问了。

搞不懂这个网站的详情页地址规则, 有的是这样: /txt/46957.htm 有的是这样: /txt/A43616.htm 有的是这样: /txt/B43276.htm

因为我前几天调试的时候,只碰到了前两者,试了下发现不带 A 的加上 A 也能访问,因此干脆都给加上 A,结果你告诉我还有 B,难道还有 C 什么的么?(试了下还真是,数字前无字母加上任意一个字母都能打开)。。。

lshilshi commented 1 year ago

@lshilshi 搜了下 霸武 发现,这个详情页地址中数字前面不是 A,而是 B,从而导致访问 A 又给重定向到 B 的 URL 了。 d34xj6zzll2cc7.cloudfront.net/txt/A43276.htm 69shu.com/txt/B43276.htm

巫师:从骑士呼吸法开始肝经验 原因也是一样: 69shu.com/txt/B46063.htm 因为搜索的是完整书名,因此直接重定向至详情页,而我用的是 A,被重定向 B 了,就无法访问了。

搞不懂这个网站的详情页地址规则, 有的是这样: /txt/46957.htm 有的是这样: /txt/A43616.htm 有的是这样: /txt/B43276.htm

因为我前几天调试的时候,只碰到了前两者,试了下发现不带 A 的加上 A 也能访问,因此干脆都给加上 A,结果你告诉我还有 B,难道还有 C 什么的么?(试了下还真是,数字前无字母加上任意一个字母都能打开)。。。

是的,我之前也想过用“http://182.160.9.195:3002”来写书源,遇到类似的问题 也不知道69shu为什么有些书籍还必须跳回去 不过我人能力有限,所以我最后躺平还是等待你们这些大佬的辛勤付出

XIU2 commented 1 year ago

@lshilshi 已更新修复。

这次应该是 真 · 完美解决 了,不过缺点就是,从搜索页/发现页 => 详情页时,会增加一次请求,这也就是意味着使用体验上时间会略微增加一些。


这次更新,其实就是将详情页 URL 获取改成和搜索页 URL 差不多,目前的搜索流程是:

搜索 霸武(或其他不会重定向到详情页的 关键词):

简单来说,搜索时会产生 2 次请求(一次仅头部请求,一次完整请求),然后到获取详情页时,还会再产生 2 次请求(一次仅头部请求,一次完整请求)。

先只获取搜索页的头部信息(不获取网页内容,因此速度更快、更省流量),根据 Location 头部字段判断是否重定向,
发现不包含 Location 头部字段(说明没有重定向到具体书籍的详情页),因此只需要正常访问搜索页 URL 即可(来获取搜索结果列表)
然后选择第一个搜索结果列表,并获得详情页 URL(此时不带字母 /txt/43276.htm)并改一下其中域名
再去获取新的详情页 URL 的头部信息,根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段(.../txt/B43276.htm),于是组合后返回该 https://d34xj6zzll2cc7.cloudfront.net/txt/B43276.htm 详情页地址,
后续就开始解析该详情页了。

搜索 巫师:从骑士呼吸法开始肝经验(或其他会重定向到详情页的 完整书名):

简单来说,搜索时总共会产生 3 次请求(两次仅头部请求,一次完整请求,这个完整请求就是获取详情页的)。

先只获取搜索页的头部信息(不获取网页内容,因此速度更快、更省流量),根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段,说明有重定向到具体书籍的详情页,那么此时需要组合获得新的详情页 URL(此时不带字母 .../txt/46063.htm)
然后再去获取新的详情页 URL 的头部信息,根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段(和前面的区别是从 /txt/46063.htm 变成了 /txt/B46063.htm),于是组合后返回该 https://d34xj6zzll2cc7.cloudfront.net/txt/B46063.htm 详情页地址,
(如果没有包含 Location 头部字段,说明不需要重定向到带字母的 URL,则就直接返回这个不带字母的新详情页 URL 即可
后续就开始解析该详情页了。

当然啦,虽然看着请求数增加了的样子,但实际上只是把原本自动重定向的请求拆分成一个个手动的。 如果使用的是 www.69shu.com 这个原域名的话,其实也差不多,因为使用这个域名搜索完整书源,依然会先来一次请求(算是 1 个头部请求),然后重定向至详情页(1 个完整请求),这样的话就是 2 个请求了,相比起来只是比该书源少了 1 个请求。

lshilshi commented 1 year ago

@lshilshi 已更新修复。

这次应该是 真 · 完美解决 了,不过缺点就是,从搜索页/发现页 => 详情页时,会增加一次请求,这也就是意味着使用体验上时间会略微增加一些。

这次更新,其实就是将详情页 URL 获取改成和搜索页 URL 差不多,目前的搜索流程是:

搜索 霸武(或其他不会重定向到详情页的 关键词):

简单来说,搜索时会产生 2 次请求(一次仅头部请求,一次完整请求),然后到获取详情页时,还会再产生 2 次请求(一次仅头部请求,一次完整请求)。

先只获取搜索页的头部信息(不获取网页内容,因此速度更快、更省流量),根据 Location 头部字段判断是否重定向,
发现不包含 Location 头部字段(说明没有重定向到具体书籍的详情页),因此只需要正常访问搜索页 URL 即可(来获取搜索结果列表)
然后选择第一个搜索结果列表,并获得详情页 URL(此时不带字母 /txt/43276.htm)并改一下其中域名
再去获取新的详情页 URL 的头部信息,根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段(.../txt/B43276.htm),于是组合后返回该 https://d34xj6zzll2cc7.cloudfront.net/txt/B43276.htm 详情页地址,
后续就开始解析该详情页了。

搜索 巫师:从骑士呼吸法开始肝经验(或其他会重定向到详情页的 完整书名):

简单来说,搜索时总共会产生 3 次请求(两次仅头部请求,一次完整请求,这个完整请求就是获取详情页的)。

先只获取搜索页的头部信息(不获取网页内容,因此速度更快、更省流量),根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段,说明有重定向到具体书籍的详情页,那么此时需要组合获得新的详情页 URL(此时不带字母 .../txt/46063.htm)
然后再去获取新的详情页 URL 的头部信息,根据 Location 头部字段判断是否重定向,
发现包含 Location 头部字段(和前面的区别是从 /txt/46063.htm 变成了 /txt/B46063.htm),于是组合后返回该 https://d34xj6zzll2cc7.cloudfront.net/txt/B46063.htm 详情页地址,
(如果没有包含 Location 头部字段,说明不需要重定向到带字母的 URL,则就直接返回这个不带字母的新详情页 URL 即可
后续就开始解析该详情页了。

当然啦,虽然看着请求数增加了的样子,但实际上只是把原本自动重定向的请求拆分成一个个手动的。 如果使用的是 www.69shu.com 这个原域名的话,其实也差不多,因为使用这个域名搜索完整书源,依然会先来一次请求(算是 1 个头部请求),然后重定向至详情页(1 个完整请求),这样的话就是 2 个请求了,相比起来只是比该书源少了 1 个请求。

大佬赛高! 现在目前的确是都能正常使用了,撒花!!

ps: 再麻烦一下,69虽好,但是部分书时效的确差了点 不过内网剩下的那些API源也都不咋样,这中间“番茄小说”还算不错,出现乱码目录和假更新的几率较少

但现在你书源的“番茄小说(https://www.fanqianxs.com)”可以在换源页面正常搜索,也能刷出最新章节,但点击换源就会提示“目录列表为空”,有pc短看网页,目录列表规则“#list dd a”应该是正确的,但不知道为什么就有这个错误 还请你看一下

另外这个“番茄小说(https://www.fanqianxs.com)”和“西红柿小说网(https://www.xhsxsw.com)”应该是一家

XIU2 commented 1 year ago

@lshilshi 刚才发现 69书吧 搜索失效了,检查了下发现了原因:

当初为了提高搜索速度而选择只获取头部,但阅读的 java.head() 函数不支持 POST 提交,于是把 POST 改成 GET 方式,但最近 69书吧 站长可能发现了该情况,不只是出于什么原因而将这种方式禁止了(报错 HTTP 403)。

我刚才给改回 POST 方式了,已经可以正常使用了,你记得更新一下书源,可能会略微增加书源搜索时间,但影响不大。

lshilshi commented 1 year ago

好的,谢谢你的辛苦工作和持续关注!得以免F下使用69。

不过上面我提到的番茄/西红柿站,有空可以看看吗?