diff --git a/app/src/main/assets/help/jsHelp.md b/app/src/main/assets/help/jsHelp.md index 2bbf5018e..a7babf400 100644 --- a/app/src/main/assets/help/jsHelp.md +++ b/app/src/main/assets/help/jsHelp.md @@ -67,6 +67,9 @@ java.webView(html: String?, url: String?, js: String?): String * @param url 要打开的链接 * @param title 浏览器的标题 java.startBrowser(url: String, title: String) + +* 使用内置浏览器打开链接,并等待网页结果 +java.startBrowserAwait(url: String, title: String): String ``` * 调试 ``` diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 6e365bba3..9bd798800 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -13,7 +13,7 @@ **2022/05/04** -* js添加 getVerificationCode +* js添加 getVerificationCode startBrowserAwait **2022/05/02** diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index b931790ba..0b98e81bf 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -135,39 +135,62 @@ interface JsExtensions { } /** - * 使用内置浏览器打开链接,可用于获取验证码 手动验证网站防爬 + * 使用内置浏览器打开链接,手动验证网站防爬 * @param url 要打开的链接 * @param title 浏览器页面的标题 */ - fun startBrowser(url: String, title: String) { + fun startBrowser(url: String, title: String, saveResult: Boolean? = false) { appCtx.startActivity { putExtra("title", title) putExtra("url", url) + putExtra("sourceVerificationEnable", saveResult) IntentData.put(url, getSource()?.getHeaderMap(true)) } } /** - * 打开验证码对话框,等待输入验证码 + * 使用内置浏览器打开链接,并等待网页结果 */ - fun getVerificationCode(imageUrl: String): String { + fun startBrowserAwait(url: String, title: String): String { + return getVerificationResult(url, title, true) + } + + /** + * 打开图片验证码对话框,等待返回验证结果 + */ + fun getVerificationCode(imageUrl: String): String { + return getVerificationResult(imageUrl) + } + + /** + * 获取书源验证结果 + * 图片验证码 防爬 滑动验证码 点击字符 等等 + */ + private fun getVerificationResult(url: String, title: String? = "", useBrowser: Boolean? = false): String { return runBlocking { - val key = "${getSource()?.getKey() ?: ""}_verificationCode" + val source = getSource() + val key = "${source?.getKey() ?: ""}_verificationResult" CacheManager.delete(key) - appCtx.startActivity { - putExtra("imageUrl", imageUrl) - putExtra("sourceOrigin", getSource()?.getKey()) + + if (!useBrowser) { + appCtx.startActivity { + putExtra("imageUrl", url) + putExtra("sourceOrigin", source?.getKey()) + } + } else { + startBrowser(url, title, true) } + var waitUserInput: Boolean = false while(CacheManager.get(key) == null) { if (!waitUserInput) { - log("等待输入验证码...") + log("等待验证...") waitUserInput = true } } CacheManager.get(key)!!.let { if (it.isBlank()) { - throw NoStackTraceException("未输入验证码或者验证码为空") + throw NoStackTraceException("验证结果为空") } else { it } diff --git a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt index 568800b29..244654d10 100644 --- a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import android.net.Uri +import androidx.appcompat.widget.Toolbar import com.bumptech.glide.request.RequestOptions import io.legado.app.R import io.legado.app.base.BaseDialogFragment @@ -17,8 +18,13 @@ import io.legado.app.utils.setLayout import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding -//图片验证码输入对话框 -class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification_code_view) { +/** + * 图片验证码对话框 + * 结果保存在数据库中 + * val key = "${sourceOrigin ?: ""}_verificationResult" + * CacheManager.get(key) + */ +class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification_code_view), Toolbar.OnMenuItemClickListener { constructor(imageUrl: String, sourceOrigin: String? = null) : this() { arguments = Bundle().apply { @@ -38,7 +44,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification binding.run { toolBar.setBackgroundColor(primaryColor) val sourceOrigin = arguments?.getString("sourceOrigin") - val key = "${sourceOrigin ?: ""}_verificationCode" + val key = "${sourceOrigin ?: ""}_verificationResult" arguments?.getString("imageUrl")?.let { imageUrl -> ImageLoader.load(requireContext(), imageUrl).apply { sourceOrigin?.let { @@ -54,10 +60,6 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification ivImage.setOnClickListener { showDialogFragment(PhotoDialog(imageUrl, sourceOrigin)) } - ivImage.setOnLongClickListener { - showDialogFragment(PhotoDialog(imageUrl, sourceOrigin)) - true - } } tvOk.setOnClickListener { val verificationCode = binding.verificationCode.text.toString() @@ -74,7 +76,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification override fun onDestroy() { val sourceOrigin = arguments?.getString("sourceOrigin") - val key = "${sourceOrigin ?: ""}_verificationCode" + val key = "${sourceOrigin ?: ""}_verificationResult" CacheManager.get(key) ?: CacheManager.put(key, "") super.onDestroy() activity?.finish()