起因,要实现同步从chrome获取cookies,然后去做一些事情。来回折腾了selenium,chrome本地cookie文件,cdp方式来获取cookie。(PS:selenium拿不到readonly cookie,本地cookie文件拿不到会话cookie,cpd通过network.getCookies获取不到readonly,通过拦截Network.requestWillBeSent然后获取一些信息)。
巧合的是chrome升级到115版本,对应的webdriver还没更新。本地方式cookie用不了,最终只能选择cdp方式获取。而cdp是websocket通讯,走的异步消息循环。由于没有理解透消息循环、窗口线程、线程之间的原理,浪费了大量时间在这个点上。
这里用win.pumpMessage() 等待消息处理,用一个全局标识作为标记,标记变更后::PostThreadMessage()主动发起一个消息,用来触发全局标记的判断,从而结束pumpMessage,通过这种方式实现伪同步。
var cr = chrome.remote(params);
console.log(cr.remoteDebuggingPort);
// 创建cdp
var ws = web.socket.chrome();
var isOk;
// 这里ws操作全异步。
ws.on("Network.requestWillBeSent",function(param){
...
isOk = true;
console.log(111);
::PostThreadMessage(thread.getId(),1234,0,0);
...
})
// 链接第一个能用的页面
ws.connectFirstDebuggingPage(cr.remoteDebuggingPort);
// 等待链接完成
ws.waitForConnected();
// 激活cdp网络相关操作
ws.Network.enable(maxTotalBufferSize = 10240;);
// 打开网页
ws.Page.navigate(url = domain;);
do{
win.pumpMessage();
}while(!isOk)
console.log("2222");
console.log(inet.getCookie(domain));
另外一个例子
io.open()
io.print("正在监视按键,按ESC键退出!")
//导入HOOK库
import key.hook
import com;
//创建录制钩子
hk = key.hook();
//录制回调函数
hk.proc=function(msg,vkcode,scancode){
var kn = key.getName( vkcode );
if( ( vkcode == key.VK.ESCAPE) && ( msg == 0x100/*_WM_KEYDOWN*/ ) ){
::PostThreadMessage(thread.getId(),1234,0,0)
win.quitMessage();
}
}
//录制需要消消息循环
import win;
win.loopMessage(
function(msg){
if(msg.message==1234){
var ie=com.CreateObject("InternetExplorer.Application.1")
ie.visible=true;
}
}
)
//一定要关闭钩子
hk.close();
execute("pause") //按任意键继续
io.close();//关闭控制台