Manhwas.net: bypass sucuri (#17093)

* Bypass Sucuri

* Use jsoup to find script

* Use CookieManager

* Use CookieManager
This commit is contained in:
Rolando Lecca 2023-07-13 11:52:34 -05:00 committed by GitHub
parent 3b91d66b9b
commit 37476be2fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 9 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'Manhwas.net' extName = 'Manhwas.net'
pkgNameSuffix = 'es.manhwasnet' pkgNameSuffix = 'es.manhwasnet'
extClass = '.ManhwasNet' extClass = '.ManhwasNet'
extVersionCode = 6 extVersionCode = 7
isNsfw = true isNsfw = true
} }

View File

@ -1,5 +1,7 @@
package eu.kanade.tachiyomi.extension.es.manhwasnet 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.network.GET
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList 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.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource 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.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request import okhttp3.Request
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import java.io.IOException
import java.util.Calendar import java.util.Calendar
class ManhwasNet : ParsedHttpSource() { class ManhwasNet : ParsedHttpSource() {
@ -20,20 +27,47 @@ class ManhwasNet : ParsedHttpSource() {
override val name: String = "Manhwas.net" override val name: String = "Manhwas.net"
override val supportsLatest: Boolean = true 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 -> .addInterceptor { chain ->
val originalRequest = chain.request() val request = chain.request()
val url = originalRequest.url.toString() val url = request.url.toString()
val response = chain.proceed(originalRequest) val response = chain.proceed(request)
if (response.headers["x-sucuri-cache"].isNullOrEmpty() && url.startsWith(baseUrl) && response.headers["x-sucuri-id"] != null) { 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 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() .build()
override fun headersBuilder() = super.headersBuilder() override fun headersBuilder() = super.headersBuilder()
.set("Referer", "$baseUrl/") .add("Referer", "$baseUrl/")
override fun popularMangaRequest(page: Int): Request { override fun popularMangaRequest(page: Int): Request {
val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder() val url = "$baseUrl/biblioteca".toHttpUrlOrNull()!!.newBuilder()
@ -52,7 +86,7 @@ class ManhwasNet : ParsedHttpSource() {
} }
override fun latestUpdatesRequest(page: Int): Request { override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/esp") return GET("$baseUrl/esp", headers)
} }
override fun latestUpdatesSelector() = popularMangaSelector() override fun latestUpdatesSelector() = popularMangaSelector()
@ -84,7 +118,7 @@ class ManhwasNet : ParsedHttpSource() {
} }
} }
url.addQueryParameter("page", page.toString()) url.addQueryParameter("page", page.toString())
return GET(url.build().toString()) return GET(url.build().toString(), headers)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaSelector() = popularMangaSelector()