2017-07-20 8 views
1

retrofit 2.0とOkHTTP libraryを使用してアプリケーションを構築しようとしています。ここで問題は、モバイルブラウザからサーバーを起動し、アンドロイド版で自分の電話を検出することです。しかし、アプリケーションを介してサーバーにアクセスすると、サーバーがロボットとして検出します。アプリケーションを使用して自分の電話を検出するにはどうすればいいですか。将来のサーバーではロボットタイプのアクセスが制限されるためです。なぜサーバーがAndroidの代わりにロボットとしてアプリケーションを検出するのですか?

+0

は私達にあなたのコード、改造を使用し、特に1を示して – faruk

+0

私はしています - 'OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addInterceptor(新しいインターセプタ(){ @Override(チェーン鎖)IOExceptionがスロー 公共okhttp3.Responseインターセプト{ 要求元= chain.request(); Request.Builder requestBuilder = original.newBuilder() .header( "ユーザエージェント"、 "ユーザエージェント"); リクエスト要求= requestBuilder.build(); 戻りchain.proceed(リクエスト); }}); ' –

+0

とthen- ' Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory( GsonConverterFactory.create()); 改装後の改造= builder.client(httpClient.build()) 。ビルド(); loginAPI = retrofit.create(LoginAPI.class); ' –

答えて

2

あなたはあなたが改造対象でカスタムOkHttpClientを挿入することにより、すべてのHTTPリクエストのデフォルトのヘッダーとしてカスタムヘッダを注入することができuser-agentヘッダ

を使用することができますように。

たとえば、追加したいカスタムヘッダは次のとおりです。

'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' 

次に、あなたの改造コードは次のようにする必要があります:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
httpClient.addInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(Interceptor.Chain chain) throws IOException { 
      Request original = chain.request(); 

      // Request customization: add request headers 
      Request.Builder requestBuilder = original.newBuilder() 
        .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"); // <-- this is the important line 

      Request request = requestBuilder.build(); 
      return chain.proceed(request); 
     } 
}); 
OkHttpClient mClient = httpClient.build(); 

Gson gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(YOUR_BASE_URL) 
     .client(mClient) 
     .addConverterFactory(GsonConverterFactory.create(gson)) 
     .build(); 
+0

ありがとうございました。 –

1

これは、User-Agentヘッダーまたはいくつかの追加ヘッダーが混在している可能性が最も高いです。より複雑なケースは、クライアントがjavascriptを実行しているかどうかをサーバーがチェックしていれば、より複雑な可能性があります。送信しているヘッダーを記録してみてください。

Logger log = LoggerFactory.getLogger(HttpClient.class); 
HttpLoggingInterceptor loggingInterceptor = 
    new HttpLoggingInterceptor((msg) -> { 
     log.debug(msg); 
}); 
loggingInterceptor.setLevel(Level.BODY); 

// pass this client into Retrofit 
OkHttpClient networkInterceptorClient = new OkHttpClient.Builder() 
    .addNetworkInterceptor(HttpClient.getLoggingInterceptor()) 
    .build(); 

これは、送信されているすべてのヘッダーを含めて、非常にdetailed OkHttp loggingになります。インターセプタを追加して、すべてのHTTPリクエストでユーザエージェントをオーバーライドし、ブラウザベースのものを選択して、サーバにWebブラウザを使用していると思うようにすることができます。

これでうまくいかない場合は、さまざまなヘッダーを比較し続け、ロボットとして検出されないcURLでリクエストを作成できるかどうかを確認してください。

関連する問題