赞
踩
配置依赖
- <!-- 代理 配合 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)
或者复制下边的内容 另存为 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。