retrofit 2.0とOkHTTP libraryを使用してアプリケーションを構築しようとしています。ここで問題は、モバイルブラウザからサーバーを起動し、アンドロイド版で自分の電話を検出することです。しかし、アプリケーションを介してサーバーにアクセスすると、サーバーがロボットとして検出します。アプリケーションを使用して自分の電話を検出するにはどうすればいいですか。将来のサーバーではロボットタイプのアクセスが制限されるためです。なぜサーバーがAndroidの代わりにロボットとしてアプリケーションを検出するのですか?
1
A
答えて
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
でリクエストを作成できるかどうかを確認してください。
関連する問題
- 1. なぜ2,3の代わりに出力2,0ですか?
- 2. サーバー上のロボットを検出しますか?
- 3. JRubyの代わりにRubyを使用することを検討しているのはなぜですか?
- 4. なぜSQLサーバーが正しい値の代わりにテーブルに0の値を挿入するのですか?
- 5. なぜ `update_wrapper`の代わりに` wrap`をデコレータとして使うのですか?
- 6. SpringBootとSitemeshの出力をレンダリングする代わりに、ブラウザがファイルをダウンロードするのはなぜですか?
- 7. ftpサーバー上のファイルを検索する代わりに?
- 8. シングルの代わりにダブルクリックするのはなぜですか?
- 9. なぜAndroidのスタジオはカレンダーの代わりにCalendarContract.Calendarsを使用しますか?
- 10. なぜCUPSはhttpdを使用する代わりにWebサーバーを出荷しますか?
- 11. Windows 10のアプリケーションでOnActivatedの代わりにOnLaunchedを使用しているToast通知はなぜですか?
- 12. sympyが `__init__`の代わりに` __new__`をオーバーライドするのはなぜですか?
- 13. MySQLがBIT(1)の代わりにBooleanをTINYINT(1)として解釈するのはなぜですか?
- 14. PHP 5がclassName()の代わりに__contruct()をコンストラクタとして使用するのはなぜですか?
- 15. WCFサービスでURLの代わりにサーバーがマシン名を返すのはなぜですか?
- 16. laravelがEloquentモデルの代わりにコントローラで検証を定義するのはなぜですか?
- 17. なぜ代わりに+
- 18. なぜAssembly.LoadFromの代わりにAssembly.LoadFileを使用しますか?
- 19. www-dataの代わりにApache 2.4がローカルユーザーとして実行されているのはなぜですか?
- 20. catch(...)によってキャッチされる代わりに_CxxUnhandledExceptionFilterが呼び出されるのはなぜですか?
- 21. MetroGridHelperの代わりになるAndroid
- 22. ASP.NET MVC5 Webアプリケーションの代わりにMessageBox.Showの代わりになるもの
- 23. Node.jsサーバーがHTML Webページの代わりにHTMLコードを返すのはなぜですか?
- 24. なぜ44の代わりに48のサイズですか?
- 25. phpフォームの妥当性検査 - メールアドレスの代わりにメールアドレスと乱数の代わりにpseudopasswordをメールアドレスの代わりにユニークな識別子として
- 26. JavaにNullReferenceExceptionの代わりにNullPointerExceptionがあるのはなぜですか?
- 27. ArrayListにsize()の代わりにgetSize()がないのはなぜですか?
- 28. なぜFirebaseが辞書の代わりに配列を返すのですか?
- 29. サーバーの代わりにGoogleドライブを使用することができます
- 30. Android:いつ/なぜフラグメントの代わりにFrameLayoutを使用する必要がありますか?
は私達にあなたのコード、改造を使用し、特に1を示して – faruk
私はしています - 'OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addInterceptor(新しいインターセプタ(){ @Override(チェーン鎖)IOExceptionがスロー 公共okhttp3.Responseインターセプト{ 要求元= chain.request(); Request.Builder requestBuilder = original.newBuilder() .header( "ユーザエージェント"、 "ユーザエージェント"); リクエスト要求= requestBuilder.build(); 戻りchain.proceed(リクエスト); }}); ' –
とthen- ' Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory( GsonConverterFactory.create()); 改装後の改造= builder.client(httpClient.build()) 。ビルド(); loginAPI = retrofit.create(LoginAPI.class); ' –