当前位置:   article > 正文

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

browsermob-proxy

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

配置依赖

  1. <!-- 代理 配合 selenium进行抓包修改等 -->
  2. <dependency>
  3. <groupId>net.lightbody.bmp</groupId>
  4. <artifactId>browsermob-core</artifactId>
  5. <version>2.1.5</version>
  6. </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

  1. -----BEGIN CERTIFICATE-----
  2. MIIDfzCCAmegAwIBAgIVAMFQpicWi3EjPX08LgeuA8nAOEfIMA0GCSqGSIb3DQEB
  3. DQUAMEYxGTAXBgNVBAMMEExpdHRsZVByb3h5IE1JVE0xKTAnBgNVBAoMIExpdHRs
  4. ZVByb3h5IFJTQSBJbXBlcnNvbmF0aW9uIENBMB4XDTE1MDEwMjAwMDAwMFoXDTI1
  5. MDEwMjAwMDAwMFowRjEZMBcGA1UEAwwQTGl0dGxlUHJveHkgTUlUTTEpMCcGA1UE
  6. CgwgTGl0dGxlUHJveHkgUlNBIEltcGVyc29uYXRpb24gQ0EwggEiMA0GCSqGSIb3
  7. DQEBAQUAA4IBDwAwggEKAoIBAQC141M+lc046DJaNqIARozRPROGt/s5Ng1UOE84
  8. tKhd+M/REaOeNovW+42uMa4ZifJAK7Csc0dx54Iq35LXy0tMw6ly/MB0pFi+aFCJ
  9. VzXZhbAWIsUmjU8t6z2Y0sjKVX/g3HkdXqaX94jlDtsTjeQXvFhiJNRlX/Locc/f
  10. /oNYZWhg7IPGyQglRY9Dco9kZMSbh5y0yfM8002PNPbNOP4dMX4yYqovT90XbvQ2
  11. rCBbiS6Cys7j44vwOcra9srlb3YQiOCOsYCf7eIhT1GH8tqQ84CHblufqxcGIvXv
  12. V1ex6bDFy63tiPySsOwuVnZglkQ0MDl1GMKVySdPw/qQM5v9AgMBAAGjZDBiMB0G
  13. A1UdDgQWBBRFMQtpkCyZIK9NxaEJDvbfaV1QOzAPBgNVHRMBAf8EBTADAQH/MAsG
  14. A1UdDwQEAwIBtjAjBgNVHSUEHDAaBggrBgEFBQcDAQYIKwYBBQUHAwIGBFUdJQAw
  15. DQYJKoZIhvcNAQENBQADggEBAJuYv1NuxPHom579iAjs19YrFGewHpv4aZC7aWTt
  16. oC1y9418w7QzVOAz2VzluURazUdg/HS9s8abJ8IS0iD0xLz0B1cvJ6F2BezjAwyG
  17. 2LxZggmBdLqwjdRkX0Mx3a2HqUpEqaNeKyE8VmzwPuDHN1AqbFcuOPHN7fm7kAtL
  18. 4bxFmjgSt7PjEdYwysdjkLC6m+236tuFydpVkXMjuBthsk/hZ1Y/3tbCj/B9a9//
  19. 5O+HhYEy+Oa64iFvxfgDfKKUQR3VmwThj1Dh2iJw/kbPJEuQ/PtfcnQhOqyliwg6
  20. Edxd1kaO4HU8Am6TwpmpPFWHRqhM2xj2PAGyfFtN1WfBEQ4=
  21. -----END CERTIFICATE-----

 

 

 

配合selenium 使用

配置依赖

  1. <!-- 控制Chrome浏览器 -->
  2. <dependency>
  3. <groupId>org.seleniumhq.selenium</groupId>
  4. <artifactId>selenium-java</artifactId>
  5. <version>${selenium.version}</version>
  6. </dependency>
  7. <!-- 代理 配合 selenium进行抓包修改等 -->
  8. <dependency>
  9. <groupId>net.lightbody.bmp</groupId>
  10. <artifactId>browsermob-core</artifactId>
  11. <version>2.1.5</version>
  12. </dependency>
  13. <!-- 工具类 -->
  14. <dependency>
  15. <groupId>io.github.tanyaofei</groupId>
  16. <artifactId>guava</artifactId>
  17. <version>${guava.version}</version>
  18. </dependency>

相关代码片段

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

  1. /**
  2. * 配置代理
  3. *
  4. */
  5. BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
  6. browserMobProxy.start();
  7. Proxy seleniumProxy = ClientUtil.createSeleniumProxy(browserMobProxy);
  8. /**
  9. * RequestFilter 是一个接口,只有一个方法
  10. * HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo);
  11. *
  12. * 当这个方法在Proxy中被调用的时候,request参数包括了HTTP method, URI, headers等等。这些都是可以修改的。
  13. *
  14. * 当POST方法等提请求带有参数的时候,content中可以取到参数详情。content可以通过
  15. * HttpMessageContents#setTextContents(String) 或者 HttpMessageContents#setBinaryContents(byte[]) 来进行修改。
  16. *
  17. * 对于 request 和 contents 都会直接反映在最终给服务器的请求上。
  18. *
  19. * 如果返回值不是null, 那么代理不再往外发送请求,而是直接将这个非空的元素返回去给浏览器。
  20. * ————————————————
  21. * 版权声明:本文为CSDN博主「王家奇士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  22. * 原文链接:https://blog.csdn.net/qijiqiguai/article/details/73930140
  23. */
  24. browserMobProxy.addRequestFilter(new RequestFilter() {
  25. @Override
  26. public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo httpMessageInfo) {
  27. String uri = request.uri();
  28. if(uri.contains("google.com")
  29. || uri.contains("google.com")
  30. ){
  31. return null;
  32. }
  33. HttpHeaders headers = request.headers();
  34. String textContents = contents.getTextContents();
  35. if(textContents.contains("335577995511")){
  36. System.out.println("准备替换");
  37. }
  38. //修改请求参数
  39. String s = textContents.replaceAll("G W "", "D T "");
  40. s = textContents.replaceAll("G%20%20W%20%20%EF%BC%82", "1");
  41. //指定@的位置
  42. s = s.replaceAll("%22start%22%3A0%2C%22end%22%3A8", "%22start%22%3A0%2C%22end%22%3A2");
  43. contents.setTextContents(s);
  44. if(uri.contains("login.")){
  45. System.out.println("进行登陆了");
  46. }
  47. if (request.getMethod().equals(HttpMethod.POST)) {
  48. System.out.println(request.getUri() + " ######### " + contents.getTextContents());
  49. }
  50. System.out.println(request.getUri() + " --->> " + request.headers().get("Cookie"));
  51. if(uri.equalsIgnoreCase("www.taobao.com:443")){
  52. request.setUri(uri);
  53. }
  54. return null;
  55. }
  56. });
  57. /**
  58. * ResponseFilter是一个接口,只有一个方法 。
  59. * void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo);
  60. *
  61. * 当这个方法在Proxy中被调用的时候,response参数包括了URI, headers, status line等等。
  62. *
  63. * contents是返回的真正内容,可以通过以下方法来进行修改。
  64. * HttpMessageContents#setTextContents(String) 或者 HttpMessageContents#setBinaryContents(byte[])
  65. *
  66. * 对response和content的修改,都会最终反映到请求发起方。
  67. * ————————————————
  68. * 版权声明:本文为CSDN博主「王家奇士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  69. * 原文链接:https://blog.csdn.net/qijiqiguai/article/details/73930140
  70. */
  71. browserMobProxy.addResponseFilter((response, contents, messageInfo) -> {
  72. // System.out.println(
  73. // messageInfo.getUrl() + " >>>>>> " + response.getStatus() + " : " +
  74. // response.headers().get("cookie") + " | " + contents.getTextContents()
  75. // );
  76. });
  77. // 设置浏览器参数
  78. ChromeOptions chromeOptions = new ChromeOptions();
  79. //设置代理
  80. chromeOptions.setProxy(seleniumProxy);
  81. //设置“接受不安全证书”
  82. chromeOptions.setAcceptInsecureCerts(true);

  1. /**
  2. * 代理相关的
  3. */
  4. browserMobProxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
  5. browserMobProxy.setHarCaptureTypes(CaptureType.RESPONSE_CONTENT);
  6. browserMobProxy.newHar("代理");

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

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

参考

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/89704
推荐阅读
相关标签
  

闽ICP备14008679号