Predidit / Kazumi

基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

clicli更新之后ios用不了,但之前可以

Rstoroniomi opened this issue · comments

我开的是软件解析

@ErBWs

我没有测试设备,这个问题存在吗

是的

好像确实无法播放,安卓可以播放,macOS 和 iOS 都不能播放

怀疑又是证书问题,浏览器能访问吗

怀疑又是证书问题,浏览器能访问吗

@Predidit

看起来可能与 JavaScript 没有正确将信息传给 Flutter 有关,这样的改动可以正常解析:

webview_controller_impel.dart 中 204,208 行代码分别修改为:

204: VideoBridgeDebug.postMessage('The number of video tags is' + videos.length);
208: VideoBridgeDebug.postMessage(src);

确定这样修改后会解决问题吗。这会破坏android解析器吗。

这两行代码是为了解决从双层iframe向上传递消息的问题,理论上我们无法从这种双层嵌套的iframe中直接调用Dart-JS桥。所以才用了现在这种在iframe外部注册handler,层层抛出的写法。

我也担心这种问题,我不是很能看懂这部分代码,我试试看构筑一个安卓版本进行测试

看起来不会破坏安卓构建,另外是否有 blob 资源示例?我不清楚是否应该将 addBlobParser 中的调用也进行修改

我的意思是这是否会让 clicli 在 android 上不工作。

可以使用 girlgirilove 测试 blob

不会不工作

我会在明天测试这部分代码,这部分代码的逻辑比较复杂。

PR的提交可以暂缓,如果我们可以确定新版的 webview 插件在双重iframe下可以正确调用 dart-JS 桥的话,部分逻辑可以大幅简化。

此外我想知道除了 clicli 外,还有在 android/iOS 上表现出明显差异的规则吗。

此外我想知道除了 clicli 外,还有在 android/iOS 上表现出明显差异的规则吗。

目前没有

另外这似乎能解释为何我在 macOS 上始终无法解析 girlgirlLove,但按照上述修改后仍然无法解析,或许还有更复杂的原因

这个问题诡异的地方在于 webview_flutter 是 flutter 的官方实现,支持 android/iOS/macOS。 理论上这种第一方插件不会出现明显的平台相关的差异。

我个人怀疑是这三个平台的 webview 安全策略不同,可能需要在更合适的地方用更合适的方法进行 dart-JS 通讯。

girlgirilove 在 iOS 上可用吗,除了 clicli 和 girigiri 还有规则表现出平台相关的差异吗。

iOS 上可用,复现 #226 的错误时就需要使用 girlgirlLove,其他的规则看起来没有什么差异

我怀疑 clicli 的问题来自 iframe 内外之间的消息通道

在 iOS/macOS 上 webview_controller_impel.dart 208行和204行发送的消息应该在281行被接收被调用 VideoBridgeDebug 通过 Dart-JS 桥传递给 flutter

你可以尝试确定消息传递在哪一环节出了问题吗

可能和 addInviewIframeBridge 函数的调用位置有关,插入在 140 行之后可以正常解析

原来的调用位置在 43 行,也许我们可以在 addInviewIframeBridge 函数内部打印日志或设定断点,来确定其是否被正确调用,以及调用时机

omofunz和FQDM也看不了,一直是解析视频失败

放在 43 行时只会被调用一次,可能这是导致无法正确传递消息的原因

pekolove也是,ios只能看几个,太有限了

eventListener 没有必要被多次加载,其在每次 URL 改变后加载一次就可以了。

那么我们只能怀疑在 37 行处注册的回调在 macOS/iOS 上的执行时机存在问题,可能在页面完全加载完成后,而不是页面开始导航时执行。

如果是这样的话,除了影响 clicli 规则的 addInviewIframeBridge 调用,影响 girigirilove 规则的 addBlobParser 调用可能也有问题。

也许我们可以尝试在代码中打印一些调试信息来验证具体的执行顺序。但是我这边并没有 macOS/iOS 设备可供测试。

@Rstoroniomi 这个问题一直存在还是在特定版本后出现的

一直有

不管开了软解还是硬解

一些猜测。这些加载不了的网站,clicli 可能是注册的回调问题,omofunz、girlgirlLove、fqdm 都添加了 debugger 阻止你对网页进行调试,而 pekolove 是直接禁止 f12 打开控制台,pekolove 在安卓端也无法被正常解析

kazumi 没有使用 chrome 调试协议,只是用了一些 JS 魔术。这和网页前端的反调试没有关系。

如何和网页前端反调试相关的话,不会表现为平台相关。pekolove 可能是网页结构变了,我看看。

pekolove 是视频编解码格式的问题,启用软件解码在 Android 上可以播放。

其他的应该是上面提到的回调注册时机的问题。

我完全无法找到解决办法,JS 代码在浏览器中始终运行良好,但我不知道如何确定 flutter 中的运行情况

我尝试在 278 行后增加 VideoBridgeDebug.postMessage('triggered'); 但完全看不到输出

我们可以在278行前后,在 webviewController!.runJavaScript 调用的外部,使用 debugPrint 直接在 dart 端的控制台打印调试信息。而后在 190 行调用 webviewController!.runJavaScript 方法前同样打印调试信息,这样我们就可以知道他们在时域上的关系。

按照这种方法可以获得这样的信息:

flutter: Current URL: https://www.clicli.pro/video/1470/1-1.html
flutter: listener start

flutter: listener start end
flutter: parse start
flutter: JS Bridge: The number of iframe tags is2
flutter: VideoJS Bridge: The number of video tags is0
flutter: parse end
flutter: parse start
flutter: JS Bridge: The number of iframe tags is3
flutter: VideoJS Bridge: The number of video tags is0
flutter: parse end
......
flutter: -- VideoModule DISPOSED
flutter: Current URL: about:blank
flutter: listener start
flutter: listener start end

看上去执行顺序没有问题。

真奇怪,有明显的出现此问题的版本上的分界点吗,还是一直存在。也许我应该翻一下 webview_flutter 的更新日志。

我不清楚,clicli 规则更新前一直可以使用

感觉问题还是 parent.postMessage ,能解析的规则都是不需要使用 foreach(iframe) 内代码进行解析的,而 clicli 需要。

blob资源的处理代码我看不懂,不知道为什么 macOS 和 iOS 表现不一样,左边是 macOS,右边是 iOS

image

我觉得现在ios一大半都看不了了

我都是一个一个试的

@ErBWs

这个日志好像告诉了我们问题在哪,我注意到这个日志中来自 VideoJS Bridge 的日志的内容似乎反映了一种类型转换错误。

videos.length 是 b0 b1 这样的非整数,而 JS Bridge 的内容是正常的,此外我在正常工作的 Android 设备上没有发现这一类型转换错误。

我想我们可以这样先排查问题

在 JavaScript 代码中基于 videos.length 的循环体开始前,和循环体中通过 JSBridge 来传递调试信息,确定这一循环是否正确进行。如果 videos.length 是 a0 b1 这样的怪东西,而不是一个正常的整数,循环体当然会被跳过。

如果我们能确认 videos.length 的数据类型有问题的话,我们可以解决这一问题。

blob 的处理代码是一些 JavaScript 魔术,我们可以稍后讨论。

a,b 是我为了区分这个数字是从哪里获取的而增加的一个标志,造成了一些误解,我前面应该描述的更详细些
image

这样的改动能解决大部分问题吗,还是只能解决 clicli 的问题,如果这一改动可行,我们可以使用这一改动并弃用 addInviewIframeBridge 调用。

addInviewIframeBridge 调用在 android/iOS/macOS 上似乎不是必要的,但在 windows/Linux 上是必要的。

pekolove,fqdm,girlgirlLove 好像都是 blob 资源,omofunz 我浏览器也打不开,macOS 都打不开但是 iOS 都能打开。

iOS 上能否打开感觉更主要是网络原因,是否修改都有可能 能打开 或 不能打开

我这边测试下来问题都是 macOS 侧 blob 资源的问题,只有 clicli 是 macOS/iOS 都有的问题

macOS 的 wkwebview 和系统代理有奇怪的交互,可以试试禁用代理后有无问题

看起来没有什么区别。

我看了一下文档。

使用 onPageStarted 来替代 onUrlChange 可以缓解问题吗

我怀疑Bolob Parser 中的 JS Hook 没有正确生效,它需要非常非常早的执行时机。

我昨天试着替换过,好像没有变化,不过有必要再确认一下

看起来确实没有变化

一个可能相关的问题,这个 error 有时出现有时不出现,iOS 有时候提示了这个 error 但也同样可以解析

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 
PlatformException(FWFEvaluateJavaScriptError, Failed evaluating JavaScript., A JavaScript exception occurred
(WKErrorDomain:4:{WKJavaScriptExceptionLineNumber: Unsupported Type: 0, WKJavaScriptExceptionMessage:
SyntaxError: Can't create duplicate variable: '_r_text', NSLocalizedDescription: A JavaScript exception occurred,
WKJavaScriptExceptionColumnNumber: Unsupported Type: 0}), null)

这是为 const 类型变量重复赋值所导致的错误。

blob 解析器中将未被hook的原始函数储存为 const 类型变量。

理论上每次url改变会重置全局变量,不应该出现这一错误。

我只能推测为当我们执行 blob parser 中的 JavaScript 魔术时,上一次执行的结果还在当前执行环境中,这很奇怪,可能是导致错误的原因。

也许我们可以在 JavaScript 中尝试用 try-catch 包裹为 const 类型变量赋值的过程来看看会发生什么。

不懂怎么测试 JS,完全没有头绪。不过我发现 fqdm 和 girlgirlLove 可以通过开启 useLegacyParser 正常解析

LegacyParser 不使用 JS Hook 当然没有问题。

我们可以使用暴力一些的调试方法。

我们可以将所有JS中的 const 改成 var 试试。

是否考虑测试一下这两个规则,然后直接修改规则库?我目前试的几部番都可以直接简易解析

if (typeof _r_text === 'undefined') {
const _r_text = xxxx;
}

我去试试

是否考虑测试一下这两个规则,然后直接修改规则库?我目前试的几部番都可以直接简易解析

if (typeof _r_text === 'undefined') {
const _r_text = xxxx;
}

我去试试

用我上面编辑后的回答,用 var 取代 const 来试试是否生效,编辑前的代码一样会在某些情况下抛出错误

用 var 取代 const 会出现麻烦的嵌套,但应该能勉强工作并规避 const 重复赋值导致脚本抛出错误无法继续执行的问题。

我们可以为能用 LegacyParser 的规则改用 LegacyParser 。LegacyParser 解析更快。

两种修改都无法正常工作,看来问题可能不是因为这个 error 导致的

作为权益之计,你有兴趣在规则仓库提交为对应规则启用 LegacyParser 的 PR 吗。

可以

明天(11.5)我换个代理软件试试,FlClash 导致电脑的一些网络表现非常怪异,我怀疑可能会和这个问题有关

pekolove 大部分番剧可以使用 legacyParser 。不过在安卓和 macOS/iOS 上必须使用软件解码,不清楚其他平台的表现

omofunz 我找不到原因,可能需要别的 macOS 开发者的帮助,好像@LeetaoGoooo@KotaHv 都有使用 macOS 开发

pekolove 大部分番剧可以使用 legacyParser 。不过在安卓和 macOS/iOS 上必须使用软件解码,不清楚其他平台的表现

omofunz 我找不到原因,可能需要别的 macOS 开发者的帮助,好像@LeetaoGoooo@KotaHv 都有使用 macOS 开发

可以的,我晚点看一下 omofunz 的问题

pekolove 大部分番剧可以使用 legacyParser 。不过在安卓和 macOS/iOS 上必须使用软件解码,不清楚其他平台的表现

omofunz 我找不到原因,可能需要别的 macOS 开发者的帮助,好像@LeetaoGoooo@KotaHv 都有使用 macOS 开发

可以的,我晚点看一下 omofunz 的问题

感谢🙏

其实现在mandao,yishijie,clicli也看不了

其实现在mandao,yishijie,clicli也看不了

#366 中发布的构建修复了 clicli,也有修改后的 Pad UI,你可以去测试一下。

mandao 和 yishijie 可能是网络问题或者和 omofunz 一样的解析问题

mandao 是网站问题,这网站本身就有很多番看不了,能看的没几部,这些能看的都能正常解析

yishijie 是 blob 资源,是上面说的解析问题

@Predidit

看起来可能与 JavaScript 没有正确将信息传给 Flutter 有关,这样的改动可以正常解析:

webview_controller_impel.dart 中 204,208 行代码分别修改为:

204: VideoBridgeDebug.postMessage('The number of video tags is' + videos.length);
208: VideoBridgeDebug.postMessage(src);

让我们回到这个修改上,将 blob 解析器中的 window.parent.postMessage 相关调用替换为 VideoBridgeDebug.postMessage 能否解决问题,不能的话,我们只能怀疑是 wkwebview 的安全机制阻止了这种 hook

这是我最初就做过的尝试,无法解析

我尝试将 38 行中的onUrlChange修改为onPageFinished 可以解析

编辑: @KotaHv 你确定是 onPageFinshed 而不是 onPageStarted ? 这太古怪了

onUrlChange 改为 onPageFinshed 是前面讨论过的解决方法,但是 @ErBWs 测试后认为它无效。

也许 @ErBWs 可以再测试一下?

我尝试将 38 行中的onUrlChange修改为onPageFinished 可以解析

可以分享一下还有其他的修改地方吗?我这样修改还是没有效果

我尝试将 38 行中的onUrlChange修改为onPageFinished 可以解析

可以分享一下还有其他的修改地方吗?我这样修改还是没有效果

await webviewController! .setNavigationDelegate(NavigationDelegate(onPageFinished: (currentUrl) { debugPrint('Current URL: $currentUrl');
我只改动了这一个地方,多数blob解析是有效的,但对 girigirilove 无效。

编辑: @KotaHv 你确定是 onPageFinshed 而不是 onPageStarted ? 这太古怪了

onUrlChange 改为 onPageFinshed 是前面讨论过的解决方法,但是 @ErBWs 测试后认为它无效。

也许 @ErBWs 可以再测试一下?

我确定是onPageFinshed

我尝试将 38 行中的onUrlChange修改为onPageFinished 可以解析

可以分享一下还有其他的修改地方吗?我这样修改还是没有效果

await webviewController! .setNavigationDelegate(NavigationDelegate(onPageFinished: (currentUrl) { debugPrint('Current URL: $currentUrl'); 我只改动了这一个地方,多数blob解析是有效的,但对 girigirilove 无效。

0.0.5 版本的 girigirilove 使用 legacyParser 而不是 blob Parser。你是手动编辑 girigirilove 规则,禁用简易解析 (legacy Parser) 后测试的吗

我尝试将 38 行中的onUrlChange修改为onPageFinished 可以解析

可以分享一下还有其他的修改地方吗?我这样修改还是没有效果

await webviewController! .setNavigationDelegate(NavigationDelegate(onPageFinished: (currentUrl) { debugPrint('Current URL: $currentUrl'); 我只改动了这一个地方,多数blob解析是有效的,但对 girigirilove 无效。

0.0.5 版本的 girigirilove 使用 legacyParser 而不是 blob Parser。你是手动编辑 girigirilove 规则,禁用简易解析 (legacy Parser) 后测试的吗

对,我是禁用简易解析后测试的

@KotaHv

那这个修改实际上在 iOS/macOS 上修复了哪几条规则,实际使用哪一部动画测试的

即使这个修改有效,我们也应该将其编写为特定于平台的代码,因为这个修改很明显损坏了 android 上的 blob 解析器

@KotaHv

那这个修改实际上在 iOS/macOS 上修复了哪几条规则,实际使用哪一部动画测试的

即使这个修改有效,我们也应该将其编写为特定于平台的代码,因为这个修改很明显损坏了 android 上的 blob 解析器

我是用 名侦探柯南 测试的,修了 NT、dms、omofunz、yishijie、MXdm、ant、xiapidm

@LeetaoGoooo

这个修改太古怪了,你怎么看,这真的能起作用吗

omofunz 可以在不做任何改动的情况下通过关闭系统代理来正确解析,另外能正常解析的我看了下不是 blob 资源。但是 pekolove 和 yishijie 我不管怎么修改代理设置貌似都没法访问

omofunz 可以在不做任何改动的情况下通过关闭系统代理来正确解析,但是 pekolove 和 yishijie 我不管怎么修改代理设置貌似都没法访问

不做任何改动的情况下,omofunz 遇到 blob 资源时会解析失败

不做任何改动的情况下,omofunz 遇到 blob 资源时会解析失败

做了改动也无法解析 blob 资源,我不是很清楚为什么。你的系统版本是多少

不做任何改动的情况下,omofunz 遇到 blob 资源时会解析失败

做了改动也无法解析 blob 资源,我不是很清楚为什么。你的系统版本是多少

15.1

我这里omofunz可以看,我也是ios系统的

我的问题,自动补全补的是 onPageStarted,onPageFinished 确实可以正常解析

也许我们可以考虑为安卓配置为onUrlChange,iOS 及 macOS 配置为 onPageFinished

我这里是ios17.6.1

不做任何改动的情况下,omofunz 遇到 blob 资源时会解析失败

做了改动也无法解析 blob 资源,我不是很清楚为什么。你的系统版本是多少

15.1

我觉得你的系统可能不支持,换成新系统试

15.1 是 macOS 的最新系统,没有问题,iOS现在最新系统是 18.1

@KotaHv

那这个修改实际上在 iOS/macOS 上修复了哪几条规则,实际使用哪一部动画测试的

即使这个修改有效,我们也应该将其编写为特定于平台的代码,因为这个修改很明显损坏了 android 上的 blob 解析器

另外我这边测试下来 onPageFinished 看起来没有破坏安卓解析器

我的问题,自动补全补的是 onPageStarted,onPageFinished 确实可以正常解析

也许我们可以考虑为安卓配置为onUrlChange,iOS 及 macOS 配置为 onPageFinished

我觉得这是个好主意

我发现的很大问题是,akiaime不管是android还是ios都打不开,解析问题,但是kimani可以在android打开,在iOS看不了

@KotaHv
那这个修改实际上在 iOS/macOS 上修复了哪几条规则,实际使用哪一部动画测试的
即使这个修改有效,我们也应该将其编写为特定于平台的代码,因为这个修改很明显损坏了 android 上的 blob 解析器

另外我这边测试下来 onPageFinished 看起来没有破坏安卓解析器

对 girigirilove 有影响,禁用 简易解析 后会解析失败

@KotaHv
那这个修改实际上在 iOS/macOS 上修复了哪几条规则,实际使用哪一部动画测试的
即使这个修改有效,我们也应该将其编写为特定于平台的代码,因为这个修改很明显损坏了 android 上的 blob 解析器

另外我这边测试下来 onPageFinished 看起来没有破坏安卓解析器

破坏了 girigirilove 的 blob parser。实际上这个解析器最开始就是以 girigirilove 为测试用例编写的

另外 onPageFinished 也解决了之前 clicli 的非 blob 解析器问题,现在 addInviewIframeBridge 可以正常工作了

我建议提交一个 PR 来在 macOS/iOS 上迁移到 onPageFinshed。并且回滚之前从 window.parent.postMessage 迁移到 videoBridgeDebug.postMessage 的修改。

我发现的很大问题是,akiaime不管是android还是ios都打不开,解析问题,但是kimani可以在android打开,在iOS看不了

说错了,这两个可以在android看,在iOS看不了

那两个也是 blob 解析器,我相信上面的修改一样有效。

我现在觉得这个修改之所以成立是因为 onPageFinshed 在 macOS/iOS 和 Android 上的语义是不同的。

可能在 macOS/iOS 上类似于 onDocumentCreate 这种时机,但在 Android 是页面完全加载完成。

是的,我觉得在android可以看但在iOS看不了的插件问题都是一致的

akiamime 和 girlgirlLove 一样,都可以通过简易解析器解析成功,虽然我不知道为什么影之实力者第一季用 akiamime 播放会闪退。kimani 可以通过修改后的 blob 解析器播放

我建议提交一个 PR 来在 macOS/iOS 上迁移到 onPageFinshed。并且回滚之前从 window.parent.postMessage 迁移到 videoBridgeDebug.postMessage 的修改。

@KotaHv 有兴趣提交一个PR吗,这个烦人的问题是被你解决的

akiamime 和 girlgirlLove 一样,都可以通过简易解析器解析成功,虽然我不知道为什么影之实力者第一季用 akiamime 播放会闪退。kimani 可以通过修改后的 blob 解析器播放

对,即便未修改代码,部分 blob 也会闪退,brovod 规则可以稳定复现

我建议提交一个 PR 来在 macOS/iOS 上迁移到 onPageFinshed。并且回滚之前从 window.parent.postMessage 迁移到 videoBridgeDebug.postMessage 的修改。

@KotaHv 有兴趣提交一个PR吗,这个烦人的问题是被你解决的

行,没问题