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