2016-10-04 7 views
1

私は、私の接続でユーザーエージェントのプロパティを変更することによって、Google Financeがウェブブラウザであると考えるように「Google Finance」を「欺く」ことを試みています。しかし、私が戻ってくる応答は、実際のWebブラウザを使用したときに得られるものではありません。私はこれがなぜ、そしてそれが機能するために私がする必要があるのだろうと思っていましたか?ここでは、関連するコードがある(「サイト」はhttps://www.google.co.uk/finance/converter?a=1&from=GBP&to=USDです):URLConnectionのAndroidユーザーエージェント

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 1。 WebViewなどでユーザーに表示されることもなく、バックグラウンドで発生します。

+0

* *あなたが戻って取得するのですか何この改造要求は有効な応答を返しますか?また、私はなぜあなたが動的なフォームをロードしようとしているのか分かりません –

+0

どのような方法でそれはあなたが期待しているものと異なるのですか?私の最初の推測は、あなたが期待しているDOMの一部が、HTMLの一部ではなく、実行時にJavaScriptによって実際に構築され、それが不一致を説明するかもしれないということです。 –

+0

ここに完全なHTMLを投稿することはできません。あまりにも冗長です。しかし、それはDOMやJavaScriptとは関係ありません。私の問題は、ブラウザから取得したもので、プログラムによるクエリは大きく異なります。それは、私が「本当の」ウェブブラウザを使用していないことをGoogleが知っているからだけである。私が以前にやったことがあるので、私はこれを知っていますが、それはうまくいっていますが、Googleは最近自動クエリを検出するためにサイトを変更したに違いありません。 –

答えて

0

ウェブフォームは、ユーザーエージェントを使用せずに正常に動作するようです。

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); 
} 
+0

これを行うには、追加のライブラリを使用しないでください。 –

関連する問題