MangaHub (multisrc) - Fix "API Limit Exceeded" (#8073)
* Fixed "API limit exceeded" gonna crash out if this build failed again bc of linting * review changes * Review changes
This commit is contained in:
parent
34b4284d7c
commit
d7c6574e87
@ -2,7 +2,7 @@ plugins {
|
|||||||
id("lib-multisrc")
|
id("lib-multisrc")
|
||||||
}
|
}
|
||||||
|
|
||||||
baseVersionCode = 29
|
baseVersionCode = 30
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":lib:randomua"))
|
api(project(":lib:randomua"))
|
||||||
|
@ -17,7 +17,6 @@ import kotlinx.serialization.decodeFromString
|
|||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.json.buildJsonObject
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
import kotlinx.serialization.json.put
|
import kotlinx.serialization.json.put
|
||||||
import kotlinx.serialization.json.putJsonObject
|
|
||||||
import okhttp3.Cookie
|
import okhttp3.Cookie
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
@ -31,7 +30,7 @@ import org.jsoup.nodes.Document
|
|||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.net.URLEncoder
|
import java.io.IOException
|
||||||
import java.text.ParseException
|
import java.text.ParseException
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
@ -49,6 +48,7 @@ abstract class MangaHub(
|
|||||||
|
|
||||||
private var baseApiUrl = "https://api.mghcdn.com"
|
private var baseApiUrl = "https://api.mghcdn.com"
|
||||||
private var baseCdnUrl = "https://imgx.mghcdn.com"
|
private var baseCdnUrl = "https://imgx.mghcdn.com"
|
||||||
|
private val regex = Regex("mhub_access=([^;]+)")
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||||
.setRandomUserAgent(
|
.setRandomUserAgent(
|
||||||
@ -91,8 +91,6 @@ abstract class MangaHub(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun refreshApiKey(chapter: SChapter) {
|
private fun refreshApiKey(chapter: SChapter) {
|
||||||
val now = Calendar.getInstance().time.time
|
|
||||||
|
|
||||||
val slug = "$baseUrl${chapter.url}"
|
val slug = "$baseUrl${chapter.url}"
|
||||||
.toHttpUrlOrNull()
|
.toHttpUrlOrNull()
|
||||||
?.pathSegments
|
?.pathSegments
|
||||||
@ -104,32 +102,28 @@ abstract class MangaHub(
|
|||||||
baseUrl.toHttpUrl()
|
baseUrl.toHttpUrl()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val oldKey = client.cookieJar
|
||||||
|
.loadForRequest(baseUrl.toHttpUrl())
|
||||||
|
.firstOrNull { it.name == "mhub_access" && it.value.isNotEmpty() }?.value
|
||||||
|
|
||||||
|
for (i in 1..2) {
|
||||||
// Clear key cookie
|
// Clear key cookie
|
||||||
val cookie = Cookie.parse(url, "mhub_access=; Max-Age=0; Path=/")!!
|
val cookie = Cookie.parse(url, "mhub_access=; Max-Age=0; Path=/")!!
|
||||||
client.cookieJar.saveFromResponse(url, listOf(cookie))
|
client.cookieJar.saveFromResponse(url, listOf(cookie))
|
||||||
|
|
||||||
// Set required cookie (for cache busting?)
|
// We try requesting again with param if the first one fails
|
||||||
val recently = buildJsonObject {
|
val query = if (i == 2) "?reloadKey=1" else ""
|
||||||
putJsonObject((now - (0..3600).random()).toString()) {
|
|
||||||
put("mangaID", (1..42_000).random())
|
try {
|
||||||
put("number", (1..20).random())
|
val response = client.newCall(GET("$url$query", headers)).execute()
|
||||||
|
val returnedKey = response.headers["set-cookie"]?.let { regex.find(it)?.groupValues?.get(1) }
|
||||||
|
response.close() // Avoid potential resource leaks
|
||||||
|
|
||||||
|
if (returnedKey != oldKey) break; // Break out of loop since we got an allegedly valid API key
|
||||||
|
} catch (_: IOException) {
|
||||||
|
throw IOException("An error occurred while obtaining a new API key") // Show error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.toString()
|
|
||||||
|
|
||||||
client.cookieJar.saveFromResponse(
|
|
||||||
url,
|
|
||||||
listOf(
|
|
||||||
Cookie.Builder()
|
|
||||||
.domain(url.host)
|
|
||||||
.name("recently")
|
|
||||||
.value(URLEncoder.encode(recently, "utf-8"))
|
|
||||||
.expiresAt(now + 2 * 60 * 60 * 24 * 31) // +2 months
|
|
||||||
.build(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
val request = GET("$url?reloadKey=1", headers)
|
|
||||||
client.newCall(request).execute()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class SMangaDTO(
|
data class SMangaDTO(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user