From 37476be2fe31778edcd4edcb34035f44c1203738 Mon Sep 17 00:00:00 2001 From: Rolando Lecca <90949336+bapeey@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:52:34 -0500 Subject: [PATCH] Manhwas.net: bypass sucuri (#17093) * Bypass Sucuri * Use jsoup to find script * Use CookieManager * Use CookieManager --- src/es/manhwasnet/build.gradle | 2 +- .../extension/es/manhwasnet/ManhwasNet.kt | 50 ++++++++++++++++--- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/es/manhwasnet/build.gradle b/src/es/manhwasnet/build.gradle index d993e87a4..bc0f63c17 100644 --- a/src/es/manhwasnet/build.gradle +++ b/src/es/manhwasnet/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Manhwas.net' pkgNameSuffix = 'es.manhwasnet' extClass = '.ManhwasNet' - extVersionCode = 6 + extVersionCode = 7 isNsfw = true } diff --git a/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt index ed3ff9ab3..395948677 100644 --- a/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt +++ b/src/es/manhwasnet/src/eu/kanade/tachiyomi/extension/es/manhwasnet/ManhwasNet.kt @@ -1,5 +1,7 @@ package eu.kanade.tachiyomi.extension.es.manhwasnet +import android.webkit.CookieManager +import app.cash.quickjs.QuickJs import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList @@ -7,10 +9,15 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Cookie +import okhttp3.CookieJar +import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.IOException import java.util.Calendar class ManhwasNet : ParsedHttpSource() { @@ -20,20 +27,47 @@ class ManhwasNet : ParsedHttpSource() { override val name: String = "Manhwas.net" override val supportsLatest: Boolean = true - override val client = network.cloudflareClient.newBuilder() + private val cookieManager by lazy { CookieManager.getInstance() } + + override val client = network.client.newBuilder() .addInterceptor { chain -> - val originalRequest = chain.request() - val url = originalRequest.url.toString() - val response = chain.proceed(originalRequest) + val request = chain.request() + val url = request.url.toString() + val response = chain.proceed(request) if (response.headers["x-sucuri-cache"].isNullOrEmpty() && url.startsWith(baseUrl) && response.headers["x-sucuri-id"] != null) { - throw Exception("Sitio protegido - Abra en WebView para desbloquear.") + val script = response.asJsoup().selectFirst("script")?.data() + if (script != null) { + val a = script.split("(r)")[0].dropLast(1) + "r=r.replace('document.cookie','cookie');" + QuickJs.create().use { + val b = it.evaluate(a) as String + val sucuriCookie = it.evaluate(b.replace("location.", "").replace("reload();", "")) as String + val cookieName = sucuriCookie.split("=")[0] + val cookieValue = sucuriCookie.split("=")[1].replace(";path", "") + cookieManager.setCookie(url, "$cookieName=$cookieValue") + } + val newResponse = chain.proceed(request) + if (!newResponse.headers["x-sucuri-cache"].isNullOrEmpty()) return@addInterceptor newResponse + } + throw IOException("Sitio protegido - Abra en WebView para intentar desbloquear.") } return@addInterceptor response } + .cookieJar( + object : CookieJar { + override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) = + cookies.filter { it.matches(url) }.forEach { + cookieManager.setCookie(url.toString(), it.toString()) + } + + override fun loadForRequest(url: HttpUrl) = + cookieManager.getCookie(url.toString())?.split("; ") + ?.mapNotNull { Cookie.parse(url, it) } ?: emptyList() + }, + ) .build() override fun headersBuilder() = super.headersBuilder() - .set("Referer", "$baseUrl/") + .add("Referer", "$baseUrl/") override fun popularMangaRequest(page: Int): Request { val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder() @@ -52,7 +86,7 @@ class ManhwasNet : ParsedHttpSource() { } override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/esp") + return GET("$baseUrl/esp", headers) } override fun latestUpdatesSelector() = popularMangaSelector() @@ -84,7 +118,7 @@ class ManhwasNet : ParsedHttpSource() { } } url.addQueryParameter("page", page.toString()) - return GET(url.build().toString()) + return GET(url.build().toString(), headers) } override fun searchMangaSelector() = popularMangaSelector()