浅谈一次 cherry-studio 捉虫记录并浅谈它内置联网原理
最近因为 cherry-studio 内置的三大搜索(bing、baidu、google)过于难用于是我开启了捉虫行动。
大家都遇到过这种情况:在 cherry 里问 AI 一个问题然后它通过调用联网搜索的方式回答,但是很操蛋的是内置的三大搜索都几乎不可用,这太操蛋了。
我通过查阅 cherry 的源代码最终理解了为什么三大搜索这么难用,下面举例说明为什么难用
cherry 会将AI生成的查询关键词做一些可有可无的处理导致搜索范围变窄(我个人认为这是其中之一的原因,他们这样写肯定有自己的原因),比如会在搜索关键词前面插入当前的日期信息
today is 20**-**-** \r\n后面插入用户的语言lang: ****,这就导致整个搜索关键词变得繁杂冗长,能搜到的内容自然变少了。cherry 通过一个隐藏的窗口获取网页信息,但由于是隐藏的窗口导致加载出来的网页信息和正常的网页有非常大的差异。
cherry 获取网页源码的时机有点问题,在页面还有抖动的时候就尝试获取了,这导致有时候获取的是空内容
好,那么如何解决呢?首先让我将一下 cherry 是如何搜索的吧。
cherry 负责搜索的模块在接受到 AI 生成的搜索关键词后会对关键词进行一定的处理,处理完成后会开启一个浏览器的窗口访问处理好的搜索链接,当页面加载完成后会获取整个网页内容传递给对应搜索的解析器进行数据提纯,完成这一切后浏览器窗口会将其关闭(当然由于是隐藏的所以你什么也看不见),这时候就完成了搜索,AI 就可以根据返回的内容输出答案。
问题就出现在开启浏览器的过程和获取源代码的时机上面,当我让 cherry 创建窗口获取网页源代码的时候获取的页面是这样的

但是在不显示窗口的情况下获取到的页面是这样的

这时候解决方法就呼之欲出了,这里引用我提交的pr说明
https://github.com/CherryHQ/cherry-studio/pull/12305
通过启用离屏渲染并修改executeJavaScript执行时机修复bing、baidu、google无法获取搜索内容的bug。
这个bug是因为在electron中隐藏窗口时候获取的页面会与显示窗口时有差异导致的无法获取搜索内容,且原有的did-finish-load会导致窗口内网页的抖动,这进一步导致随机性的无法正常获取搜索内容。
我通过启动离屏渲染确保不显示窗口时页面内容和显示窗口时一致解决无法获取搜索内容的问题,并改用ready-to-show事件确保完全加载完成页面后再获取完整的页面dom,这样即可解决搜索的bug
最后贴一张修复后的使用效果图,使用内置 bing 搜索(要是能加载后面需要翻页的内容就好了)



