From 2723d5d0cada432038d7f1ee4c753af9e8bf2bd9 Mon Sep 17 00:00:00 2001 From: marioplus Date: Fri, 28 Mar 2025 09:01:20 +0800 Subject: [PATCH] fix(buondua): enhance Cloudflare challenge bypass (#8249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(buondua): enhance Cloudflare challenge bypass - Add rate limiting (max 10 requests/second) - Implement random User-Agent rotation - Inject Referer header - Version bump 2 → 3 refs: #8079 * chore(buondua): replace interceptor with headersBuilder for request headers - Replace the interceptor with headersBuilder() - Move the SimpleDateFormat to the companion object or class variable Refs: #8079 --- src/all/buondua/build.gradle | 6 +++++- .../extension/all/buondua/BuonDua.kt | 21 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/all/buondua/build.gradle b/src/all/buondua/build.gradle index ca34bb434..e378bfd09 100644 --- a/src/all/buondua/build.gradle +++ b/src/all/buondua/build.gradle @@ -1,8 +1,12 @@ ext { extName = 'Buon Dua' extClass = '.BuonDua' - extVersionCode = 2 + extVersionCode = 3 isNsfw = true } apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(":lib:randomua")) +} diff --git a/src/all/buondua/src/eu/kanade/tachiyomi/extension/all/buondua/BuonDua.kt b/src/all/buondua/src/eu/kanade/tachiyomi/extension/all/buondua/BuonDua.kt index dfcb9f48e..afab8304e 100644 --- a/src/all/buondua/src/eu/kanade/tachiyomi/extension/all/buondua/BuonDua.kt +++ b/src/all/buondua/src/eu/kanade/tachiyomi/extension/all/buondua/BuonDua.kt @@ -1,6 +1,9 @@ package eu.kanade.tachiyomi.extension.all.buondua +import eu.kanade.tachiyomi.lib.randomua.UserAgentType +import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page @@ -8,11 +11,14 @@ 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 keiyoushi.utils.tryParse +import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import java.text.SimpleDateFormat import java.util.Locale +import java.util.concurrent.TimeUnit class BuonDua() : ParsedHttpSource() { override val baseUrl = "https://buondua.com" @@ -20,6 +26,13 @@ class BuonDua() : ParsedHttpSource() { override val name = "Buon Dua" override val supportsLatest = true + override val client = network.cloudflareClient.newBuilder() + .rateLimitHost(baseUrl.toHttpUrl(), 10, 1, TimeUnit.SECONDS) + .setRandomUserAgent(UserAgentType.MOBILE) + .build() + + override fun headersBuilder() = super.headersBuilder().add("Referer", "$baseUrl/") + // Latest override fun latestUpdatesFromElement(element: Element): SManga { val manga = SManga.create() @@ -43,6 +56,7 @@ class BuonDua() : ParsedHttpSource() { override fun popularMangaRequest(page: Int): Request { return GET("$baseUrl/hot?start=${20 * (page - 1)}") } + override fun popularMangaSelector() = latestUpdatesSelector() // Search @@ -57,6 +71,7 @@ class BuonDua() : ParsedHttpSource() { else -> popularMangaRequest(page) } } + override fun searchMangaSelector() = latestUpdatesSelector() // Details @@ -77,7 +92,7 @@ class BuonDua() : ParsedHttpSource() { chapter.setUrlWithoutDomain(element.select(".is-current").first()!!.attr("abs:href")) chapter.chapter_number = 0F chapter.name = element.select(".article-header").text() - chapter.date_upload = SimpleDateFormat("H:m DD-MM-yyyy", Locale.US).parse(element.select(".article-info > small").text())?.time ?: 0L + chapter.date_upload = DATE_FORMAT.tryParse(element.selectFirst(".article-info > small")?.text()) return chapter } @@ -114,4 +129,8 @@ class BuonDua() : ParsedHttpSource() { class TagFilter : Filter.Text("Tag ID") private inline fun Iterable<*>.findInstance() = find { it is T } as? T + + companion object { + private val DATE_FORMAT = SimpleDateFormat("H:m DD-MM-yyyy", Locale.US) + } }