@@ -30,99 +30,89 @@ import org.jsoup.Jsoup
3030import org.jsoup.nodes.Element
3131
3232class 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