想给 eaf browser 加个黑白名单代理插件遇到个问题

用webpage,webpage可以用,你看我上面发的两个链接。

webpage是webengineview的属性

QWebEnginePage 应该才是 WebEngineView的属性

是呀,我的意思是,你按照下面的逻辑来做:

  1. WebEngineView 调用 QWebEnginePage
  2. QWebEnginePage 调用 setNetworkAccessManager
  3. QNetworkAccessManager 调用 setProxyFactory
  4. QProxyFactory 调用 queryProxy 设置代理规则

我估计你按照上面的调用顺序来设置, 你最早的 query.url() 的问题就可以解决

嗯,这个你想表达的流程我了解,但是

QWebEnginePage 并不支持 setNetworkAccessManager

https://doc.qt.io/qt-5/qwebenginepage.html

似乎基于chromium 的 QWebEngine并没有太多Proxy的支持,而NetWorkAccessManager 这些都是基于Webkit的QtWebKit

嗯,那我建议直接操作系统底层库入手,针对EAF进程进行URL规则过滤,不用QT的方法

嗯嗯,还是感谢懒猫大大的耐心回复,和大大的讨论交流中不断查阅文档,我也逐渐知道,是chromium 本身限制了,而不是QtWebEngine的实现bug,哈哈哈。

目前来说,可能直接从系统入手,或者代理层入手设置url规则才是最好的方式。不过,上面的类似 get_url的方式对我来说也能work (本来还想给eaf贡献贡献的,不过这种蹩脚的实现还是自己玩玩好了),我看看还没有什么优化思路。 :grimacing:

懒猫大大,我又查了下Qt的文档,在QtWebEngine下 QWebEngineUrlRequestInterceptor有类似 QProxyFactory 的 queryProxy的捕获请求的功能,基于QWebEngineUrlRequestInterceptor 改了下,我又提交了一版代码。

1 个赞

好的,我周末要带小朋友出去玩一下,估计要晚上回家才能 review code 了,耐心等一下哈。

好的,不急 谢谢! :grimacing:

你现在测试的时候,是多个页面的流量都会走各自的代理吗? 还是要等在当前页面加载完?

我简单瞄了一个错误,晚上回来继续 review.

晚上回来我看看这个方法通用不,通用就合并。

没法解决的话可以在EAF和真实代理之间自己写一个socks代理来劫持dns做中转,相当于自己实现了pac。

当然第二种方式又会存在跨平台测试。

目前基于 QtWebEngine 还是做不到多个页面的代理独立。

https://doc.qt.io/qt-5/qtwebengine-overview.html#proxy-support

需要等页面加载完。目前我测试基本是work的,而且正常场景下应该够用,但是确实存在多个页面同时loading的时候,代理可能要相互影响的问题

看来只有两条路,一条中转socks来配置规则,一条是把EAF多进程化,每个页面自己一个进程可以独立切换。

多进程的改动还比较复杂,能很好的解决每个进程之间独立代理的这个功能,但是会带来一个副作用,就是每一个页面打开速度都会降低,因为它会有一个Python进程的启动消耗。

个人不倾向这种改造方案,多进程的形式无疑会增大内存损耗,降低性能 :thinking:

其实EAF内部写一个socks5代理应该很容易,根据规则再看要不要转发给本地代理,这样就不用和chromium较劲了,哈哈哈哈哈。

那我也来试试 :grimacing:

1 个赞

我问了朋友,说不用自己写,你可以折腾一下 clash, 就是 socks5 server, 可以自定义规则:

  1. 安装 clash, 配置好规则和本地端口
  2. EAF 设置 socks5 端口到 clash 上
  3. clash 根据规则选择直连还是继续转发到本地的另外一个 socks5 client 上

我自己没有折腾过,欢迎折腾好发一下攻略哈,好多EAF用户都期待这个功能。

1 个赞

用起来了,不过看 clash 配置功能好多好复杂,感觉clash这个东西用来转发个规则有点杀鸡用牛刀的感觉,哈哈哈哈

等我摸索摸索两天配置先,再来写个攻略 :slight_smile:

2 个赞

通过Clash的规则的方式来转发

1 个赞