Ошибка HttpClient: попробуйте включить файлы cookie или отключить приватный режим.

Я попытался OAuth войти в Instagram с помощью HttpClient(4.3), но получил следующее сообщение об ошибке:

Эта страница не может быть загружена. Если в вашем браузере отключены файлы cookie или вы просматриваете сайт в приватном режиме, попробуйте включить файлы cookie или отключить приватный режим, а затем повторите попытку.

Я потратил три дня, чтобы попробовать все способы, которые я могу сделать, чтобы установить файлы cookie в почтовом запросе, но я так и не решил эту проблему!

Кто может мне помочь?

Этапы моей работы:

1. Get login page with HttpGet.
2. Parse Cookie from response.
3. Parse form action from response.
4. Parse form fields from response.
5. Set Cookie to HttpPost.
6. Set form fields to HttpPost.
7. Post the form.
8. Get the error message.

Код:

  1. Init HttpClient:

        RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
        CookieStore cookieStore = new BasicCookieStore();
        HttpClientContext context = HttpClientContext.create();
        context.setCookieStore(cookieStore);
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build();
    
  2. Отправить запрос на получение страницы входа:

        HttpGet get = new HttpGet(url);
        get.setHeader(
                "User-Agent",
                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
    
        HttpResponse response = httpClient.execute(get);
    
  3. Получить куки:

    private Map<String, String> getCookies(HttpResponse response) {
        Map<String, String> cookieMap = new HashMap<String, String>();
        Header[] headers = response.getAllHeaders();
        for (int i = 0; i < headers.length; i++) {
            if (headers[i].getName().equals("Set-Cookie")) {
                String cookie = headers[i].getValue();
                String[] pairs = cookie.split(";");
                for(String pair: pairs){
                    String[] keyValue = pair.split("=");
                    String cookieName = keyValue[0];
                    String cookieValue = keyValue[1];
                    cookieMap.put(cookieName, cookieValue);
                }
            }
        }
        return cookieMap;
    }
    
  4. Получить поля формы:

    // org.htmlparser.Parser
    private static Map<String, String> getFormFields(NodeList list,
        String keyword) {
    
        Map<String, String> responeMap = new HashMap<String, String>();
        SimpleNodeIterator iterator = list.elements();
        while (iterator.hasMoreNodes()) {
            Node node = iterator.nextNode();
            NodeList childList = node.getChildren();
            if (null == childList) {
                if (node instanceof InputTag) {
                    InputTag d = (InputTag) node;
                    if (d.getAttribute("name") != null)
                        responeMap.put(d.getAttribute("name"),
                            d.getAttribute("value"));
                }
            } else {
                if(node instanceof FormTag){
                    FormTag d = (FormTag)node;
                    loginAction  = d.getAttribute("action");
                }
                responeMap.putAll(processNodeList(childList, keyword));
            }
        }
    
        return responeMap;
    }
    
  5. Почтовая форма:

        HttpPost post = new HttpPost(loginUrl);
    
        post.setHeader(
                "User-Agent",
                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
        if (cookieMap.size() > 0) {
            post.setHeader("Cookie", buildCookies(cookieMap));
        }
    
        UrlEncodedFormEntity uef = new UrlEncodedFormEntity(pairs, "UTF-8");
        post.setEntity(uef);
    
        response = httpClient.execute(post);
    
  6. Получить сообщение об ошибке

Эта страница не может быть загружена. Если в вашем браузере отключены файлы cookie или вы просматриваете сайт в приватном режиме, попробуйте включить файлы cookie или отключить приватный режим, а затем повторите попытку.


person Liu guanghua    schedule 23.06.2015    source источник


Ответы (1)


Я тоже потратил некоторое время на эту задачу, и я решил эту проблему, обработав все заголовки и готовя самостоятельно, потому что httpClient не может сделать это правильно. Мой пример для метода POST:

public String sendPostLoginRequest(){
    String htmlResponse = "";
    String loc = "";
    String url = "https://instagram.com"+action;
    System.out.println(url);
    httpPost = new HttpPost(url);
    httpPost.setHeader("Host", "instagram.com");
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0");
    httpPost.setHeader("Accept",
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httpPost.setHeader("Accept-Language", "en-US,en;q=0.5");
    httpPost.setHeader("Cookie", cook);
    httpPost.setHeader("Connection", "keep-alive");
    httpPost.setHeader("Referer", "https://instagram.com/accounts/login/?force_classic_login=&next=/oauth/authorize/%3Fclient_id%HERE_SHOULD_BE_CLIENT_ID%26redirect_uri%3Dhttp%3A//localhost%26response_type%3Dcode");
    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
    List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    nvps.add(new BasicNameValuePair(hidenName, hidenValue));
    nvps.add(new BasicNameValuePair("username", login));
    nvps.add(new BasicNameValuePair("password", password));
    try {
        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
        CloseableHttpResponse response2 = httpclient.execute(httpPost);
        System.out.println(response2.getStatusLine());
        HttpEntity entity2 = response2.getEntity();
        Header headerLoc = response2.getFirstHeader("Location");


        BufferedReader bf = new BufferedReader(new InputStreamReader(entity2.getContent()));

        while (bf.ready()){
            String s = bf.readLine();
            htmlResponse = htmlResponse + s;
            System.out.println(s);
        }
        setCookies(response2.getFirstHeader("Set-Cookie") == null ? "" :
                response2.getFirstHeader("Set-Cookie").toString());
        loc = headerLoc.getValue();
        System.out.println(loc);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return loc;
}

Меняю переменную "cook" после каждого запроса. HttpClient обычно получает первый файл cookie и не меняет его после следующих запросов к текущему домену. Кроме того, HttpClientSo не обрабатывает переадресацию, поэтому вам следует написать запрос на e-mail.

person WorieN    schedule 24.06.2015