feat(LoginUI): 按钮支持调用登录URL规则里的函数

pull/2567/head
Xwite 3 years ago committed by Xwite
parent 84aaa843b5
commit 819ff112d4
  1. 20
      app/src/main/assets/help/ruleHelp.md
  2. 5
      app/src/main/assets/updateLog.md
  3. 3
      app/src/main/java/io/legado/app/data/entities/BaseSource.kt
  4. 10
      app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt

@ -23,6 +23,7 @@
* 登录UI * 登录UI
> 不使用内置webView登录网站,需要使用`登录URL`规则实现登录逻辑,可使用`登录检查JS`检查登录结果 > 不使用内置webView登录网站,需要使用`登录URL`规则实现登录逻辑,可使用`登录检查JS`检查登录结果
> 版本20221113重要更改:按钮支持调用`登录URL`规则里面的函数,必须实现`login`函数
``` ```
规则填写示范 规则填写示范
[ [
@ -42,12 +43,25 @@
{ {
name: "获取验证码", name: "获取验证码",
type: "button", type: "button",
action: "java.ajax(...)" action: "getVerificationCode()"
} }
] ]
按钮的action为JavaScript时获取登录信息 ```
* 登录URL
> 可填写登录链接或者实现登录UI的登录逻辑的JavaScript
```
示范填写
function login() {
java.log("模拟登录请求");
java.log(source.getLoginInfoMap());
}
function getVerificationCode() {
java.log("登录UI按钮:获取到手机号码"+result.get("telephone"))
}
登录按钮函数获取登录信息
result.get("telephone") result.get("telephone")
点击确定登录后在js中获取读取登录信息 login函数获取登录信息
source.getLoginInfo() source.getLoginInfo()
source.getLoginInfoMap().get("telephone") source.getLoginInfoMap().get("telephone")
source登录相关方法,可在js内通过source.调用,可以参考阿里云语音登录 source登录相关方法,可在js内通过source.调用,可以参考阿里云语音登录

@ -11,10 +11,11 @@
* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
**2022/11/12** **2022/11/13**
* 订阅添加js注入 * 订阅添加js注入
* 登录按钮支持js by Xwite * 重要更改:登录按钮支持调用登录URL里的函数 by Xwite
* 书源编辑时可修改书源变量,添加平板双页,其他优化 by Horis
**2022/11/08** **2022/11/08**

@ -49,9 +49,10 @@ interface BaseSource : JsExtensions {
} }
} }
// 调用login函数 实现登录请求
fun login() { fun login() {
getLoginJs()?.let { getLoginJs()?.let {
evalJS(it) evalJS("$it\nif(typeof login=='function'){login.apply(this);}else{throw('Function login not implements!!!')}")
} }
} }

@ -70,11 +70,13 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) {
context?.openUrl(rowUi.action!!) context?.openUrl(rowUi.action!!)
} else { } else {
// JavaScript // JavaScript
rowUi.action?.let { rowUi.action?.let { buttonFunctionJS ->
kotlin.runCatching { kotlin.runCatching {
source.evalJS(it) { source.getLoginJs()?.let { loginJS ->
source.evalJS("$loginJS\n$buttonFunctionJS") {
put("result", getLoginData(loginUi)) put("result", getLoginData(loginUi))
} }
}
}.onFailure { }.onFailure {
AppLog.put("LoginUI Button ${rowUi.name} JavaScript error", it) AppLog.put("LoginUI Button ${rowUi.name} JavaScript error", it)
} }
@ -128,9 +130,8 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) {
dismiss() dismiss()
} }
} else if (source.putLoginInfo(GSON.toJson(loginData))) { } else if (source.putLoginInfo(GSON.toJson(loginData))) {
source.getLoginJs()?.let {
try { try {
source.evalJS(it) source.login()
context?.toastOnUi(R.string.success) context?.toastOnUi(R.string.success)
withContext(Main) { withContext(Main) {
dismiss() dismiss()
@ -143,7 +144,6 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) {
} }
} }
} }
}
override fun onDismiss(dialog: DialogInterface) { override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog) super.onDismiss(dialog)

Loading…
Cancel
Save