pull/37/head
kunfei 5 years ago
parent d359655a1c
commit 401b55883d
  1. 56
      app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt

@ -5,6 +5,7 @@ import android.text.TextUtils
import androidx.annotation.Keep import androidx.annotation.Keep
import io.legado.app.constant.AppConst.SCRIPT_ENGINE import io.legado.app.constant.AppConst.SCRIPT_ENGINE
import io.legado.app.constant.Pattern.EXP_PATTERN import io.legado.app.constant.Pattern.EXP_PATTERN
import io.legado.app.constant.Pattern.JS_PATTERN
import io.legado.app.data.api.IHttpGetApi import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.api.IHttpPostApi import io.legado.app.data.api.IHttpPostApi
import io.legado.app.data.entities.BaseBook import io.legado.app.data.entities.BaseBook
@ -72,11 +73,45 @@ class AnalyzeUrl(
} }
headerMapF?.let { headerMap.putAll(it) } headerMapF?.let { headerMap.putAll(it) }
//替换参数 //替换参数
analyzeJs(key, page, book)
replaceKeyPageJs(key, page, book) replaceKeyPageJs(key, page, book)
//处理URL //处理URL
initUrl() initUrl()
} }
private fun analyzeJs(key: String?, page: Int?, book: BaseBook?) {
val ruleList = arrayListOf<String>()
var start = 0
var tmp: String
val jsMatcher = JS_PATTERN.matcher(ruleUrl)
while (jsMatcher.find()) {
if (jsMatcher.start() > start) {
tmp =
ruleUrl.substring(start, jsMatcher.start()).replace("\n", "").trim { it <= ' ' }
if (!TextUtils.isEmpty(tmp)) {
ruleList.add(tmp)
}
}
ruleList.add(jsMatcher.group())
start = jsMatcher.end()
}
if (ruleUrl.length > start) {
tmp = ruleUrl.substring(start).replace("\n", "").trim { it <= ' ' }
if (!TextUtils.isEmpty(tmp)) {
ruleList.add(tmp)
}
}
for (rule in ruleList) {
var ruleStr = rule
if (ruleStr.startsWith("<js>")) {
ruleStr = ruleStr.substring(4, ruleStr.lastIndexOf("<"))
ruleUrl = evalJS(ruleStr, ruleUrl, page, key, book) as String
} else {
ruleUrl = ruleStr.replace("@result", ruleUrl)
}
}
}
/** /**
* 替换关键字,页数,JS * 替换关键字,页数,JS
*/ */
@ -186,6 +221,27 @@ class AnalyzeUrl(
} }
} }
/**
* 执行JS
*/
@Throws(Exception::class)
private fun evalJS(
jsStr: String,
result: Any?,
page: Int?,
key: String?,
book: BaseBook?
): Any {
val bindings = SimpleBindings()
bindings["java"] = this
bindings["page"] = page
bindings["key"] = key
bindings["book"] = book
bindings["result"] = result
bindings["baseUrl"] = baseUrl
return SCRIPT_ENGINE.eval(jsStr, bindings)
}
enum class Method { enum class Method {
GET, POST GET, POST
} }

Loading…
Cancel
Save