0


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

【教程】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


本文转载自: https://blog.csdn.net/G971005287W/article/details/128827240
版权归原作者 我是Superman丶 所有, 如有侵权,请联系我们删除。

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

还没有评论