Получение ошибки 503 с HttpUrlConnection, но загрузка сайта в браузере - PullRequest
0 голосов
/ 17 июня 2020
     url = "https://www.lmcu.org/?__cf_chl_jschl_tk__=9c114404052361017d9cfe1247981e24813649c7-1592389426-0-AfP07ha5TxZHf64q5tb5nJf9BJguC4U553-OJzJWivTqfgwYLqUODkXj-XsOjZTwpC71ROxHWx4Xhdp2S0LgAVlKgXpy7KWOex7lkoGBm8mNpBsCeJapdYNWty-X2oHE6gp_TtMfH0dcBabvWr_mXV1djsVR_IGlYJA-wCuZpPTGOozyzN9TFwjMPxU-3o6BIUxTh6DDcHmJ_Bw48EYKGpq6n57bVdeLezEs9PduataW1JUcF4GqLE2EHiUxWGubtS8YgcxkkGin4zitHXENMbFi1kMhxI77LsORzKyhkAD1OkG8fGmV--Cgd3EpxWHtHD5vpoIFFIwX0uGQywPnegs";

     HttpURLConnection connection = pingHttpUrl(url);
     responseCode = connection.getResponseCode();

     public HttpURLConnection pingHttpUrl(String url) throws IOException {

        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setRequestMethod("GET");

            conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76 Safari/537.36");
            conn.setConnectTimeout(2000);
            conn.setInstanceFollowRedirects(false);
            conn.setReadTimeout(10000);
            conn.connect();
            Thread.sleep(1000);
        } catch (Exception e) {
            logger.error("Caught exception : {}", e.getMessage());
            throw new IOException();
        }

        return conn;
     }

Это дает код ответа 503. Но сайт правильно загружается в браузере. В чем может быть проблема?

1 Ответ

1 голос
/ 18 июня 2020

Проблема с заголовками запроса. Я обнаружил, что это решение, размещенное на cloudflare, требует, чтобы два заголовка были такими, иначе вы получите ответ 503:

  • User-Agent - ваш заголовок указан chrome версия 76 , видимо у сервера проблема с этим. Я добился успеха с этим значением User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
  • cook ie - я обнаружил, что нужно установить значение cook ie cf_clearance и, возможно, другие set-cookie значения, которые возвращаются по первому запросу. Это значение связано с поддержкой Cloudflare для доступа к конфиденциальности (https://blog.cloudflare.com/cloudflare-supports-privacy-pass/). Похоже, что это средство проверки того, что пользователь - человек, а не машина. Что, в свою очередь, является плохой новостью для ваших усилий.

У меня есть рабочее решение, приведенное ниже, но его будет сложно автоматизировать, поскольку для этого потребуется установить sh сеанс браузера и используйте повар ie, установленный в коде. По истечении срока действия cf_clearance cook ie вам придется снова посетить сайт и сбросить значение cook ie в коде.

Я бы также предположил, что заголовок запроса User-Agent является используется при создании cf_clearance cook ie, который требуется. Это затрудняет захват повара ie, так как вам придется использовать соответствующий User-Agent браузера, используемого для запроса, когда cf_clearance cook ie был сгенерирован cloudflare.

У меня есть журналируемых свое исследование здесь:

1028 * При посещении URL в браузере: 1030 *https://www.lmcu.org/? cf_chl_jschl_tk = 9c114404052361017d9cfe1247981e24813649c7-1592389426-0-AfP07ha5TxZHf64q5tb5nJf9BJguC4U553-OJzJWivTqfgwYLqUODkXj-XsOjZTwpC71ROxHWx4Xhdp2S0LgAVlKgXpy7KWOex7lkoGBm8mNpBsCeJapdYNWty -X2oHE6gp_TtMfH0dcBabvWr_mXV1djsVR_IGlYJA-wCuZpPTGOozyzN9TFwjMPxU-3o6BIUxTh6DDcHmJ_Bw48EYKGpq6n57bVdeLezEs9PduataW1JUcF4GqLE2EHiUxWGubtS8YgcxkkGin4zitHXENMbFi1kMhxI77LsORzKyhkAD1OkG8fGmV - Cgd3EpxWHtHD5vpoIFFIwX0uGQywPnegs 1037 * И инспектирование ответ, что сервер дает, то получается, что это Infact дает обратно 503, а также: 1040 * Image of browser developer console, with network output

По некоторым резонансам, которые я не могу разобрать, браузер перенаправляется на belo w URL вместо этого. Я не вижу, что заголовок местоположения передается обратно в ответ, или не могу найти этот URL в любом месте ответа.

1047 *https://www.lmcu.org/? cf_chl_jschl_tk = fe835fdc1e7e2f5b2857ab5eb4be84e67d0e8c42-1592506549-0-AQ3E1piNGHg7O7lxgRyItR1U5BzB52q7GmCHe_HPJBsUHv8RcZCgqLPPtyngPmDjvy7pZDprPNK6ihKVEgQ7HqmbDSPXZ1aHPkBDs9re49u_Q_jI04etmtK7E0GIdxhKWCd-p4TR7b_b0JdnwzJOF6z4XaJQOgNU8kazJr5Mo96zxQpUlsKWPSumEmSfynkGeMDgkM-O1mN59LKp0p4kt-2O2IIFrlc8289ZbCSO6JghtvDsLsFDA3VxLV3Irn2W3KQ8sHg_TdwB-0g0WX9J-WTwedVYzj2a7uNtH377ZIritTXKqRw1qeQ6mkpxQ0h_OVMIl8XUiEC0Zj1KP50tUK8 1054 * Я проверил с Почтальон , и, конечно же, я тоже получил ошибку 503. Насколько я мог судить, сервер (или обратный прокси перед ним) проверял заголовки запроса и на их основе аннулировал запрос. Я немного пошутил, переместив заголовки из запроса браузера в Postman, и, наконец, понял, что это комбинация установленных заголовков cookie и User-Agent, которая позволяет обрабатывать запрос.

Заголовок User-Agent не может иметь указанную версию chrome, у меня он работает с версией 83 здесь. Заголовок cookkie - это то, что браузер будет заполнять при моем первом посещении сайта в браузере. Так что это немного сложнее обработать в вашем коде. Я попытался получить его в коде с connection.getHeaderField("set-cookie"), но этот повар ie, похоже, не вырезал его.

Но! Я смог заставить код работать, когда взял cookie из своего браузера и вручную установил его в коде вместе с User-Agent:

    public HttpURLConnection pingHttpUrl(String url) throws IOException {

        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setRequestMethod("GET");

            // This one does not work for the reason of the chrome version apparently
            // conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76 Safari/537.36");
            conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
            conn.addRequestProperty("cookie", "<cookie value from the browser, from the header on a successful request>");

            conn.setConnectTimeout(2000);
            conn.setInstanceFollowRedirects(false);
            conn.setReadTimeout(10000);
            conn.connect();
            Thread.sleep(1000);
        } catch (Exception e) {
            System.out.println(String.format("Caught exception : %s", e.getMessage()));
            throw new IOException();
        }

        return conn;
    }

. Позже я узнал, что это cook ie значение из ключа cf_clearance в cook ie, которое имеет значение.

...