Пользовательский агент Android в URLConnection

#java #android #http #user-agent #urlconnection

#java #Android #http #пользовательский агент #urlconnection

Вопрос:

Я пытаюсь «обмануть» Google Finance, заставив думать, что я веб-браузер, изменив свойство user agent в моем соединении. Однако ответ, который я получаю, по-прежнему не соответствует тому, что я должен получать при использовании реального веб-браузера. Мне было интересно, почему это так, и что мне нужно сделать, чтобы это сработало? Вот соответствующий код («сайт» является https://www.google.co.uk/finance/converter?a=1amp;from=GBPamp;to=USD ):

 protected static String readURL(String site) {
    StringBuilder buff = new StringBuilder();
    try {
        HttpURLConnection conn = (HttpURLConnection) new URL(site).openConnection();
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393");
        conn.connect();
        BufferedReader bfr = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        while ((inputLine = bfr.readLine()) != null)
            buff.append(inputLine).append('n');
        bfr.close();
    }
    catch (Exception ioe) {
        System.err.println("Failed to read from "" site "": " ioe.getMessage());
    }
    return buff.toString();
}
  

РЕДАКТИРОВАТЬ: я должен отметить, что это в приложении для Android, а не в Java. Он также не отображается пользователю в WebView или в чем-либо еще, это происходит в фоновом режиме.

Комментарии:

1. Что вы получаете в ответ? Кроме того, я не уверен, почему вы пытаетесь загрузить динамическую форму

2. Чем это отличается от того, что вы ожидаете? Мое первое предположение заключается в том, что часть ожидаемого вами DOM фактически создается JavaScript во время выполнения, а не частью HTML, и это может объяснить несоответствие.

3. Я не могу опубликовать здесь полный HTML, это было бы слишком многословно. Но это не имеет ничего общего с DOM или JavaScript. Моя проблема в том, что я получаю ответ от браузера, и программные запросы сильно отличаются; и это может быть только потому, что Google знает, что я не использую «настоящий» веб-браузер. Фактически, я знаю это, потому что я делал это раньше, и это сработало, но Google, должно быть, недавно изменил свой сайт, чтобы обнаруживать автоматические запросы.

Ответ №1:

Веб-форма, похоже, ведет себя нормально, не сталкиваясь с пользовательским агентом. Этот запрос на модификацию возвращает действительный ответ:

 D/TAG: currency_converter_result>5 GBP = <span class=bld>6.3645 USD
  

Запрос на модификацию:

       final Map<String,String> fieldMap = new HashMap<>();

      fieldMap.put("a","5");
      fieldMap.put("from","GBP");
      fieldMap.put("to","USD");

      RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), "");
      final Retrofit retrofit = new Retrofit.Builder()
               .baseUrl("https://www.google.co.uk")
               .build();

         final ConversionService wService = retrofit.create(ConversionService.class);
         Call<ResponseBody> data  = wService.convertCurrency(fieldMap);

         data.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
               String resp = "";

               if ( response.body() != null ) {
                  try {
                     resp = response.body().string();
                     int index = resp.indexOf("currency_converter_result" );
                     int end = resp.indexOf("</span>", index );
                     String result = resp.substring(index, end);
                     Log.d("TAG", result);
                  } catch ( IOException e) {
                  }
               }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

               Log.e(TAG,"Failure");
            }
         });

   }
  

ConversionService.java

 public interface ConversionService {

   @GET("/finance/converter")
   Call<ResponseBody> convertCurrency(@QueryMap Map<String,String> queryMap);
}
  

Комментарии:

1. Я хотел бы иметь возможность делать это без использования каких-либо дополнительных библиотек.