【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用

news2024/11/18 2:42:05

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用

配置依赖

        <!-- 代理 配合 selenium进行抓包修改等 -->
        <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-core</artifactId>
            <version>2.1.5</version>
        </dependency>

安装证书

导入证书, 可以不导入

browsermob-proxy/ca-certificate-rsa.cer at master · lightbody/browsermob-proxy (github.com)

https://jsd.cdn.zzko.cn/gh/lightbody/browsermob-proxy@master/browsermob-core/src/main/resources/sslSupport/ca-certificate-rsa.cer

或者复制下边的内容 另存为 ca-certificate-rsa.cer

-----BEGIN CERTIFICATE-----
MIIDfzCCAmegAwIBAgIVAMFQpicWi3EjPX08LgeuA8nAOEfIMA0GCSqGSIb3DQEB
DQUAMEYxGTAXBgNVBAMMEExpdHRsZVByb3h5IE1JVE0xKTAnBgNVBAoMIExpdHRs
ZVByb3h5IFJTQSBJbXBlcnNvbmF0aW9uIENBMB4XDTE1MDEwMjAwMDAwMFoXDTI1
MDEwMjAwMDAwMFowRjEZMBcGA1UEAwwQTGl0dGxlUHJveHkgTUlUTTEpMCcGA1UE
CgwgTGl0dGxlUHJveHkgUlNBIEltcGVyc29uYXRpb24gQ0EwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC141M+lc046DJaNqIARozRPROGt/s5Ng1UOE84
tKhd+M/REaOeNovW+42uMa4ZifJAK7Csc0dx54Iq35LXy0tMw6ly/MB0pFi+aFCJ
VzXZhbAWIsUmjU8t6z2Y0sjKVX/g3HkdXqaX94jlDtsTjeQXvFhiJNRlX/Locc/f
/oNYZWhg7IPGyQglRY9Dco9kZMSbh5y0yfM8002PNPbNOP4dMX4yYqovT90XbvQ2
rCBbiS6Cys7j44vwOcra9srlb3YQiOCOsYCf7eIhT1GH8tqQ84CHblufqxcGIvXv
V1ex6bDFy63tiPySsOwuVnZglkQ0MDl1GMKVySdPw/qQM5v9AgMBAAGjZDBiMB0G
A1UdDgQWBBRFMQtpkCyZIK9NxaEJDvbfaV1QOzAPBgNVHRMBAf8EBTADAQH/MAsG
A1UdDwQEAwIBtjAjBgNVHSUEHDAaBggrBgEFBQcDAQYIKwYBBQUHAwIGBFUdJQAw
DQYJKoZIhvcNAQENBQADggEBAJuYv1NuxPHom579iAjs19YrFGewHpv4aZC7aWTt
oC1y9418w7QzVOAz2VzluURazUdg/HS9s8abJ8IS0iD0xLz0B1cvJ6F2BezjAwyG
2LxZggmBdLqwjdRkX0Mx3a2HqUpEqaNeKyE8VmzwPuDHN1AqbFcuOPHN7fm7kAtL
4bxFmjgSt7PjEdYwysdjkLC6m+236tuFydpVkXMjuBthsk/hZ1Y/3tbCj/B9a9//
5O+HhYEy+Oa64iFvxfgDfKKUQR3VmwThj1Dh2iJw/kbPJEuQ/PtfcnQhOqyliwg6
Edxd1kaO4HU8Am6TwpmpPFWHRqhM2xj2PAGyfFtN1WfBEQ4=
-----END CERTIFICATE-----

 

 

 

配合selenium 使用

配置依赖


        <!-- 控制Chrome浏览器 -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>

        <!-- 代理 配合 selenium进行抓包修改等 -->
        <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-core</artifactId>
            <version>2.1.5</version>
        </dependency>
        

        <!-- 工具类 -->
        <dependency>
            <groupId>io.github.tanyaofei</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>

相关代码片段

可以修改请求参数 请求头  以及 响应结果等, 灵活性比较强


        /**
         * 配置代理
         * 
         */

        BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
        browserMobProxy.start();

        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(browserMobProxy);


        /**
         * RequestFilter 是一个接口,只有一个方法 
         * HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo);
         *
         * 当这个方法在Proxy中被调用的时候,request参数包括了HTTP method, URI, headers等等。这些都是可以修改的。
         *
         * 当POST方法等提请求带有参数的时候,content中可以取到参数详情。content可以通过
         * HttpMessageContents#setTextContents(String) 或者 HttpMessageContents#setBinaryContents(byte[]) 来进行修改。
         *
         * 对于 request 和 contents 都会直接反映在最终给服务器的请求上。
         *
         * 如果返回值不是null, 那么代理不再往外发送请求,而是直接将这个非空的元素返回去给浏览器。
         * ————————————————
         * 版权声明:本文为CSDN博主「王家奇士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
         * 原文链接:https://blog.csdn.net/qijiqiguai/article/details/73930140
         */
        browserMobProxy.addRequestFilter(new RequestFilter() {
            @Override
            public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo httpMessageInfo) {

                String uri = request.uri();

                if(uri.contains("google.com")
                        || uri.contains("google.com")
                ){
                    return null;
                }
                HttpHeaders headers = request.headers();

                
                String textContents = contents.getTextContents();
                
                if(textContents.contains("335577995511")){
                    System.out.println("准备替换");

                    
                    
                }
                
                //修改请求参数
                String s = textContents.replaceAll("G W "", "D T "");
                s = textContents.replaceAll("G%20%20W%20%20%EF%BC%82", "1");
                //指定@的位置
                s = s.replaceAll("%22start%22%3A0%2C%22end%22%3A8", "%22start%22%3A0%2C%22end%22%3A2");
                contents.setTextContents(s);
                if(uri.contains("login.")){
                    System.out.println("进行登陆了");
                }

                if (request.getMethod().equals(HttpMethod.POST)) {
                    System.out.println(request.getUri() + " ######### " + contents.getTextContents());
                }
                System.out.println(request.getUri() + " --->> " + request.headers().get("Cookie"));
                
                if(uri.equalsIgnoreCase("www.taobao.com:443")){
                    request.setUri(uri);
                }
                
                

                return null;
            }
        });


        /**
         * ResponseFilter是一个接口,只有一个方法 。
         * void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo);
         *
         * 当这个方法在Proxy中被调用的时候,response参数包括了URI, headers, status line等等。
         *
         * contents是返回的真正内容,可以通过以下方法来进行修改。
         * HttpMessageContents#setTextContents(String) 或者 HttpMessageContents#setBinaryContents(byte[]) 
         *
         * 对response和content的修改,都会最终反映到请求发起方。
         * ————————————————
         * 版权声明:本文为CSDN博主「王家奇士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
         * 原文链接:https://blog.csdn.net/qijiqiguai/article/details/73930140
         */
        browserMobProxy.addResponseFilter((response, contents, messageInfo) -> {
//            System.out.println(
//                    messageInfo.getUrl() + " >>>>>> " + response.getStatus() + " : " +
//                            response.headers().get("cookie") + " | " + contents.getTextContents()
//            );
        });
        




        // 设置浏览器参数
        ChromeOptions chromeOptions = new ChromeOptions();

        //设置代理
        chromeOptions.setProxy(seleniumProxy);
        
        //设置“接受不安全证书”
        chromeOptions.setAcceptInsecureCerts(true);
        

        /**
         * 代理相关的
         */
        browserMobProxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        browserMobProxy.setHarCaptureTypes(CaptureType.RESPONSE_CONTENT);
        browserMobProxy.newHar("代理");

统一拿到请求相应结果, 跟上边方法一样, 推荐使用上边的方法


        /**
         * 代理相关
         */
        Har har = browserMobProxy.getHar();
        for (HarEntry entry : har.getLog().getEntries()) {//这儿就是获取所有的请求响应的数据
            HarResponse response = entry.getResponse();
            HarRequest request = entry.getRequest();
            String url = request.getUrl();
            String method = request.getMethod();
            if(url.contains("login.")){
//                System.out.println("我出来了");
                HarContent content = response.getContent();
                String text = content.getText();//这个是拿到响应的body,就是你想要的json数据了
//                System.out.println("text-->-->"+text);
            }
                
        }
        

参考

browsermob-proxy, 基于Java的代理服务_王家奇士的博客-CSDN博客_browsermobproxy java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H3C Switch S1848G端口限速

需求&#xff1a;在交换机层面对接入用户的网络流量限速1.交换机信息2.主机限速前2.1本机IP和MAC信息依次打开控制面板\所有控制面板项\网络连接2.2限速前测速使用浏览器打开https://10000.gd.cn/测速3.主机限速后3.1查看主机所在交换机接口点击“网络”-“MAC地址”&#xff0…

【微信小程序】给你的页面加上一个填写进度表

前言在搭建一些与申请相关的微信小程序的时候&#xff0c;用户会遇到需要填写很多表单的情况&#xff0c;面对未知的表单数量&#xff0c;用户往往就会放弃填写申请表格。在此基础上作为开发者的我们常常会收到这样的一个任务——给申请页面加上一个填写进度表。这样不仅可以优…

274. H 指数

274. H 指数一、题目描述二、题目分析三、解题思路3.1 更换H指数定义3.2 二分法枚举H指数一、题目描述 二、题目分析 这道题比较绕&#xff0c;理解题目意思&#xff0c;根据题目的说法&#xff0c;所谓的H指数就是&#xff1a;总共有 h 篇论文分别被引用了至少 h 次。且其余的…

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

文章目录Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理前言1、改造父项目 pom 文件2、创建 gateway 子 module3、配置yml文件Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理 spring cloud alibaba 版本对照 spring cloud alibaba 有严格的…

【MPP数据库】TiDB表分区探索与实践

方案背景——为什么要进行分区&#xff1f; 一是老板通Tidb集群每天涉及50张表、2亿多条数据回流&#xff0c;合理使用Hash可以把写入压力打散到不同的TiKV&#xff1b; 二是对于大集团数据做聚合&#xff0c;利用分区裁剪原理&#xff0c;查询时可以充当前置索引&#xff0c…

1月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年1月23日-1月29日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

卫星地图——MAP(c++)

卫星地图 题目描述 一张矩形的卫星地图&#xff0c;有M行N列。行列中的0表示空地&#xff0c;1表示有建筑。有3种类型的建筑: L型: 仅在一行上占据连续的若干个格子&#xff0c;长度至少为2&#xff0c;至多为N C型&#xff1a;仅在一列上占据连续的若干个格子&#xff0c;…

春节机票销售大增!航空领域哪些业务风险要注意?

目录 航空领域常见的业务风险 2022年航空业务风险趋势分析 航空领域业务风险欺诈分析 如何防范航空业务风险 针对恶意网络爬虫 针对仿冒登录与内控风险 安全技术 春节旅游与出行数据陆续出炉。中国民航局数据显示&#xff0c;2023年1月21日至27日&#xff08;农历除夕至…

Linux - Linux系统

一、Linux系统Linux&#xff0c;全称GNU/Linux。Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发能力已经得到业界的认可&#xff0c;目前大多数企业级应用甚至是集群项目都部署运行在linux操作系统之上&#xff0c;很多软件公司考虑到开发成本都首选…

CnOpenData中国核酸检测机构及采样点数据

一、数据简介 2020年1月21日&#xff0c;国家卫健委发布1号公告&#xff0c;将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病&#xff0c;并采取甲类传染病的预防、控制措施。目前&#xff0c;新型冠状病毒肺炎防控仍处于关键阶段&#xff0c;核酸…

ThinkPHP6 文件上传

内置文件上传使用\think\facade\Filesystem类封装方法 目录 简单上传 public存储文件 文件验证 命名规则 使用sha1 使用MD5 使用date 指定文件名称 自定义命名规则 更多上传设置 总结 简单上传 直接上传&#xff0c;使用默认上传设置 $savename \think\facade\F…

业务平台扩展支持TDengine时序数据库方案

1 场景与架构 1.1业务架构 这里涉及项目隐私&#xff0c;架构图不方便公开。 大致情况就是&#xff1a; 应用层的园区畅行、生态宜居、安全守护是我方要交付的系统。 平台层的物联网感知中台是我方平台。 1.2数据架构 从数据架构看&#xff0c;园区畅行…

第四章 git分支操作

4.1什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

优化器-RBO 的规则转化

一、RBO 背景介绍RBO&#xff08;Rule-Based Optimization&#xff0c;基于规则的优化器&#xff09;有着一套严格的使用规则&#xff0c;按照 RBO 去写 SQL 语句&#xff0c;无论数据表中的内容怎样&#xff0c;也不会影响到你的“执行计划”。换言之 RBO 对数据不“敏感”&am…

码元,码元速率,波特率,比特率(个人理解总结)

参考&#xff1a;https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E4%BC%A0%E8%BE%93%E9%80%9F%E7%8E%87/6305673 https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E9%80%9F%E7%8E%87/10945076 https://baike.baidu.com/item/%E6%9B%BC%E5%BD%BB%E6%96%AF%E7%89%B9%E7%BC%9…

低代码:如何成为企业业务价值提升的一大利器?

首先&#xff0c;来看低代码能为企业带来什么&#xff1f; 低代码开发能够增加软件所创造的价值&#xff0c;帮助企业机构衡量企业级低代码平台的价值并计算它将会产生的影响。 低代码在企业的现实运用中能为企业带来巨大的经济效益。众所周知&#xff0c;软件可以推动业务价值…

Cesium中的飞线效果-Shader

飞线的顶点着色器坐标系换算较为复杂。代码中的vertexShaderSource部分为cesium源码中附带的顶点着色器。后期增加了一些传参方法。 用到的GLSL的API: attribute vec2 st; 两个分量为 st.s: 飞线的长度(0-1) st.t: 飞线的宽度(0~1) czm_frameNumber 每帧都会自增,用…

metersphere将默认关闭加载的UI服务启动

目录 一、安装 二、配置 selenium-grid 三、下载驱动程序 三、运行驱动程序 四、将本地运行Selenium-server配置到MeterSphere平台 一、安装 /opt/metersphere/.env&#xff0c;有个 ui_enabled属性&#xff0c;改成true, 然后 msctl reload 二、配置 selenium-grid 这里…

pytest自动化测试执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环境等等&#xff0c;并且在DevOps理念中&#xff0c;往往自动化都会与Jenkins进行CI/CD&#xff0c;不论是定时执行策略…