diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt index cbec405d..d20ae83e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/Koharu.kt @@ -9,6 +9,7 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault import org.koitharu.kotatsu.parsers.util.json.getLongOrDefault @@ -26,6 +27,7 @@ internal class Koharu(context: MangaLoaderContext) : override val configKeyDomain = ConfigKey.Domain("niyaniya.moe") private val apiSuffix = "api.schale.network" + override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_MOBILE) private val authorsIds = suspendLazy { fetchAuthorsIds() } @@ -308,9 +310,6 @@ internal class Koharu(context: MangaLoaderContext) : ) } - @Volatile - private var cachedToken: String? = null - override suspend fun getPages(chapter: MangaChapter): List { val mangaUrl = chapter.url val parts = mangaUrl.split('/') @@ -321,13 +320,9 @@ internal class Koharu(context: MangaLoaderContext) : val id = parts[0] val key = parts[1] - val chapUrl = "https://$domain/g/$mangaUrl/read/1" // request from first page - context.requestBrowserAction(this, chapUrl) - - val currentToken = WebViewHelper(context).getLocalStorageValue(chapUrl, "clearance") - ?: throw IllegalStateException("Cant get auth token") + val clearance = getClearance(chapter.url) - val dataUrl = "https://$apiSuffix/books/detail/$id/$key?crt=$currentToken" + val dataUrl = "https://$apiSuffix/books/detail/$id/$key?crt=$clearance" val dataResponse = webClient.httpPost( url = dataUrl.toHttpUrl(), form = emptyMap(), @@ -370,7 +365,7 @@ internal class Koharu(context: MangaLoaderContext) : } val imagesResponse = webClient.httpGet( - "https://$apiSuffix/books/data/$id/$key/$selectedImageId/$selectedPublicKey/$selectedQuality?crt=$currentToken", + "https://$apiSuffix/books/data/$id/$key/$selectedImageId/$selectedPublicKey/$selectedQuality?crt=$clearance", ).parseJson() val base = imagesResponse.getString("base") @@ -410,4 +405,8 @@ internal class Koharu(context: MangaLoaderContext) : private suspend fun fetchAuthorsIds(): Map = fetchTags(namespace = 1) .associate { it.title.lowercase() to it.key } + + private suspend fun getClearance(mangaId: String): String = WebViewHelper(context) + .getLocalStorageValue(domain, "clearance")?.removeSurrounding('"')?.nullIfEmpty() + ?: context.requestBrowserAction(this, "https://$domain/g/$mangaId/read/1") } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt index 2a97b64c..cb12da22 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/LibSocialParser.kt @@ -15,6 +15,7 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser import org.koitharu.kotatsu.parsers.exception.AuthRequiredException import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.network.UserAgents import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -30,6 +31,8 @@ internal abstract class LibSocialParser( protected val apiHost = "api.cdnlibs.org" + override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_MOBILE) + override val authUrl: String get() = "https://$domain/ru/front/auth"