Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

非常感谢作者提供,刚接触遇到一些疑问,方便大家讨论,我希望在这里提出疑问,问题偏向于爬虫 #16

Open
54huige opened this issue Aug 1, 2023 · 4 comments

Comments

@54huige
Copy link

54huige commented Aug 1, 2023

有的需求可能在手册中也可能在示例中,我会去慢慢学习了解,以下可能是我站在爬虫角度比较在意的地方。同时也希望对作者撰写手册提供一些需求描述方向。
1.返回上一页
2.针对每一个不同的窗口设置代理
3.监听地址栏URL以及窗口页面所有请求甚至是对地址栏和页面请求进行请求内容串改和响应内容串改拦截等等
4.是否显示网页图片
5.是否加载js
6.是否无头模式
7.如何用GO直接操作页面元素还是说只能和js交互方式控制?
8.是否允许跨域?或者说是关闭浏览器相关安全策略等等
9.具体的浏览器层面配置字段?
10.对于浏览器用户操作模拟?比如点击、滚动、悬浮、焦点、移动鼠标、双击等等
针对很多通过GO调用js交互实现的一些,我可能更偏向于直接用GO实现,比如返回上一页或者是点击某个元素之类的可能GO直接操作更讨人喜欢

@sxmxta
Copy link
Contributor

sxmxta commented Aug 2, 2023

你好,感谢你的问题。
我先说明一下,对于文档和注释确实有很大的不足。原因是我个人精力有限。
所以我在一定程度上提供了大量的示例程序。文档和注释在以后会慢慢补全, 对于文档和注释这两点来还是一个很大的工程。
对于一些简单的功能,也可以通过函数名和参数名来识别这些函数的作用。

按序号对应回答你上面的问题。

  1. 通过Chromium对象、或ICefBrowser对象控制浏览的前进后退 GoBack() GoForward() StopLoad() Reload()。 示例程序 control
  2. 在event.SetOnBeforeBrowser回调函数中配置每个不同url的代理。 示例程序 proxy
  3. 分解为几个问题
    3.1 监听地址改变 event.SetOnAddressChange。 示例程序 control
    3.2 监听当前页面加载状态 event.SetOnLoadingStateChange。 示例程序 control
    3.3 监听地址进度 event.SetOnLoadingProgressChange。 示例程序 control
    3.4 页面拦截篡改内容 在 window.Chromium().SetOnGetResourceResponseFilter 回调函数操作。示例程序 response-filter,示例仅有响应拦截
  4. app.SetDisableImageLoading(bool)
  5. app.SetDisableJavascript(bool)
  6. 这一点你可能需要通过配置缓存目录,和清除缓存来实现? app.SetCache 带有 cache 相关的函数名.
  7. 一定程度上可以操作dom元素,但不如JS的好用。示例程序 dom-visitor,
    你也可以尝试了解一下开发者工具的工能函数,Chromium对开发者工具应该提供了很多的方法,对于这个我不是很了解。
    或者直接使用JS在webkit初始化函数中注入你的本地(native修饰函数)JS工具类,native 函数在JS执行时会调用GO里JS处理函数。这样你就可以在GO中操作JS工具类并实现互通操作。
    webkit 示例程序 webkit-register
  8. app.SetDisableWebSecurity(bool) 和 app.SetDisableSiteIsolationTrials(bool)
  9. application 应用对象提供了大量的参数配置,也可通过进程参数设置。在所有示例中创建application对象时都有默认的设置
  10. 模拟用户操作,使用 Chromium 对象,或 ICefBrowser 提供的函数, SendMouseXXX, SendKeyXXX 开头的函数发送模拟事件。 未提供示例

最后一点,对于Go和CEF本身它们就是分离的,不管是C++, 还是Delphi实现的。我们都需要自己实现Go和JS互通。例如IPC机制就是这个模式

@54huige
Copy link
Author

54huige commented Aug 2, 2023

@sxmxta 非常感谢作者的耐心解答,我自己消化一下,今天详细看了下文档,确实不比Python的cef相关库差,这确实是非常强悍的一个库,也给GO的使用者带来了更多机会,我先通过文档和示例以及源码研究下,再次感谢作者

@54huige
Copy link
Author

54huige commented Aug 2, 2023

辛苦了作者,又要开发又要写文档。
我这边补充下其他角度的疑问(也许上述有解决方案,这里细化一下,也方便其他同学查阅了解):
1.挂载GO函数,js直接调用,比如挂载到window对象中
2.使用GO覆盖或接管任意系统函数,hook相关 比如接管console.log()、alert、confirm 甚至是重写或者是屏蔽,针对一些BOM DOM
甚至串改js函数返回结果,如屏蔽部分浏览器函数的特征使某些系统函数失去作用等等,有的是js在客户端对console.log进行接管,只要通过GO依然可以重写
3.无痕浏览器

@sxmxta
Copy link
Contributor

sxmxta commented Aug 2, 2023

Energy只是封装了CEF提供的API, 就像CEF一样,CEF也是针对Chromium封装了大量的API提供出来.

1,2. 针对这两点,你可以尝试注册本地函数,或者 Chromium().ExecuteJavaScript(code, scriptURL string, startLine int32) 函数来注入自己的JS, 来实现你想要的效果。
记得以前有位朋友他要拦截 WebSocket ,你要的效果应该和他的一样,可能在一定程度上拦截函数. 使用的 ExecuteJavaScript
另外是,alert confirm 这种提示框,是可以重写或屏蔽。使用 OnJsDialog 回调函数

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants