ある不動産の駐車スペースを自動的に奪い取り、使用可能な非常用技術を記録する.

6291 ワード

くだらないことを言わない部分のコードは以下の通りで、主に個別の機能点を記録します.
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:本論文の目的は,非常用技術点を記録するためであり,以上の擬似コードは直接実行できない.すべてのコード学習が必要な場合は連絡してください.皆さんとの技術交流を楽しみにしています.