From e18a2f732c74cd271dd3c5d2ccfa1d2bc0b01933 Mon Sep 17 00:00:00 2001 From: are-are-are <62763969+dejavui@users.noreply.github.com> Date: Thu, 31 Jul 2025 00:12:46 +0700 Subject: [PATCH] GocTruyenTranhVui: Using the token of a level 1 account. Login is no longer required. (#9855) * Currently using token of a lv1 account. Will not require login anymore Helps read most manga, manhua, manhwa. Manga/manhua/manhwa above level 1 will only be read on the web. * Apply suggestion --- src/vi/goctruyentranhvui/build.gradle | 2 +- .../vi/goctruyentranhvui/GocTruyenTranhVui.kt | 34 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/vi/goctruyentranhvui/build.gradle b/src/vi/goctruyentranhvui/build.gradle index 02b4ed9eb..b253c511d 100644 --- a/src/vi/goctruyentranhvui/build.gradle +++ b/src/vi/goctruyentranhvui/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Goc Truyen Tranh Vui' extClass = '.GocTruyenTranhVui' - extVersionCode = 1 + extVersionCode = 2 isNsfw = true } diff --git a/src/vi/goctruyentranhvui/src/eu/kanade/tachiyomi/extension/vi/goctruyentranhvui/GocTruyenTranhVui.kt b/src/vi/goctruyentranhvui/src/eu/kanade/tachiyomi/extension/vi/goctruyentranhvui/GocTruyenTranhVui.kt index 7495ff110..b0a9764eb 100644 --- a/src/vi/goctruyentranhvui/src/eu/kanade/tachiyomi/extension/vi/goctruyentranhvui/GocTruyenTranhVui.kt +++ b/src/vi/goctruyentranhvui/src/eu/kanade/tachiyomi/extension/vi/goctruyentranhvui/GocTruyenTranhVui.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.vi.goctruyentranhvui import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage @@ -10,6 +11,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.asJsoup import keiyoushi.utils.parseAs +import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient @@ -94,18 +96,31 @@ class GocTruyenTranhVui : HttpSource() { val pattern = Regex("chapterJson:\\s*`(.*?)`") val match = pattern.find(html) ?: throw Exception("Không tìm thấy Json") // find json val jsonPage = match.groups[1]!!.value - if (jsonPage.isEmpty()) throw Exception("Không có nội dung. Hãy đăng nhập trong WebView") // loginRequired - val result = jsonPage.parseAs() - val imageList = result.body.result.data - return imageList.mapIndexed { i, url -> - val finalUrl = if (url.startsWith("/image/")) { - baseUrl + url - } else { - url - } + + val imageUrls = if (jsonPage.isEmpty()) { + val regexMangaId = Regex("""comic\s*=\s*\{\s*id:\s*"(\d{10})"""") + val matchId = regexMangaId.find(html) ?: throw Exception("Không tìm thấy mangaId") // find mangaId + val mangaId = matchId.groups[1]!!.value + val nameEn = response.request.url.toString().substringAfter("/truyen/").substringBefore("/") + val chapterNumber = response.request.url.toString().substringAfterLast("chuong-") + val body = FormBody.Builder().add("comicId", mangaId) + .add("chapterNumber", chapterNumber).add("nameEn", nameEn).build() + val request = POST("$baseUrl/api/chapter/auth", pageHeaders, body) + client.newCall(request).execute().parseAs>().result.data + } else { + jsonPage.parseAs().body.result.data + } + return imageUrls.mapIndexed { i, url -> + val finalUrl = if (url.startsWith("/image/")) { baseUrl + url } else { url } Page(i, imageUrl = finalUrl) } } + private val pageHeaders by lazy { + headersBuilder() + .add("X-Requested-With", "XMLHttpRequest") + .add("Authorization", TOKEN_KEY) + .build() + } override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() @@ -136,3 +151,4 @@ class GocTruyenTranhVui : HttpSource() { GenreList(getGenreList()), ) } +private const val TOKEN_KEY = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJBbG9uZSBGb3JldmVyIiwiY29taWNJZHMiOltdLCJyb2xlSWQiOm51bGwsImdyb3VwSWQiOm51bGwsImFkbWluIjpmYWxzZSwicmFuayI6MCwicGVybWlzc2lvbiI6W10sImlkIjoiMDAwMTA4NDQyNSIsInRlYW0iOmZhbHNlLCJpYXQiOjE3NTM2OTgyOTAsImVtYWlsIjoibnVsbCJ9.HT080LGjvzfh6XAPmdDZhf5vhnzUhXI4GU8U6tzwlnXWjgMO4VdYL1_jsSFWd-s3NBGt-OAt89XnzaQ03iqDyA"