diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index 2b64db826..d0326f271 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -57,7 +57,10 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.asRequestBody import org.json.JSONArray import org.jsoup.Jsoup +import org.jsoup.nodes.Element +import org.jsoup.nodes.TextNode import java.io.File +import java.util.function.Consumer import kotlin.math.ceil private const val TAG = "EhEngine" @@ -116,10 +119,41 @@ private fun rethrowExactly(code: Int, headers: Headers, body: String, e: Throwab throw e } +private const val EMAIL_PROTECTED = "email protected" +private const val RAW_EMAIL_PROTECTED = "[email protected]" + +private fun resolveEmailProtected(origin: String): String { + if (RAW_EMAIL_PROTECTED !in origin) return origin + val resolvedEmailList = mutableListOf() + fun Element.decodeProtectedEmail() { + if (EMAIL_PROTECTED in text()) { + if (EMAIL_PROTECTED in ownText()) { + forEachNode( + Consumer { + if (it is TextNode) { + if (EMAIL_PROTECTED in it.text()) { + val encoded = attr("data-cfemail") + resolvedEmailList.add(encoded) + } + } + }, + ) + } + children().forEach { + it.decodeProtectedEmail() + } + } + } + Jsoup.parse(origin).decodeProtectedEmail() + var ret = origin + resolvedEmailList.forEach { ret = ret.replaceFirst(RAW_EMAIL_PROTECTED, it) } + return ret +} + private suspend inline fun Request.executeAndParsingWith(block: String.() -> T): T { Log.d(TAG, url.toString()) return execute { - val body = body.string() + val body = resolveEmailProtected(body.string()) try { block(body) } catch (e: Exception) {