@@ -30,77 +30,101 @@ import org.jsoup.Jsoup
3030import org.jsoup.nodes.Element
3131
3232class TurnstileInterceptor (private val targetCookie : String = " _as_turnstile" ) : Interceptor {
33+
3334 @SuppressLint(" SetJavaScriptEnabled" )
3435 override fun intercept (chain : Interceptor .Chain ): Response {
3536 val originalRequest = chain.request()
3637 val url = originalRequest.url.toString()
38+ val domainUrl = " ${originalRequest.url.scheme} ://${originalRequest.url.host} "
3739 val cookieManager = CookieManager .getInstance()
3840
39- var currentCookies = cookieManager.getCookie(url) ? : " "
40- var userAgent = originalRequest.header(" User-Agent" ) ? : " "
41+ cookieManager.setAcceptCookie(true )
4142
42- var response: Response ? = null
43+ var currentCookies = cookieManager.getCookie(domainUrl) ? : " "
44+ var userAgent = originalRequest.header(" User-Agent" ) ? : " "
4345 var needsRefresh = false
46+ var initialResponse: Response ? = null
4447
45- if (! currentCookies.contains(targetCookie)) {
46- needsRefresh = true
47- } else {
48+ if (currentCookies.contains(targetCookie)) {
4849 val requestBuilder = originalRequest.newBuilder()
4950 .header(" Cookie" , currentCookies)
50- response = chain.proceed(requestBuilder.build())
5151
52- if (response.code == 403 || response.code == 503 ) {
52+ initialResponse = chain.proceed(requestBuilder.build())
53+
54+ if (initialResponse.code == 403 || initialResponse.code == 503 ) {
5355 needsRefresh = true
54- response.close()
56+ initialResponse.close()
57+ } else {
58+ return initialResponse
5559 }
60+ } else {
61+ needsRefresh = true
5662 }
5763
5864 if (needsRefresh) {
59- runBlocking(Dispatchers .Main ) {
60- val context = AcraApplication .context
61- if (context != null ) {
62- val webView = WebView (context)
63-
64- webView.settings.javaScriptEnabled = true
65- webView.settings.domStorageEnabled = true
66- webView.settings.userAgentString = userAgent.ifBlank { webView.settings.userAgentString }
67- userAgent = webView.settings.userAgentString
68-
69- webView.webViewClient = object : WebViewClient () {
65+ val context = AcraApplication .context
66+ if (context != null ) {
67+ val handler = Handler (Looper .getMainLooper())
68+ var webView: WebView ? = null
69+
70+ handler.post {
71+ val newWebView = WebView (context)
72+ webView = newWebView
73+
74+ cookieManager.setAcceptCookie(true )
75+ cookieManager.setAcceptThirdPartyCookies(newWebView, true )
76+
77+ newWebView.settings.apply {
78+ javaScriptEnabled = true
79+ domStorageEnabled = true
80+ databaseEnabled = true
81+ loadWithOverviewMode = true
82+ useWideViewPort = true
83+ userAgentString = userAgent.ifBlank { userAgentString }
84+ }
85+ userAgent = newWebView.settings.userAgentString ? : userAgent
86+
87+ newWebView.webViewClient = object : WebViewClient () {
7088 override fun onPageFinished (view : WebView ? , url : String? ) {
7189 super .onPageFinished(view, url)
90+ cookieManager.flush()
7291 }
7392 }
7493
75- cookieManager.setCookie(url, " $targetCookie =; Max-Age=0" )
94+ cookieManager.removeAllCookies(null )
95+ cookieManager.flush()
7696
77- webView.loadUrl(url)
97+ newWebView.loadUrl(url)
98+ }
7899
79- var attempts = 0
80- val maxAttempts = 30
81- while (attempts < maxAttempts) {
82- delay(1000 )
83- val checkCookies = cookieManager.getCookie(url) ? : " "
84- if (checkCookies.contains(targetCookie)) {
85- break
86- }
87- attempts++
100+ var attempts = 0
101+ val maxAttempts = 60
102+ while (attempts < maxAttempts) {
103+ Thread .sleep(1000 )
104+ val checkCookies = cookieManager.getCookie(domainUrl) ? : " "
105+ if (checkCookies.contains(targetCookie)) {
106+ cookieManager.flush()
107+ break
88108 }
109+ attempts++
110+ }
89111
90- webView.stopLoading()
91- webView.destroy()
112+ handler.post {
113+ webView?.stopLoading()
114+ webView?.destroy()
115+ webView = null
92116 }
93117 }
94118
95- currentCookies = cookieManager.getCookie(url ) ? : " "
119+ currentCookies = cookieManager.getCookie(domainUrl ) ? : " "
96120 val newRequestBuilder = originalRequest.newBuilder()
97121 .header(" User-Agent" , userAgent)
98122 .header(" Cookie" , currentCookies)
99-
100- response = chain.proceed(newRequestBuilder.build())
123+
124+ return chain.proceed(newRequestBuilder.build())
101125 }
102126
103- return response ? : chain.proceed(originalRequest)
127+ return initialResponse ? : chain.proceed(originalRequest)
104128 }
105129}
106130
0 commit comments