为什么服务器检测应用程序为机器人,而不是Android版本?

时间:2017-07-20 20:59:38

标签: android retrofit2 okhttp

我正在尝试使用retrofit 2.0和OkHTTP库构建一个应用程序。现在的问题是,当我从移动浏览器点击服务器时,它会检测到我的Android版手机。但是当我通过我的应用程序点击服务器时,服务器会将其检测为机器人。所以我的应用程序如何检测我的手机,因为将来服务器将限制机器人类型访问。

2 个答案:

答案 0 :(得分:3)

可以使用user-agent标题

通过在改造对象中插入自定义OkHttpClient,您可以将自定义标头注入所有http请求的默认标头。

例如,您要添加的自定义标题是:

'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();

答案 1 :(得分: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未被检测为机器人的请求。