Skip to content

Commit 9f4d7c0

Browse files
improvement
1 parent 7f8dd8a commit 9f4d7c0

1 file changed

Lines changed: 66 additions & 76 deletions

File tree

AnimeSailProvider/src/main/kotlin/com/animesail/AnimeSailProvider.kt

Lines changed: 66 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -30,99 +30,89 @@ import org.jsoup.Jsoup
3030
import org.jsoup.nodes.Element
3131

3232
class TurnstileInterceptor(private val targetCookie: String = "_as_turnstile") : Interceptor {
33-
34-
companion object {
35-
private const val POLL_INTERVAL_MS = 500L
36-
private const val MAX_ATTEMPTS = 30
37-
}
38-
39-
private fun getCookieValue(domainUrl: String): String? {
40-
val raw = CookieManager.getInstance().getCookie(domainUrl) ?: return null
41-
return raw.split(";")
42-
.map { it.trim() }
43-
.firstOrNull { it.startsWith("$targetCookie=") }
44-
?.substringAfter("=")
45-
?.takeIf { it.isNotBlank() }
46-
}
47-
48-
private fun invalidateCookie(domainUrl: String) {
49-
CookieManager.getInstance().apply {
50-
setCookie(domainUrl, "$targetCookie=; Max-Age=0")
51-
flush()
52-
}
53-
}
54-
5533
@SuppressLint("SetJavaScriptEnabled")
5634
override fun intercept(chain: Interceptor.Chain): Response {
5735
val originalRequest = chain.request()
58-
val url = originalRequest.url.toString()
36+
val url = originalRequest.url.toString()
37+
5938
val domainUrl = "${originalRequest.url.scheme}://${originalRequest.url.host}"
6039
val cookieManager = CookieManager.getInstance()
6140

62-
if (getCookieValue(domainUrl) != null) {
63-
val response = chain.proceed(
64-
originalRequest.newBuilder()
65-
.header("Cookie", cookieManager.getCookie(domainUrl) ?: "")
66-
.build()
67-
)
68-
if (response.code != 403 && response.code != 503) return response
69-
response.close()
70-
invalidateCookie(domainUrl)
71-
}
41+
var currentCookies = cookieManager.getCookie(domainUrl) ?: ""
42+
var userAgent = originalRequest.header("User-Agent") ?: ""
7243

73-
val context = AcraApplication.context
74-
?: return chain.proceed(originalRequest)
44+
var needsRefresh = false
45+
var initialResponse: Response? = null
7546

76-
val handler = Handler(Looper.getMainLooper())
77-
var webView: WebView? = null
78-
var resolvedUserAgent = originalRequest.header("User-Agent") ?: ""
47+
if (currentCookies.contains(targetCookie)) {
48+
val requestBuilder = originalRequest.newBuilder()
49+
.header("Cookie", currentCookies)
50+
51+
initialResponse = chain.proceed(requestBuilder.build())
7952

80-
handler.post {
81-
try {
82-
val wv = WebView(context).also { webView = it }
83-
wv.settings.apply {
84-
javaScriptEnabled = true
85-
domStorageEnabled = true
86-
if (resolvedUserAgent.isNotBlank()) userAgentString = resolvedUserAgent
87-
resolvedUserAgent = userAgentString
88-
}
89-
wv.webViewClient = WebViewClient()
90-
wv.loadUrl(url)
91-
} catch (e: Exception) {
92-
e.printStackTrace()
53+
if (initialResponse.code == 403 || initialResponse.code == 503) {
54+
needsRefresh = true
55+
initialResponse.close()
56+
} else {
57+
return initialResponse
9358
}
59+
} else {
60+
needsRefresh = true
9461
}
9562

96-
var attempts = 0
97-
while (attempts < MAX_ATTEMPTS) {
98-
Thread.sleep(POLL_INTERVAL_MS)
99-
if (getCookieValue(domainUrl) != null) {
100-
cookieManager.flush()
101-
break
102-
}
103-
attempts++
104-
}
63+
if (needsRefresh) {
64+
val context = AcraApplication.context
65+
if (context != null) {
66+
val handler = Handler(Looper.getMainLooper())
67+
var webView: WebView? = null
68+
69+
handler.post {
70+
val newWebView = WebView(context)
71+
webView = newWebView
72+
73+
newWebView.settings.apply {
74+
javaScriptEnabled = true
75+
domStorageEnabled = true
76+
userAgentString = userAgent.ifBlank { userAgentString }
77+
}
78+
userAgent = newWebView.settings.userAgentString ?: userAgent
10579

106-
handler.post {
107-
try {
108-
webView?.apply {
109-
stopLoading()
110-
clearCache(false)
111-
destroy()
80+
newWebView.webViewClient = WebViewClient()
81+
82+
cookieManager.setCookie(domainUrl, "$targetCookie=; Max-Age=0")
83+
cookieManager.flush()
84+
85+
newWebView.loadUrl(url)
86+
}
87+
88+
var attempts = 0
89+
val maxAttempts = 15
90+
while (attempts < maxAttempts) {
91+
Thread.sleep(1000)
92+
val checkCookies = cookieManager.getCookie(domainUrl) ?: ""
93+
94+
if (checkCookies.contains(targetCookie)) {
95+
cookieManager.flush()
96+
break
97+
}
98+
attempts++
99+
}
100+
101+
handler.post {
102+
webView?.stopLoading()
103+
webView?.destroy()
112104
}
113-
webView = null
114-
} catch (e: Exception) {
115-
e.printStackTrace()
116105
}
106+
107+
currentCookies = cookieManager.getCookie(domainUrl) ?: ""
108+
val newRequestBuilder = originalRequest.newBuilder()
109+
.header("User-Agent", userAgent)
110+
.header("Cookie", currentCookies)
111+
112+
return chain.proceed(newRequestBuilder.build())
117113
}
118114

119-
val finalCookies = cookieManager.getCookie(domainUrl) ?: ""
120-
return chain.proceed(
121-
originalRequest.newBuilder()
122-
.header("Cookie", finalCookies)
123-
.apply { if (resolvedUserAgent.isNotBlank()) header("User-Agent", resolvedUserAgent) }
124-
.build()
125-
)
115+
return initialResponse ?: chain.proceed(originalRequest)
126116
}
127117
}
128118

0 commit comments

Comments
 (0)