ある不動産の駐車スペースを自動的に奪い取り、使用可能な非常用技術を記録する.
くだらないことを言わない部分のコードは以下の通りで、主に個別の機能点を記録します.
1.HttpsのSSL認証を迂回する:
2.Http要求を送信し、インタフェースがクライアントに書き込まれたHeader情報を取得する:
3.ビルド要求ヘッダ情報:
4.Jsoupデータ解析はすべての世代の駐車スペースを取得する:
5.解析的に特定を取得し、Csrf保護Tokenを抽出する.
6.購入確認:
[原句]残りは時間に任せる.
PS:本論文の目的は,非常用技術点を記録するためであり,以上の擬似コードは直接実行できない.すべてのコード学習が必要な場合は連絡してください.皆さんとの技術交流を楽しみにしています.
1.HttpsのSSL認証を迂回する:
RestTemplate restTemplate = restTemplate();
public RestTemplate restTemplate() {
//
SSLContext sslContext = null;
try {
sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {
return true;
}
}).build();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
//
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}
2.Http要求を送信し、インタフェースがクライアントに書き込まれたHeader情報を取得する:
public String van(String url, HttpMethod method, MultiValueMap parameters) {
HttpHeaders headers = getVankHeaders();
HttpEntity> httpEntity = new HttpEntity(parameters, headers);
ResponseEntity responseEntity = restTemplate.exchange(url, method, httpEntity, String.class);
HttpHeaders entityHeaders = responseEntity.getHeaders();
for (Map.Entry> stringListEntry : entityHeaders.entrySet()) {
StringBuilder content = new StringBuilder("head-key = " + stringListEntry.getKey());
for (String value : stringListEntry.getValue()) {
content.append(" ; value = " + value);
}
System.out.println(content.toString());
}
String postForObject = responseEntity.getBody();
return postForObject;
}
3.ビルド要求ヘッダ情報:
public HttpHeaders getVankHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
headers.add("Accept-Encoding", "gzip, deflate, br");
headers.add("Accept-Language", "zh-cn");
headers.add("Content-Type", "application/x-www-form-urlencoded");
headers.add("Cookie", "");
headers.add("Host", "mfang.van.com");
headers.add("Origin", "");
headers.add("Pragma", "no-cache");
headers.add("Referer", "");
headers.add("Sec-Fetch-Mode", "navigate");
headers.add("Sec-Fetch-Site", "same-origin");
headers.add("Sec-Fetch-User", "?1");
headers.add("Content-Length", "79");
headers.add("User-Agent", "");
headers.add("X-Requested-With", "XMLHttpRequest");
return headers;
}
4.Jsoupデータ解析はすべての世代の駐車スペースを取得する:
/**
*
*
* @return
*/
public Map allList() {
Map idDes = new HashMap();
Document document = Jsoup.parse(van(all, HttpMethod.GET, getHourseListValueMap()));
Elements elementsByTag = document.getElementsByTag("a");
for (Element element : elementsByTag) {
String href = element.attr("href");
String id;
String desc;
if (null == element.select("span").first()) {
desc = element.select("a").first().text();
id = "0";
} else {
id = href.substring(href.indexOf("Details") + 8, href.length());
desc = element.select("span").first().text();
}
idDes.put(Long.parseLong(id), desc);
System.out.println("id = " + id + " ; desc = " + desc);
}
return idDes;
}
5.解析的に特定を取得し、Csrf保護Tokenを抽出する.
/**
* token
*
* @param id
* @return
*/
public String[] detail(long id) {
String allHtml = van(detail + id, HttpMethod.GET, getHourseDetailValueMap(id));
Document document = Jsoup.parse(allHtml);
String token = document.select("input[name=xxx]").first().attr("value");
Elements elementsByTag = document.getElementsByTag("script");
for (Element element : elementsByTag) {
String[] data = element.data().toString().split("var");
for (String datum : data) {
if (datum.contains("=") && datum.contains("activityJson")) {
String val = datum.split("=")[1].trim();
Map parseObject = JSON.parseObject(val.substring(0, val.lastIndexOf(";")), Map.class);
String rowId = parseObject.get("ID").toString();
String CurrentPrice = parseObject.get("CurrentPrice").toString();
String OpenType = parseObject.get("OpenType").toString();
System.out.println(String.format("id = %s ; CurrentPrice = %s ; OpenType = %s", rowId, CurrentPrice, OpenType));
return new String[]{rowId, CurrentPrice, OpenType, token};
}
}
}
return new String[]{};
}
6.購入確認:
/**
*
*
* @param id
* @TODO
*/
public void activityTraget(String id, String price, String openType, String token) throws InterruptedException {
String van = van(addAcivityTarget, HttpMethod.POST, getActivityTargetValueMap(id, price, openType, token));
System.out.println(" = " + van);
Thread.sleep(10);
}
[原句]残りは時間に任せる.
PS:本論文の目的は,非常用技術点を記録するためであり,以上の擬似コードは直接実行できない.すべてのコード学習が必要な場合は連絡してください.皆さんとの技術交流を楽しみにしています.