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

配置依赖

net.lightbody.bmp

browsermob-core

2.1.5

安装证书

导入证书, 可以不导入

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 使用

配置依赖

org.seleniumhq.selenium

selenium-java

${selenium.version}

net.lightbody.bmp

browsermob-core

2.1.5

io.github.tanyaofei

guava

${guava.version}

相关代码片段

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

/**

* 配置代理

*

*/

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

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: