feat:支持更多验证方式

pull/1841/head
Xwite 3 years ago
parent c389d43e7f
commit 9a46abd17b
  1. 3
      app/src/main/assets/help/jsHelp.md
  2. 2
      app/src/main/assets/updateLog.md
  3. 39
      app/src/main/java/io/legado/app/help/JsExtensions.kt
  4. 18
      app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt

@ -67,6 +67,9 @@ java.webView(html: String?, url: String?, js: String?): String
* @param url 要打开的链接 * @param url 要打开的链接
* @param title 浏览器的标题 * @param title 浏览器的标题
java.startBrowser(url: String, title: String) java.startBrowser(url: String, title: String)
* 使用内置浏览器打开链接,并等待网页结果
java.startBrowserAwait(url: String, title: String): String
``` ```
* 调试 * 调试
``` ```

@ -13,7 +13,7 @@
**2022/05/04** **2022/05/04**
* js添加 getVerificationCode * js添加 getVerificationCode startBrowserAwait
**2022/05/02** **2022/05/02**

@ -135,39 +135,62 @@ interface JsExtensions {
} }
/** /**
* 使用内置浏览器打开链接可用于获取验证码 手动验证网站防爬 * 使用内置浏览器打开链接手动验证网站防爬
* @param url 要打开的链接 * @param url 要打开的链接
* @param title 浏览器页面的标题 * @param title 浏览器页面的标题
*/ */
fun startBrowser(url: String, title: String) { fun startBrowser(url: String, title: String, saveResult: Boolean? = false) {
appCtx.startActivity<WebViewActivity> { appCtx.startActivity<WebViewActivity> {
putExtra("title", title) putExtra("title", title)
putExtra("url", url) putExtra("url", url)
putExtra("sourceVerificationEnable", saveResult)
IntentData.put(url, getSource()?.getHeaderMap(true)) IntentData.put(url, getSource()?.getHeaderMap(true))
} }
} }
/** /**
* 打开验证码对话框等待输入验证码 * 使用内置浏览器打开链接并等待网页结果
*/
fun startBrowserAwait(url: String, title: String): String {
return getVerificationResult(url, title, true)
}
/**
* 打开图片验证码对话框等待返回验证结果
*/ */
fun getVerificationCode(imageUrl: String): String { fun getVerificationCode(imageUrl: String): String {
return getVerificationResult(imageUrl)
}
/**
* 获取书源验证结果
* 图片验证码 防爬 滑动验证码 点击字符 等等
*/
private fun getVerificationResult(url: String, title: String? = "", useBrowser: Boolean? = false): String {
return runBlocking { return runBlocking {
val key = "${getSource()?.getKey() ?: ""}_verificationCode" val source = getSource()
val key = "${source?.getKey() ?: ""}_verificationResult"
CacheManager.delete(key) CacheManager.delete(key)
if (!useBrowser) {
appCtx.startActivity<VerificationCodeActivity> { appCtx.startActivity<VerificationCodeActivity> {
putExtra("imageUrl", imageUrl) putExtra("imageUrl", url)
putExtra("sourceOrigin", getSource()?.getKey()) putExtra("sourceOrigin", source?.getKey())
} }
} else {
startBrowser(url, title, true)
}
var waitUserInput: Boolean = false var waitUserInput: Boolean = false
while(CacheManager.get(key) == null) { while(CacheManager.get(key) == null) {
if (!waitUserInput) { if (!waitUserInput) {
log("等待输入验证码...") log("等待验证...")
waitUserInput = true waitUserInput = true
} }
} }
CacheManager.get(key)!!.let { CacheManager.get(key)!!.let {
if (it.isBlank()) { if (it.isBlank()) {
throw NoStackTraceException("未输入验证码或者验证码为空") throw NoStackTraceException("验证结果为空")
} else { } else {
it it
} }

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.net.Uri import android.net.Uri
import androidx.appcompat.widget.Toolbar
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment 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.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding 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() { constructor(imageUrl: String, sourceOrigin: String? = null) : this() {
arguments = Bundle().apply { arguments = Bundle().apply {
@ -38,7 +44,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
binding.run { binding.run {
toolBar.setBackgroundColor(primaryColor) toolBar.setBackgroundColor(primaryColor)
val sourceOrigin = arguments?.getString("sourceOrigin") val sourceOrigin = arguments?.getString("sourceOrigin")
val key = "${sourceOrigin ?: ""}_verificationCode" val key = "${sourceOrigin ?: ""}_verificationResult"
arguments?.getString("imageUrl")?.let { imageUrl -> arguments?.getString("imageUrl")?.let { imageUrl ->
ImageLoader.load(requireContext(), imageUrl).apply { ImageLoader.load(requireContext(), imageUrl).apply {
sourceOrigin?.let { sourceOrigin?.let {
@ -54,10 +60,6 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
ivImage.setOnClickListener { ivImage.setOnClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin)) showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
} }
ivImage.setOnLongClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
true
}
} }
tvOk.setOnClickListener { tvOk.setOnClickListener {
val verificationCode = binding.verificationCode.text.toString() val verificationCode = binding.verificationCode.text.toString()
@ -74,7 +76,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
override fun onDestroy() { override fun onDestroy() {
val sourceOrigin = arguments?.getString("sourceOrigin") val sourceOrigin = arguments?.getString("sourceOrigin")
val key = "${sourceOrigin ?: ""}_verificationCode" val key = "${sourceOrigin ?: ""}_verificationResult"
CacheManager.get(key) ?: CacheManager.put(key, "") CacheManager.get(key) ?: CacheManager.put(key, "")
super.onDestroy() super.onDestroy()
activity?.finish() activity?.finish()

Loading…
Cancel
Save