diff --git a/app/build.gradle b/app/build.gradle index ee835cd..fcdc3c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,7 @@ android { minSdkVersion 23 //noinspection OldTargetApi targetSdkVersion 34 - versionCode 75 + versionCode 76 versionName '2.5.4' resourceConfigurations += ['zh', 'zh-rCN'] diff --git a/app/src/main/java/top/fumiama/copymanga/api/Config.kt b/app/src/main/java/top/fumiama/copymanga/api/Config.kt index 8737e85..c4df5e4 100644 --- a/app/src/main/java/top/fumiama/copymanga/api/Config.kt +++ b/app/src/main/java/top/fumiama/copymanga/api/Config.kt @@ -42,7 +42,7 @@ object Config { field = LazyHeaders.Builder() .addHeader("referer", referer) .addHeader("User-Agent", pc_ua) - .addHeader("source", "copyApp") + .addHeader("source", net_source.value) .addHeader("webp", "1") .addHeader("version", app_ver.value) .addHeader( @@ -81,12 +81,19 @@ object Config { val net_use_gzip = PreferenceBoolean("settings_cat_net_sw_use_gzip", false) val net_use_json = PreferenceBoolean("settings_cat_net_sw_use_json", false) + val net_platform = PreferenceBoolean("settings_cat_net_sw_platform", false) + val net_referer = PreferenceBoolean("settings_cat_net_sw_referer", false) + val net_version = PreferenceBoolean("settings_cat_net_sw_version", false) + val net_region = PreferenceBoolean("settings_cat_net_sw_region", false) + val net_no_webp = PreferenceBoolean("settings_cat_net_no_webp", false) val net_use_comandy = PreferenceBoolean("settings_cat_net_sw_use_comandy", false) val net_use_foreign = PreferenceBoolean("settings_cat_net_sw_use_foreign", false) private val net_use_img_proxy = PreferenceBoolean("settings_cat_net_sw_use_img_proxy", false) val net_use_api_proxy = PreferenceBoolean("settings_cat_net_sw_use_api_proxy", false) val net_img_resolution = PreferenceString(R.string.imgResolutionKeyID) val net_umstring = PreferenceString("settings_cat_net_et_umstring") + val net_source = PreferenceString("settings_cat_net_et_source", R.string.source) + val net_ua = PreferenceString("settings_cat_net_et_ua", "__default_ua__") val view_manga_inverse_chapters = PreferenceBoolean("settings_cat_vm_sw_inverse_chapters", false) val view_manga_always_dark_bg = PreferenceBoolean("settings_cat_vm_sw_always_dark_bg", false) diff --git a/app/src/main/java/top/fumiama/copymanga/api/network/Api.kt b/app/src/main/java/top/fumiama/copymanga/api/network/Api.kt index 1fdf104..2587ec9 100644 --- a/app/src/main/java/top/fumiama/copymanga/api/network/Api.kt +++ b/app/src/main/java/top/fumiama/copymanga/api/network/Api.kt @@ -106,12 +106,19 @@ class Api { }?: DownloadTools.requestApiWithBody(u, method, body, contentType)).decodeToString() r = Gson().fromJson(ret, ReturnBase::class.java) if (r!!.code != 200) { - mu.write { mHostApiUrls.remove(api) } + mu.write { + if (mHostApiUrls.size <= 1) return@write + mHostApiUrls.remove(api) + } } else { return ret } } catch (e: Exception) { - mu.write { mHostApiUrls.remove(api) } + e.printStackTrace() + mu.write { + if (mHostApiUrls.size <= 1) return@write + mHostApiUrls.remove(api) + } } } throw IllegalStateException("错误码${r!!.code}, 信息: ${r!!.message}") diff --git a/app/src/main/java/top/fumiama/copymanga/net/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/net/DownloadTools.kt index d7cbd06..0b1dfde 100644 --- a/app/src/main/java/top/fumiama/copymanga/net/DownloadTools.kt +++ b/app/src/main/java/top/fumiama/copymanga/net/DownloadTools.kt @@ -30,20 +30,23 @@ object DownloadTools { connection.connectTimeout = timeout connection.readTimeout = timeout connection.apply { - setRequestProperty("user-agent", Config.pc_ua) - setRequestProperty("source", "copyApp") + Config.net_ua.value.let { + if (it.isEmpty()) return@let + setRequestProperty("user-agent", if (it == "__default_ua__") Config.pc_ua else it) + } + Config.net_source.value.let { if(it.isNotEmpty()) setRequestProperty("source", it) } // deviceinfo - setRequestProperty("webp", "1") + if (!Config.net_no_webp.value) setRequestProperty("webp", "1") setRequestProperty("dt", SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time)) if (Config.net_use_gzip.value) setRequestProperty("accept-encoding", "gzip") setRequestProperty("authorization", "Token${Config.token.value?.let { tk -> if (tk.isNotEmpty()) " $tk" else "" }}") - setRequestProperty("platform", Config.platform.value) - setRequestProperty("referer", Config.referer) + if (Config.net_platform.value) setRequestProperty("platform", Config.platform.value) + if (Config.net_referer.value) setRequestProperty("referer", Config.referer) if (Config.net_use_json.value) setRequestProperty("accept", "application/json") - setRequestProperty("version", Config.app_ver.value) - setRequestProperty("region", if(!Config.net_use_foreign.value) "1" else "0") + if (Config.net_version.value) setRequestProperty("version", Config.app_ver.value) + if (Config.net_region.value) setRequestProperty("region", if(!Config.net_use_foreign.value) "1" else "0") // device // host Config.net_umstring.value.let { if (it.isNotEmpty()) setRequestProperty("umstring", it) } @@ -59,20 +62,23 @@ object DownloadTools { capsule.url = url capsule.method = method capsule.headers = hashMapOf() - capsule.headers["user-agent"] = Config.pc_ua - capsule.headers["source"] = "copyApp" + Config.net_ua.value.let { + if (it.isEmpty()) return@let + capsule.headers["user-agent"] = if (it == "__default_ua__") Config.pc_ua else it + } + Config.net_source.value.let { if(it.isNotEmpty()) capsule.headers["source"] = it } // deviceinfo - capsule.headers["webp"] = "1" + if (!Config.net_no_webp.value) capsule.headers["webp"] = "1" capsule.headers["dt"] = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).format(Calendar.getInstance().time) if (Config.net_use_gzip.value) capsule.headers["accept-encoding"] = "gzip" capsule.headers["authorization"] = "Token${Config.token.value?.let { tk -> if (tk.isNotEmpty()) " $tk" else "" }}" - capsule.headers["platform"] = Config.platform.value - capsule.headers["referer"] = Config.referer + if (Config.net_platform.value) capsule.headers["platform"] = Config.platform.value + if (Config.net_referer.value) capsule.headers["referer"] = Config.referer if (Config.net_use_json.value) capsule.headers["accept"] = "application/json" - capsule.headers["version"] = Config.app_ver.value - capsule.headers["region"] = if(!Config.net_use_foreign.value) "1" else "0" + if (Config.net_version.value) capsule.headers["version"] = Config.app_ver.value + if (Config.net_region.value) capsule.headers["region"] = if(!Config.net_use_foreign.value) "1" else "0" // device // host Config.net_umstring.value.let { if (it.isNotEmpty()) capsule.headers["umstring"] = it } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e44902c..d12c640 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,9 +4,11 @@ + ]> 拷贝漫画 + &source; 设定 关于 @@ -177,12 +179,26 @@ 告知服务器优先返回GZip格式数据 请求JSON 显式告知服务器返回JSON格式数据 + 请求平台 + 向服务器报告平台版本号 + 请求来源 + 向服务器报告请求来源 + 请求版本号 + 向服务器报告请求版本号 + 请求区域 + 向服务器报告请求区域 + 不请求WebP + 不向服务器报告WebP请求 请求API网址 一般无需更改,除非拷贝漫画官方更改网址,默认:&hosturl; 反向代理 您可以自建反向代理并填写在此处以解决网络不畅 友盟ID 填写您分配到的友盟ID + 请求源 + 默认&source; + 请求UA + 自定义请求UA 使用API代理(需要密钥) 作者自建的API代理,可缓解国内图书详情加载问题,但不保证100%解决,也不保证一直可用 使用图床代理(需要密钥) diff --git a/app/src/main/res/xml/pref_setting.xml b/app/src/main/res/xml/pref_setting.xml index 469a2c6..b9f4821 100644 --- a/app/src/main/res/xml/pref_setting.xml +++ b/app/src/main/res/xml/pref_setting.xml @@ -89,6 +89,36 @@ app:selectable="true" app:summary="@string/settings_cat_net_sm_use_json" app:title="@string/settings_cat_net_sw_use_json" /> + + + + + + +