4

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

 6 months ago
source link: https://blog.51cto.com/u_14976802/9982019
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【教程】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-----
【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用_chrome
【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用_selenium_02
【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用_测试工具_03
【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用_System_04

配合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, 那么代理不再往外发送请求,而是直接将这个非空的元素返回去给浏览器。
       
         */
        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的修改,都会最终反映到请求发起方。

         */
        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的代理服务_王家奇士的博客

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK