使用Retrofit(Kotlin)发起HTTP请求时遭遇403错误的解决咨询
解决Retrofit请求Apkpure搜索接口返回403错误的问题
问题核心
服务器返回403且错误体包含Just a moment...,说明这是Cloudflare人机验证机制在拦截程序化请求。仅添加User-Agent不足以绕过,Cloudflare会验证请求头的完整特征,甚至检查浏览器运行环境。
解决方案
1. 模拟浏览器完整请求头
先在浏览器中访问目标URL,按F12打开开发者工具→切换到Network标签→找到对应GET请求→复制Request Headers中的所有关键字段,在OkHttp拦截器中全部添加:
val okHttpClient = OkHttpClient.Builder() .addInterceptor { chain -> val originalRequest = chain.request() val modifiedRequest = originalRequest.newBuilder() // 复制当前浏览器的User-Agent(建议用最新版本) .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") // 添加浏览器的Accept头 .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") // 添加Accept-Language头 .header("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3") // 添加Referer头 .header("Referer", "https://apkpure.com/") // 复制浏览器请求中的Cookie(注意Cookie可能过期,需定期更新) .header("Cookie", "此处粘贴浏览器中的Cookie内容") .build() chain.proceed(modifiedRequest) } .build() val retrofit = Retrofit.Builder() .baseUrl("https://apkpure.com/") .client(okHttpClient) .addConverterFactory(ScalarsConverterFactory.create()) .build() .create(ApiService::class.java)
2. 优化Retrofit接口定义(更规范)
将硬编码的查询参数改为@Query传递,方便后续动态修改搜索关键词:
interface ApiService { @GET("search") suspend fun searchResults( @Query("q") query: String, @Query("t") t: String = "" ): Response<String> } // 调用示例 retrofit.searchResults("free+fire")
3. 处理Cloudflare高级验证(进阶)
如果添加完整请求头后仍返回403,说明Cloudflare启用了JavaScript挑战。这种情况Retrofit无法直接处理,可尝试:
- 使用WebView先加载目标页面,完成人机验证后提取Cookie,再用Retrofit携带该Cookie发起请求。
- 查找Apkpure官方公开API(若存在),避免爬取网页内容。
注意事项
- Cookie存在过期时间,需定期从浏览器或WebView中更新。
- 爬取网站内容需遵守目标网站的
robots.txt和服务条款,避免违规操作。
内容的提问来源于stack exchange,提问作者TDKMS
相关产品推荐
相关产品推荐

