本帖最后由 5e365 于 2017-12-6 18:14 编辑
想获取网页访问的请求url,刚好最新aardio版本的chrome远程调试库可以实现这个功能
为了让代码可以复用,封装了一下。官方有一个puppeteer的库,仿照这个接口的命名做的封装。只实现到我这个需求
演示程序如下:
import console
import puppeteer
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=425;bottom=143)
winform.add(
button={cls="button";text="启动调试";left=35;top=24;right=104;bottom=63;z=1};
button2={cls="button";text="打开网址";left=331;top=74;right=400;bottom=113;z=2};
button3={cls="button";text="启动网络跟踪";left=126;top=23;right=220;bottom=62;z=3};
edit={cls="edit";text="http://www.qq.com";left=36;top=77;right=306;bottom=110;edge=1;multiline=1;z=4}
)
/*}}*/
winform.button.oncommand = function(id,event){
browser = ..puppeteer.launch()
page = browser.newPage()
}
winform.button3.oncommand = function(id,event){
var network = page.networkEnable()
network.handleOnRequest(function(msg){
var url = msg.params.request.url
console.log(url)
})
}
winform.button2.oncommand = function(id,event){
page.goto(winform.edit.text)
}
winform.show();
win.loopMessage();
效果如下:
=========================================================
库代码如下:
目前库有4个文件,如下
_.aardio 文件
import win.reg;
import process
import puppeteer.Browser
namespace puppeteer
launch = function(options) begin
if(..process.find("chrome.exe")){
..console.log("请先先退出chrome.exe");
return false;
}
var reg = ..win.reg("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe")
var chromePath = reg.queryValue("");
var port = 9222
..process.execute(chromePath, "--remote-debugging-port=" + port);
var browser = ..puppeteer.Browser(port)
return browser;
end;
/**intellisense(puppeteer)
launch() = 启动chrome远程调试\n!Browser.
end intellisense**/
Browser.aardio 文件
import web.rest.jsonLiteClient
import puppeteer.Page
namespace puppeteer
class Browser{
ctor(port=9222){
var http = ..web.rest.jsonLiteClient();
};
newPage = function() begin
var tPage = http.get(..string.format("http://127.0.0.1:%d/json/new", port))
var page = ..puppeteer.Page(tPage.webSocketDebuggerUrl, tPage)
return page;
end;
}
namespace Browser{
}
/**intellisense()
puppeteer.Browser = 远程调试浏览器
puppeteer.Browser() = 远程调试浏览器\n!Browser.
!Browser.newPage() = 新建网页\n!Page.
end intellisense**/
Page.aardio 文件
import web.socket.chrome;
import web.json
import puppeteer.Network
namespace puppeteer
class Page{
ctor(wsUrl, info){
var ws = ..web.socket.chrome();
//监听chrome事件
ws.on("Inspector.detached",function(param){
..console.log("chrome已主动断开连接,原因:"+param.reason);
})
//打开连接触发的事件
ws.on("open",function(){
..console.log("已打开连接")
})
ws.on("close",function(){
..console.log("已关闭连接")
});
ws.on("error",function(err){
..console.log("出错了",err);
});
ws.connect(wsUrl);
};
goto = function(url) begin
ws.Page.navigate(
url = url;
).end = function(result,err){
..console.log("调用Page.navigate结果:", ..web.json.stringify(result))
}
end;
request = function(method, param, onEnd) begin
ws.request(method, param).end = onEnd
end;
networkEnable = function() begin
this.network = ..puppeteer.Network(ws)
return this.network;
end;
}
namespace Page{
}
/**intellisense()
puppeteer.Page = 网页
puppeteer.Page(wsUrl, info) = 网页
puppeteer.Page() = !Page.
!Page.goto(url) = 打开网址
!Page.request(.(method, param, onEnd) = 原始请求,param为表参数,onEnd回调带两个参数result,err
!Page.networkEnable() = 启动网络活动跟踪\n!Network.
end intellisense**/
Network.aardio 文件
import web.json
namespace puppeteer
class Network{
ctor(ws){
var msgCallback = {}
ws.Network.enable(
maxTotalBufferSize = 10240;
).end = function(result,err){
..console.log("调用Network.enable结果:", ..web.json.stringify(result))
}
};
handleOnRequest = function(onRequest) begin
msgCallback.onRequest = onRequest
this.registerOnMessage()
end;
registerOnMessage = function() begin
ws.on("message", function(msg){
var data = ..web.json.parse(msg.data)
// ..console.log("收到", ..table.tostring(msg));
for(k,v in msgCallback){
if(k == "onRequest"){
if(data.method != "Network.requestWillBeSent") continue;
}
v(data)
}
})
end;
}
namespace Network{
}
/**intellisense()
puppeteer.Network = 网络活动
puppeteer.Network(ws) = 网络活动
puppeteer.Network() = !Network.
!Network.handleOnRequest = 注册发起网络请求的回调
end intellisense**/
|