|
|
|
@ -5,6 +5,7 @@ import android.text.TextUtils |
|
|
|
|
import androidx.annotation.Keep |
|
|
|
|
import io.legado.app.constant.AppConst.SCRIPT_ENGINE |
|
|
|
|
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.IHttpPostApi |
|
|
|
|
import io.legado.app.data.entities.BaseBook |
|
|
|
@ -72,11 +73,45 @@ class AnalyzeUrl( |
|
|
|
|
} |
|
|
|
|
headerMapF?.let { headerMap.putAll(it) } |
|
|
|
|
//替换参数 |
|
|
|
|
analyzeJs(key, page, book) |
|
|
|
|
replaceKeyPageJs(key, page, book) |
|
|
|
|
//处理URL |
|
|
|
|
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 |
|
|
|
|
*/ |
|
|
|
@ -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 { |
|
|
|
|
GET, POST |
|
|
|
|
} |
|
|
|
|