搜索
查看: 2551|回复: 7

[自动化] chrome远程调试 - 获取网络请求

  [复制链接]

51

主题

286

帖子

1728

积分

荣誉会员

Rank: 8Rank: 8

积分
1728
发表于 2017-12-6 18:09:08 | 显示全部楼层 |阅读模式
本帖最后由 5e365 于 2017-12-6 18:14 编辑

想获取网页访问的请求url,刚好最新aardio版本的chrome远程调试库可以实现这个功能
为了让代码可以复用,封装了一下。官方有一个puppeteer的库,仿照这个接口的命名做的封装。只实现到我这个需求
演示程序如下:

io.open()
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
        io.print(url)
    })  
}

winform.button2.oncommand =
function(id,event){
    page.goto(winform.edit.text)   
}


winform.show()
win.loopMessage();

效果如下: demo.gif

QQ截图20171206180905.jpg

=========================================================
库代码如下:
目前库有4个文件,如下
QQ截图20171206175307.jpg

_.aardio 文件
import win.reg;
import process
import puppeteer.Browser

namespace puppeteer

launch =
function(options) begin   
   
if(..process.find("chrome.exe")){
        ..io.print(
"请先先退出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){
            ..io.print(
"chrome已主动断开连接,原因:"+param.reason);
        })
        
        
//打开连接触发的事件
        ws.on("open",function(){
            ..io.print(
"已打开连接")  
        })
        
        ws.on(
"close",function(){
            ..io.print(
"已关闭连接")      
        });
        
        ws.on(
"error",function(err){
            ..io.print(
"出错了",err);
        });
            
        ws.connect(wsUrl);
    };
   
    goto =
function(url) begin
        ws.Page.navigate(
            url = url;
        ).end =
function(result,err){
            ..io.print(
"调用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){
            ..io.print(
"调用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)
//          ..io.print("收到", ..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**/








评分

参与人数 1银币 +40 收起 理由
松江 + 40 很给力!

查看全部评分

◆ 半醒半醉日复日,花落花开年复年 ◆
回复

使用道具 举报

1

主题

8

帖子

64

积分

一级会员

Rank: 2

积分
64
发表于 2017-12-6 18:32:09 | 显示全部楼层
顶个
回复

使用道具 举报

39

主题

174

帖子

1062

积分

荣誉会员

htmlayout.cn 我的学习笔记

Rank: 8Rank: 8

积分
1062
发表于 2017-12-6 19:25:20 | 显示全部楼层
厉害,学习了
! www.HtmLayout.Cn 我的学习笔记
回复

使用道具 举报

0

主题

2

帖子

61

积分

培训班

积分
61
发表于 2017-12-8 17:30:48 | 显示全部楼层
厉害啊
回复

使用道具 举报

3

主题

57

帖子

1028

积分

四级会员

Rank: 6Rank: 6

积分
1028
发表于 2017-12-10 20:11:30 | 显示全部楼层
这个库的应用场景主要是哪些方面
回复

使用道具 举报

7

主题

20

帖子

138

积分

一级会员

Rank: 2

积分
138
QQ
发表于 2017-12-12 10:48:30 来自手机 | 显示全部楼层
请问能获取后台渲染后的数据吗?谢谢
回复

使用道具 举报

51

主题

286

帖子

1728

积分

荣誉会员

Rank: 8Rank: 8

积分
1728
 楼主| 发表于 2017-12-12 10:52:34 | 显示全部楼层
本帖最后由 5e365 于 2017-12-12 10:54 编辑
jiumei 发表于 2017-12-12 10:48
请问能获取后台渲染后的数据吗?谢谢


可以获取,chrome F12调试工具里能看到的基本都能获取。你可以去研究下这个。一个应用场景就是写爬虫,特别是渲染以后的数据比传统爬虫更有优势,就是因为浏览器已经帮你渲染好了
◆ 半醒半醉日复日,花落花开年复年 ◆
回复

使用道具 举报

7

主题

20

帖子

138

积分

一级会员

Rank: 2

积分
138
QQ
发表于 2017-12-12 13:28:51 | 显示全部楼层
5e365 发表于 2017-12-12 10:52
可以获取,chrome F12调试工具里能看到的基本都能获取。你可以去研究下这个。一个应用场景就是写爬虫, ...

嗯,这样就很方便了,有实际的例子吗?现在高深的还看不懂,借着例子可能要好懂点,如果有例子,可以发一下吗,如果没有就算了,不然也耽误你时间,谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2019-7-22 07:04 , Processed in 0.125000 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表