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
This commit is contained in:
are-are-are 2025-07-31 00:12:46 +07:00 committed by Draff
parent ca348c78eb
commit e18a2f732c
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 26 additions and 10 deletions

View File

@ -1,7 +1,7 @@
ext {
extName = 'Goc Truyen Tranh Vui'
extClass = '.GocTruyenTranhVui'
extVersionCode = 1
extVersionCode = 2
isNsfw = true
}

View File

@ -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<ImageListWrapper>()
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<ResultDto<ImageListDto>>().result.data
} else {
jsonPage.parseAs<ImageListWrapper>().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"