Преглед изворни кода

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

Xwite пре 4 година
родитељ
комит
dc6e021816

+ 18 - 4
app/src/main/assets/help/ruleHelp.md

@@ -22,7 +22,8 @@
 > 启用后会自动保存每次返回头中的Set-Cookie中的值,适用于验证码图片一类需要session的网站
 > 启用后会自动保存每次返回头中的Set-Cookie中的值,适用于验证码图片一类需要session的网站
 
 
 * 登录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.调用,可以参考阿里云语音登录

+ 3 - 2
app/src/main/assets/updateLog.md

@@ -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**
 
 

+ 2 - 1
app/src/main/java/io/legado/app/data/entities/BaseSource.kt

@@ -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!!!')}")
         }
         }
     }
     }
 
 

+ 14 - 14
app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt

@@ -70,10 +70,12 @@ 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) {
-                                        put("result", getLoginData(loginUi))
+                                    source.getLoginJs()?.let { loginJS ->
+                                        source.evalJS("$loginJS\n$buttonFunctionJS") {
+                                            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,18 +130,16 @@ 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 {
-                        source.evalJS(it)
-                        context?.toastOnUi(R.string.success)
-                        withContext(Main) {
-                            dismiss()
-                        }
-                    } catch (e: Exception) {
-                        AppLog.put("登录出错\n${e.localizedMessage}", e)
-                        context?.toastOnUi("登录出错\n${e.localizedMessage}")
-                        e.printOnDebug()
+                try {
+                    source.login()
+                    context?.toastOnUi(R.string.success)
+                    withContext(Main) {
+                        dismiss()
                     }
                     }
+                } catch (e: Exception) {
+                    AppLog.put("登录出错\n${e.localizedMessage}", e)
+                    context?.toastOnUi("登录出错\n${e.localizedMessage}")
+                    e.printOnDebug()
                 }
                 }
             }
             }
         }
         }