接了個私活,批量注冊某app賬號,使用fiddler抓包后,多線程批量注冊,httpclient的請求工具類源碼可以通用任何需要網(wǎng)絡(luò)請求的地方,分享出來
package cn.zhaozhiguang.hepai.util;
import java.io.File;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings("deprecation")
public class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
private static int SocketTimeout = 30000;//30秒
private static int ConnectTimeout = 30000;//30秒
private static Boolean SetTimeOut = true;
private static CloseableHttpClient getHttpClient() {
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create();
ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();
registryBuilder.register("http", plainSF);
//指定信任密鑰存儲對象和連接套接字工廠
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
//信任任何鏈接
TrustStrategy anyTrustStrategy = new TrustStrategy() {
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
};
SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();
LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
registryBuilder.register("https", sslSF);
} catch (KeyStoreException e) {
throw new RuntimeException(e);
} catch (KeyManagementException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
Registry<ConnectionSocketFactory> registry = registryBuilder.build();
//設(shè)置連接管理器
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
//構(gòu)建客戶端
return HttpClientBuilder.create().setConnectionManager(connManager).build();
}
/**
* get
*
* @param url 請求的url
* @param queries 請求的參數(shù)摩桶,在瀏覽器深员?后面的數(shù)據(jù),沒有可以傳null
* @return
* @throws IOException
*/
public static String get(String url, Map<String, String> queries) throws IOException {
String responseBody = "";
CloseableHttpClient httpClient = getHttpClient();
StringBuilder sb = new StringBuilder(url);
if (queries != null && queries.keySet().size() > 0) {
boolean firstFlag = true;
Iterator<Map.Entry<String, String>> iterator = queries.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (firstFlag) {
sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());
firstFlag = false;
} else {
sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());
}
}
}
HttpGet httpGet = new HttpGet(sb.toString());
if (SetTimeOut) {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(SocketTimeout)
.setConnectTimeout(ConnectTimeout).build();//設(shè)置請求和傳輸超時時間
httpGet.setConfig(requestConfig);
}
try {
logger.debug("Executing request " + httpGet.getRequestLine());
//請求數(shù)據(jù)
CloseableHttpResponse response = httpClient.execute(httpGet);
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
responseBody = EntityUtils.toString(entity);
logger.debug(responseBody);
EntityUtils.consume(entity);
} else {
logger.debug("http return status error:" + status);
throw new ClientProtocolException("Unexpected response status: " + status);
}
} catch (Exception ex) {
logger.debug("get請求時發(fā)生錯誤~");
} finally {
httpClient.close();
}
return responseBody;
}
/** post
* @param url 請求的url
* @param queries 請求的參數(shù)眯漩,在瀏覽器颗圣?后面的數(shù)據(jù),沒有可以傳null
* @param params post form 提交的參數(shù)
* @return
* @throws IOException
*/
public static String post(String url, Map<String, String> queries, Map<String, String> params) throws IOException {
String responseBody = "";
CloseableHttpClient httpClient = getHttpClient();
StringBuilder sb = new StringBuilder(url);
if (queries != null && queries.keySet().size() > 0) {
boolean firstFlag = true;
Iterator<Map.Entry<String, String>> iterator = queries.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (firstFlag) {
sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());
firstFlag = false;
} else {
sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());
}
}
}
//指定url,和http方式
HttpPost httpPost = new HttpPost(sb.toString());
if (SetTimeOut) {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(SocketTimeout)
.setConnectTimeout(ConnectTimeout).build();//設(shè)置請求和傳輸超時時間
httpPost.setConfig(requestConfig);
}
//添加參數(shù)
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
if (params != null && params.keySet().size() > 0) {
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();
nvps.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue()));
}
}
httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
//請求數(shù)據(jù)
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
logger.debug("Executing request " + httpPost.getRequestLine());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
responseBody = EntityUtils.toString(entity);
logger.debug(responseBody);
EntityUtils.consume(entity);
} else {
logger.debug("http return status error:" + response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
logger.debug("post請求時發(fā)生錯誤~");
} finally {
response.close();
}
return responseBody;
}
/**
* 表單提交
* @param url
* @param queries
* @param params
* @param files
* @return
* @throws Exception
*/
public static String postForm(String url, Map<String, String> queries, Map<String, String> params, Map<String, File> files) throws Exception {
String responseBody = "";
CloseableHttpClient httpClient = getHttpClient();
StringBuilder sb = new StringBuilder(url);
if (queries != null && queries.keySet().size() > 0) {
boolean firstFlag = true;
Iterator<Map.Entry<String, String>> iterator = queries.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (firstFlag) {
sb.append("?" + (String) entry.getKey() + "=" + (String) entry.getValue());
firstFlag = false;
} else {
sb.append("&" + (String) entry.getKey() + "=" + (String) entry.getValue());
}
}
}
//指定url,和http方式
HttpPost httpPost = new HttpPost(sb.toString());
if (SetTimeOut) {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(SocketTimeout)
.setConnectTimeout(ConnectTimeout).build();//設(shè)置請求和傳輸超時時間
httpPost.setConfig(requestConfig);
}
MultipartEntityBuilder form = MultipartEntityBuilder.create();
if (params != null && params.keySet().size() > 0) {
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
StringBody body = new StringBody((String) entry.getValue(), ContentType.create("text/plain", Consts.UTF_8));
form.addPart((String) entry.getKey(), body);
}
}
if(files != null && files.keySet().size() > 0){
Iterator<Map.Entry<String, File>> iterator = files.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, File> entry = iterator.next();
FileBody body9 = new FileBody(entry.getValue());
form.addPart(entry.getKey(), body9);
}
}
HttpEntity entity = form.build();
httpPost.setEntity(entity);
//請求數(shù)據(jù)
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
logger.debug("Executing request " + httpPost.getRequestLine());
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity responseEntity = response.getEntity();
responseBody = EntityUtils.toString(responseEntity);
logger.debug(responseBody);
EntityUtils.consume(responseEntity);
} else {
logger.debug("http return status error:" + response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
logger.debug("post表單時發(fā)生錯誤~");
} finally {
response.close();
}
return responseBody;
};
}