Add captchaInfo parsing tests

Store real google cookie up to three months instead of until the next app restart
dev
k1rakishou 6 years ago
parent 3259c797aa
commit 8fec9c894e
  1. 2
      Clover/app/build.gradle
  2. 2
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  3. 6
      Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsHtmlParser.java
  4. 20
      Clover/app/src/main/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsPresenterV2.java
  5. 5
      Clover/app/src/main/java/org/floens/chan/ui/controller/BehaviourSettingsController.java
  6. 2
      Clover/app/src/main/res/values/strings.xml
  7. 104
      Clover/app/src/test/java/org/floens/chan/ui/captcha/v2/CaptchaNoJsHtmlParserTest.java

@ -158,4 +158,6 @@ dependencies {
implementation 'org.codejargon.feather:feather:1.0' implementation 'org.codejargon.feather:feather:1.0'
releaseImplementation 'ch.acra:acra-http:5.1.3' releaseImplementation 'ch.acra:acra-http:5.1.3'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.27.0'
} }

@ -163,6 +163,7 @@ public class ChanSettings {
public static final BooleanSetting useNewCaptchaWindow; public static final BooleanSetting useNewCaptchaWindow;
public static final BooleanSetting useRealGoogleCookies; public static final BooleanSetting useRealGoogleCookies;
public static final StringSetting googleCookie; public static final StringSetting googleCookie;
public static final LongSetting lastGoogleCookieUpdateTime;
static { static {
SettingProvider p = new SharedPreferencesSettingProvider(AndroidUtils.getPreferences()); SettingProvider p = new SharedPreferencesSettingProvider(AndroidUtils.getPreferences());
@ -256,6 +257,7 @@ public class ChanSettings {
useNewCaptchaWindow = new BooleanSetting(p, "use_new_captcha_window", true); useNewCaptchaWindow = new BooleanSetting(p, "use_new_captcha_window", true);
useRealGoogleCookies = new BooleanSetting(p, "use_real_google_cookies", false); useRealGoogleCookies = new BooleanSetting(p, "use_real_google_cookies", false);
googleCookie = new StringSetting(p, "google_cookie", ""); googleCookie = new StringSetting(p, "google_cookie", "");
lastGoogleCookieUpdateTime = new LongSetting(p, "last_google_cookie_update_time", 0L);
// Old (but possibly still in some users phone) // Old (but possibly still in some users phone)
// preference_board_view_mode default "list" // preference_board_view_mode default "list"

@ -123,7 +123,7 @@ public class CaptchaNoJsHtmlParser {
return token; return token;
} }
private void parseChallengeTitle( public void parseChallengeTitle(
String responseHtml, String responseHtml,
CaptchaInfo captchaInfo CaptchaInfo captchaInfo
) throws CaptchaNoJsV2ParsingError { ) throws CaptchaNoJsV2ParsingError {
@ -240,7 +240,7 @@ public class CaptchaNoJsHtmlParser {
} }
} }
private void parseCParameter( public void parseCParameter(
String responseHtml, String responseHtml,
CaptchaInfo captchaInfo CaptchaInfo captchaInfo
) throws CaptchaNoJsV2ParsingError { ) throws CaptchaNoJsV2ParsingError {
@ -269,7 +269,7 @@ public class CaptchaNoJsHtmlParser {
captchaInfo.setcParameter(cParameter); captchaInfo.setcParameter(cParameter);
} }
private void parseCheckboxes( public void parseCheckboxes(
String responseHtml, String responseHtml,
CaptchaInfo captchaInfo CaptchaInfo captchaInfo
) throws CaptchaNoJsV2ParsingError { ) throws CaptchaNoJsV2ParsingError {

@ -31,6 +31,7 @@ import java.net.URLEncoder;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import okhttp3.Headers; import okhttp3.Headers;
@ -48,7 +49,6 @@ public class CaptchaNoJsPresenterV2 {
private static final String acceptHeader = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"; private static final String acceptHeader = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
private static final String acceptEncodingHeader = "deflate, br"; private static final String acceptEncodingHeader = "deflate, br";
private static final String acceptLanguageHeader = "en-US"; private static final String acceptLanguageHeader = "en-US";
private static final String recaptchaUrlBase = "https://www.google.com/recaptcha/api/fallback?k="; private static final String recaptchaUrlBase = "https://www.google.com/recaptcha/api/fallback?k=";
private static final String googleBaseUrl = "https://www.google.com/"; private static final String googleBaseUrl = "https://www.google.com/";
private static final String encoding = "UTF-8"; private static final String encoding = "UTF-8";
@ -58,6 +58,7 @@ public class CaptchaNoJsPresenterV2 {
private static final String setCookieHeaderName = "set-cookie"; private static final String setCookieHeaderName = "set-cookie";
private static final int SUCCESS_STATUS_CODE = 200; private static final int SUCCESS_STATUS_CODE = 200;
private static final long CAPTCHA_REQUEST_THROTTLE_MS = 3000L; private static final long CAPTCHA_REQUEST_THROTTLE_MS = 3000L;
private static final long THREE_MONTHS = TimeUnit.DAYS.toMillis(90);
// this cookie is taken from dashchan // this cookie is taken from dashchan
private static final String defaultGoogleCookies = "NID=87=gkOAkg09AKnvJosKq82kgnDnHj8Om2pLskKhdna02msog8HkdHDlasDf"; private static final String defaultGoogleCookies = "NID=87=gkOAkg09AKnvJosKq82kgnDnHj8Om2pLskKhdna02msog8HkdHDlasDf";
@ -135,6 +136,8 @@ public class CaptchaNoJsPresenterV2 {
String recaptchaUrl = recaptchaUrlBase + siteKey; String recaptchaUrl = recaptchaUrlBase + siteKey;
RequestBody body = createResponseBody(prevCaptchaInfo, selectedIds); RequestBody body = createResponseBody(prevCaptchaInfo, selectedIds);
Logger.d(TAG, "Verify called. Current cookie = " + googleCookie);
Request request = new Request.Builder() Request request = new Request.Builder()
.url(recaptchaUrl) .url(recaptchaUrl)
.post(body) .post(body)
@ -282,11 +285,17 @@ public class CaptchaNoJsPresenterV2 {
return defaultGoogleCookies; return defaultGoogleCookies;
} }
if (!forced && !googleCookie.isEmpty()) { boolean isItTimeToUpdateCookies =
((System.currentTimeMillis() - ChanSettings.lastGoogleCookieUpdateTime.get()) > THREE_MONTHS);
if (!forced && (!googleCookie.isEmpty() && !isItTimeToUpdateCookies)) {
Logger.d(TAG, "We already have google cookies"); Logger.d(TAG, "We already have google cookies");
return googleCookie; return googleCookie;
} }
Logger.d(TAG, "Time to update cookies: forced = " + forced + ", isCookieEmpty = " +
googleCookie.isEmpty() + ", last cookie expired = " + isItTimeToUpdateCookies);
Request request = new Request.Builder() Request request = new Request.Builder()
.url(googleBaseUrl) .url(googleBaseUrl)
.header("User-Agent", userAgentHeader) .header("User-Agent", userAgentHeader)
@ -297,9 +306,16 @@ public class CaptchaNoJsPresenterV2 {
try (Response response = okHttpClient.newCall(request).execute()) { try (Response response = okHttpClient.newCall(request).execute()) {
String newCookie = handleGetGoogleCookiesResponse(response); String newCookie = handleGetGoogleCookiesResponse(response);
if (!newCookie.equalsIgnoreCase(defaultGoogleCookies)) {
ChanSettings.googleCookie.set(newCookie); ChanSettings.googleCookie.set(newCookie);
ChanSettings.lastGoogleCookieUpdateTime.set(System.currentTimeMillis());
Logger.d(TAG, "Successfully refreshed google cookies, new cookie = " + newCookie); Logger.d(TAG, "Successfully refreshed google cookies, new cookie = " + newCookie);
} else {
Logger.d(TAG, "Could not successfully handle google cookie response, " +
"using the default google cookies until the next request");
}
return newCookie; return newCookie;
} }
} }

@ -65,8 +65,11 @@ public class BehaviourSettingsController extends SettingsController {
if (!ChanSettings.useNewCaptchaWindow.get()) { if (!ChanSettings.useNewCaptchaWindow.get()) {
ChanSettings.useRealGoogleCookies.set(false); ChanSettings.useRealGoogleCookies.set(false);
// reset the old google cookie as well // Reset the old google cookie
ChanSettings.googleCookie.set(""); ChanSettings.googleCookie.set("");
// and cookie update time as well
ChanSettings.lastGoogleCookieUpdateTime.set(0L);
} }
rebuildPreferences(); rebuildPreferences();

@ -582,7 +582,7 @@ Don't have a 4chan Pass?<br>
<string name="settings_captcha_group" tools:ignore="MissingTranslation">Captcha</string> <string name="settings_captcha_group" tools:ignore="MissingTranslation">Captcha</string>
<string name="settings_use_new_captcha_window" tools:ignore="MissingTranslation">Use new captcha window for no-js captcha</string> <string name="settings_use_new_captcha_window" tools:ignore="MissingTranslation">Use new captcha window for no-js captcha</string>
<string name="settings_use_real_google_cookies" tools:ignore="MissingTranslation">Use real google cookies instead of hardcoded ones</string> <string name="settings_use_real_google_cookies" tools:ignore="MissingTranslation">Use real google cookies instead of hardcoded ones</string>
<string name="settings_use_real_google_cookies_description" tools:ignore="MissingTranslation">When the real google cookies a GET request to the google.com will be executed to get the google cookies (NID) which will be used for captcha authentication. Why would you need them? Because the hardcoded ones sometimes will make you re-enter the captcha dozens of times. Those cookies will be updated automatically (when posting the first time after the app start). But it will also be possible to update them manually if necessary (for example, when the old ones give too many challenges in a row).</string> <string name="settings_use_real_google_cookies_description" tools:ignore="MissingTranslation">When this option is enabled a GET request to the google.com will be executed to get the google cookies (NID) which will be used for captcha authentication. Why would you need them? Because the hardcoded ones sometimes will make you re-enter the captcha dozens of times. Those cookies will be updated automatically (every three months). But it will also be possible to update them manually if necessary (for example, when the old ones give too many challenges in a row).</string>
<string name="captcha_layout_v2_verify_button_text" tools:ignore="MissingTranslation">Verify</string> <string name="captcha_layout_v2_verify_button_text" tools:ignore="MissingTranslation">Verify</string>
<string name="captcha_layout_v2_reload" tools:ignore="MissingTranslation">Reload</string> <string name="captcha_layout_v2_reload" tools:ignore="MissingTranslation">Reload</string>

@ -0,0 +1,104 @@
package org.floens.chan.ui.captcha.v2;
import android.content.Context;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
import okhttp3.OkHttpClient;
import static org.junit.Assert.assertEquals;
public class CaptchaNoJsHtmlParserTest {
private List<String> inputDataList = new ArrayList<>();
private List<List<Integer>> resultCheckboxList = new ArrayList<>();
private List<String> resultTitleList = new ArrayList<>();
private List<String> resultCParameterList = new ArrayList<>();
private Context contextMock = Mockito.mock(Context.class);
private OkHttpClient okHttpClient = Mockito.mock(OkHttpClient.class);
private CaptchaNoJsHtmlParser parser = new CaptchaNoJsHtmlParser(contextMock, okHttpClient);
@Before
public void setUp() {
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-candidates\"><div class=\"rc-canonical-car\"></div></div><div class=\"rc-imageselect-desc\">Select all images with <strong>cars</strong></div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSABiot1uRaxXzd4_PRTTGbxW4AV8NOI947nBNVIBwdfOC2DwB0gdrPnfe8YYLI3kkW_tzwTJbQwZk0_nKaIsfXLaGWnnrEhvRMstWDzRin27w_Yalo6OS8Yr5sIqYBUfI496UtsoDGSL8NVQAbxjXocz_E7DTNXVBMfdLPx093-9vUHKH4yt4Mo6HuKSXmBPC2KNL4j_yl78YQ_VG1mprDwUkQeW-MQZxBOQb4MyhWZMOmNp_aRgHKGpJYHpcVMljDUvwZRk_xLw-NoJAWsgCIAt6pfrUE9jvHxjE4fep8OCH2T-6g-_Lla_UovuyEVIfUi1MQa6KWQMypsavA2mVUjTvIe_NkkO8fJ6gteHqUc7a9FTIHHs1OR5uV7fD0SCn9G5ii\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLSABiot1uRaxXzd4_PRTTGbxW4AV8NOI947nBNVIBwdfOC2DwB0gdrPnfe8YYLI3kkW_tzwTJbQwZk0_nKaIsfXLaGWnnrEhvRMstWDzRin27w_Yalo6OS8Yr5sIqYBUfI496UtsoDGSL8NVQAbxjXocz_E7DTNXVBMfdLPx093-9vUHKH4yt4Mo6HuKSXmBPC2KNL4j_yl78YQ_VG1mprDwUkQeW-MQZxBOQb4MyhWZMOmNp_aRgHKGpJYHpcVMljDUvwZRk_xLw-NoJAWsgCIAt6pfrUE9jvHxjE4fep8OCH2T-6g-_Lla_UovuyEVIfUi1MQa6KWQMypsavA2mVUjTvIe_NkkO8fJ6gteHqUc7a9FTIHHs1OR5uV7fD0SCn9G5ii&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSABiot1uRaxXzd4_PRTTGbxW4AV8NOI947nBNVIBwdfOC2DwB0gdrPnfe8YYLI3kkW_tzwTJbQwZk0_nKaIsfXLaGWnnrEhvRMstWDzRin27w_Yalo6OS8Yr5sIqYBUfI496UtsoDGSL8NVQAbxjXocz_E7DTNXVBMfdLPx093-9vUHKH4yt4Mo6HuKSXmBPC2KNL4j_yl78YQ_VG1mprDwUkQeW-MQZxBOQb4MyhWZMOmNp_aRgHKGpJYHpcVMljDUvwZRk_xLw-NoJAWsgCIAt6pfrUE9jvHxjE4fep8OCH2T-6g-_Lla_UovuyEVIfUi1MQa6KWQMypsavA2mVUjTvIe_NkkO8fJ6gteHqUc7a9FTIHHs1OR5uV7fD0SCn9G5ii\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSABiot1uRaxXzd4_PRTTGbxW4AV8NOI947nBNVIBwdfOC2DwB0gdrPnfe8YYLI3kkW_tzwTJbQwZk0_nKaIsfXLaGWnnrEhvRMstWDzRin27w_Yalo6OS8Yr5sIqYBUfI496UtsoDGSL8NVQAbxjXocz_E7DTNXVBMfdLPx093-9vUHKH4yt4Mo6HuKSXmBPC2KNL4j_yl78YQ_VG1mprDwUkQeW-MQZxBOQb4MyhWZMOmNp_aRgHKGpJYHpcVMljDUvwZRk_xLw-NoJAWsgCIAt6pfrUE9jvHxjE4fep8OCH2T-6g-_Lla_UovuyEVIfUi1MQa6KWQMypsavA2mVUjTvIe_NkkO8fJ6gteHqUc7a9FTIHHs1OR5uV7fD0SCn9G5ii\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"qnaxKyOmAYxqk1TC5w5H7Q\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-desc-no-canonical\">Select all images with <strong>mountains or hills</strong>.</div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLRv_ZKMPWAc0bBYTnC9wPIQElGB6H6SrifMnrj1yDeFnUPNpOPgGZHdaGPVzfieFHzQOh4GIKWUBPQ_aMs3gp0EJmgdP-LAGFBZIreVB-boqP1DyIblN-3ws1bxCyVvw4kSanc08rPVr7G2nwy7b0kkBV82x8ypU1QP1fQR1HxC8qUddQZSLvgmkFiRatbaOqMdsMPDwl1ENJVrzTkX0sQGmfqnf2aisqRbSsiH0BrW1_wTLPjiGv1SW-FrBYWKJZBWP_FanbTftUuhKLaYTjABDD2mcBg-7-QEpFbaFqi7cwSA4Y-SsCiJg7y0DBL8PjsDSxOqoY_Upc5I-0GI3X21KJLJMLxq9tRkWZbsyhHXNyFzzM_4PfOIiGErbTMzICa596q7\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLRv_ZKMPWAc0bBYTnC9wPIQElGB6H6SrifMnrj1yDeFnUPNpOPgGZHdaGPVzfieFHzQOh4GIKWUBPQ_aMs3gp0EJmgdP-LAGFBZIreVB-boqP1DyIblN-3ws1bxCyVvw4kSanc08rPVr7G2nwy7b0kkBV82x8ypU1QP1fQR1HxC8qUddQZSLvgmkFiRatbaOqMdsMPDwl1ENJVrzTkX0sQGmfqnf2aisqRbSsiH0BrW1_wTLPjiGv1SW-FrBYWKJZBWP_FanbTftUuhKLaYTjABDD2mcBg-7-QEpFbaFqi7cwSA4Y-SsCiJg7y0DBL8PjsDSxOqoY_Upc5I-0GI3X21KJLJMLxq9tRkWZbsyhHXNyFzzM_4PfOIiGErbTMzICa596q7&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLRv_ZKMPWAc0bBYTnC9wPIQElGB6H6SrifMnrj1yDeFnUPNpOPgGZHdaGPVzfieFHzQOh4GIKWUBPQ_aMs3gp0EJmgdP-LAGFBZIreVB-boqP1DyIblN-3ws1bxCyVvw4kSanc08rPVr7G2nwy7b0kkBV82x8ypU1QP1fQR1HxC8qUddQZSLvgmkFiRatbaOqMdsMPDwl1ENJVrzTkX0sQGmfqnf2aisqRbSsiH0BrW1_wTLPjiGv1SW-FrBYWKJZBWP_FanbTftUuhKLaYTjABDD2mcBg-7-QEpFbaFqi7cwSA4Y-SsCiJg7y0DBL8PjsDSxOqoY_Upc5I-0GI3X21KJLJMLxq9tRkWZbsyhHXNyFzzM_4PfOIiGErbTMzICa596q7\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLRv_ZKMPWAc0bBYTnC9wPIQElGB6H6SrifMnrj1yDeFnUPNpOPgGZHdaGPVzfieFHzQOh4GIKWUBPQ_aMs3gp0EJmgdP-LAGFBZIreVB-boqP1DyIblN-3ws1bxCyVvw4kSanc08rPVr7G2nwy7b0kkBV82x8ypU1QP1fQR1HxC8qUddQZSLvgmkFiRatbaOqMdsMPDwl1ENJVrzTkX0sQGmfqnf2aisqRbSsiH0BrW1_wTLPjiGv1SW-FrBYWKJZBWP_FanbTftUuhKLaYTjABDD2mcBg-7-QEpFbaFqi7cwSA4Y-SsCiJg7y0DBL8PjsDSxOqoY_Upc5I-0GI3X21KJLJMLxq9tRkWZbsyhHXNyFzzM_4PfOIiGErbTMzICa596q7\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"9mPanFXMj8uH+hihgCN2rQ\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-desc-no-canonical\">Select all images with <strong>crosswalks</strong>.</div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLQdQO0rHKgYInXnNyPho7cEllKtboAokZsqQPHyE5VkAEXwvkvin540F_CAPIA872WSFqdlShtJvERZPgOP_DmuO4lAF7CxIRDeRzyMd2kKF-ivS3XADiISevh50q1qtolKOW6nhdktgo4JxW3nej539yRZxJ4X6SRde_29QsGgqtTUUB82CYWZ2vOa9yclvuMMLPTFfIIRQHy4DNQXqVOEKV0PfvBatjLhq4ekuYgEoHbni97ePTmjvfsL0gy6CR2SAmOf6m7oJm2snVyBBgxWfMnPue6wypmHco7JRLcEsRHOvUDBLa6rMT5p7fiRP3sxPQNcv_H6prK_EAtSPOB29SELUlf7G72UlcxBNOaKxsOY_xzyFHnyFPRTERh2xc7FEmDF\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLQdQO0rHKgYInXnNyPho7cEllKtboAokZsqQPHyE5VkAEXwvkvin540F_CAPIA872WSFqdlShtJvERZPgOP_DmuO4lAF7CxIRDeRzyMd2kKF-ivS3XADiISevh50q1qtolKOW6nhdktgo4JxW3nej539yRZxJ4X6SRde_29QsGgqtTUUB82CYWZ2vOa9yclvuMMLPTFfIIRQHy4DNQXqVOEKV0PfvBatjLhq4ekuYgEoHbni97ePTmjvfsL0gy6CR2SAmOf6m7oJm2snVyBBgxWfMnPue6wypmHco7JRLcEsRHOvUDBLa6rMT5p7fiRP3sxPQNcv_H6prK_EAtSPOB29SELUlf7G72UlcxBNOaKxsOY_xzyFHnyFPRTERh2xc7FEmDF&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLQdQO0rHKgYInXnNyPho7cEllKtboAokZsqQPHyE5VkAEXwvkvin540F_CAPIA872WSFqdlShtJvERZPgOP_DmuO4lAF7CxIRDeRzyMd2kKF-ivS3XADiISevh50q1qtolKOW6nhdktgo4JxW3nej539yRZxJ4X6SRde_29QsGgqtTUUB82CYWZ2vOa9yclvuMMLPTFfIIRQHy4DNQXqVOEKV0PfvBatjLhq4ekuYgEoHbni97ePTmjvfsL0gy6CR2SAmOf6m7oJm2snVyBBgxWfMnPue6wypmHco7JRLcEsRHOvUDBLa6rMT5p7fiRP3sxPQNcv_H6prK_EAtSPOB29SELUlf7G72UlcxBNOaKxsOY_xzyFHnyFPRTERh2xc7FEmDF\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLQdQO0rHKgYInXnNyPho7cEllKtboAokZsqQPHyE5VkAEXwvkvin540F_CAPIA872WSFqdlShtJvERZPgOP_DmuO4lAF7CxIRDeRzyMd2kKF-ivS3XADiISevh50q1qtolKOW6nhdktgo4JxW3nej539yRZxJ4X6SRde_29QsGgqtTUUB82CYWZ2vOa9yclvuMMLPTFfIIRQHy4DNQXqVOEKV0PfvBatjLhq4ekuYgEoHbni97ePTmjvfsL0gy6CR2SAmOf6m7oJm2snVyBBgxWfMnPue6wypmHco7JRLcEsRHOvUDBLa6rMT5p7fiRP3sxPQNcv_H6prK_EAtSPOB29SELUlf7G72UlcxBNOaKxsOY_xzyFHnyFPRTERh2xc7FEmDF\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"FBv2o/5cAreDSNeyDhdNxQ\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-candidates\"><div class=\"rc-canonical-bridge\"></div></div><div class=\"rc-imageselect-desc\">Select all images with <strong>bridges</strong>.</div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTkdQd0zGmSjFw9OCiKz18VT-h4lleJaBwtNMSDPFsUSR_9qepA1uCUW_FNAju-tgYzTOTjmjf0wWmvfLlwKCxEsyMKfYobnJXXYcOHyAwaOJRtEOAwn2SSmVEzlE1DYZ89lFH7XB5rw6tGpSJRJQkvitoVK-aLg_gzmYxbYJPH_VK9ofkfeGfhnZ6bsXoz1vnnhHYOXm7apmKjDEk6NIxKqB_FHDFclemX8rr7liJBaTcJ98I20a9wXGinBUEEyupoQ5gdnoYqLMu_XIQaRYtdmRsCgtm9RorpkJZxaqEpqfusfpFZUntIXkXF31dmx0hL-B5DpA4uFOBI6UmR2oPLAA2LhStMgKtlnl1IYwyrmaeYUybV0rPl0F5jMAr3GZxEa7Ld\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLTkdQd0zGmSjFw9OCiKz18VT-h4lleJaBwtNMSDPFsUSR_9qepA1uCUW_FNAju-tgYzTOTjmjf0wWmvfLlwKCxEsyMKfYobnJXXYcOHyAwaOJRtEOAwn2SSmVEzlE1DYZ89lFH7XB5rw6tGpSJRJQkvitoVK-aLg_gzmYxbYJPH_VK9ofkfeGfhnZ6bsXoz1vnnhHYOXm7apmKjDEk6NIxKqB_FHDFclemX8rr7liJBaTcJ98I20a9wXGinBUEEyupoQ5gdnoYqLMu_XIQaRYtdmRsCgtm9RorpkJZxaqEpqfusfpFZUntIXkXF31dmx0hL-B5DpA4uFOBI6UmR2oPLAA2LhStMgKtlnl1IYwyrmaeYUybV0rPl0F5jMAr3GZxEa7Ld&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTkdQd0zGmSjFw9OCiKz18VT-h4lleJaBwtNMSDPFsUSR_9qepA1uCUW_FNAju-tgYzTOTjmjf0wWmvfLlwKCxEsyMKfYobnJXXYcOHyAwaOJRtEOAwn2SSmVEzlE1DYZ89lFH7XB5rw6tGpSJRJQkvitoVK-aLg_gzmYxbYJPH_VK9ofkfeGfhnZ6bsXoz1vnnhHYOXm7apmKjDEk6NIxKqB_FHDFclemX8rr7liJBaTcJ98I20a9wXGinBUEEyupoQ5gdnoYqLMu_XIQaRYtdmRsCgtm9RorpkJZxaqEpqfusfpFZUntIXkXF31dmx0hL-B5DpA4uFOBI6UmR2oPLAA2LhStMgKtlnl1IYwyrmaeYUybV0rPl0F5jMAr3GZxEa7Ld\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTkdQd0zGmSjFw9OCiKz18VT-h4lleJaBwtNMSDPFsUSR_9qepA1uCUW_FNAju-tgYzTOTjmjf0wWmvfLlwKCxEsyMKfYobnJXXYcOHyAwaOJRtEOAwn2SSmVEzlE1DYZ89lFH7XB5rw6tGpSJRJQkvitoVK-aLg_gzmYxbYJPH_VK9ofkfeGfhnZ6bsXoz1vnnhHYOXm7apmKjDEk6NIxKqB_FHDFclemX8rr7liJBaTcJ98I20a9wXGinBUEEyupoQ5gdnoYqLMu_XIQaRYtdmRsCgtm9RorpkJZxaqEpqfusfpFZUntIXkXF31dmx0hL-B5DpA4uFOBI6UmR2oPLAA2LhStMgKtlnl1IYwyrmaeYUybV0rPl0F5jMAr3GZxEa7Ld\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"/dAVLmM2x00DwplNUqTwoA\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-desc-no-canonical\">Select all images with <strong>bicycles</strong></div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTAhnX3O2lESLZYL9y7w8txPisktNhNpI-h3hZpULhz_-yMEId_7-NW8RGCMbZ6_W8CRH6LnL7Icxdw3nISINh3DGcldAmF8jojjG17gPIVvCCk1WdKfgYSkC_oAThQDESoAOz-VGAahHroLUNSnCm1tHmExy5tRX3EGi0xO3ep-1iMSGuMb_aoo3hxIuEZE4_J37RGoE--t2yoU4pKDxfbnHNYYfl48KgIb_qBzUt9O-gOF5P3oMM7G5HpMHjq3lraD0Ep19tiq5c_P-JO21V7QiJBB8XiwqgIHsEwGaLsm3J2NdQjLHot1xy8_A8x04ZTqHw-d_LnpBOTz8Jry5ym2K-zfkqkK1VtbJUnayZ-i-e5_ErxE3HTesMtzJ6I-ZBu2h8T\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLTAhnX3O2lESLZYL9y7w8txPisktNhNpI-h3hZpULhz_-yMEId_7-NW8RGCMbZ6_W8CRH6LnL7Icxdw3nISINh3DGcldAmF8jojjG17gPIVvCCk1WdKfgYSkC_oAThQDESoAOz-VGAahHroLUNSnCm1tHmExy5tRX3EGi0xO3ep-1iMSGuMb_aoo3hxIuEZE4_J37RGoE--t2yoU4pKDxfbnHNYYfl48KgIb_qBzUt9O-gOF5P3oMM7G5HpMHjq3lraD0Ep19tiq5c_P-JO21V7QiJBB8XiwqgIHsEwGaLsm3J2NdQjLHot1xy8_A8x04ZTqHw-d_LnpBOTz8Jry5ym2K-zfkqkK1VtbJUnayZ-i-e5_ErxE3HTesMtzJ6I-ZBu2h8T&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTAhnX3O2lESLZYL9y7w8txPisktNhNpI-h3hZpULhz_-yMEId_7-NW8RGCMbZ6_W8CRH6LnL7Icxdw3nISINh3DGcldAmF8jojjG17gPIVvCCk1WdKfgYSkC_oAThQDESoAOz-VGAahHroLUNSnCm1tHmExy5tRX3EGi0xO3ep-1iMSGuMb_aoo3hxIuEZE4_J37RGoE--t2yoU4pKDxfbnHNYYfl48KgIb_qBzUt9O-gOF5P3oMM7G5HpMHjq3lraD0Ep19tiq5c_P-JO21V7QiJBB8XiwqgIHsEwGaLsm3J2NdQjLHot1xy8_A8x04ZTqHw-d_LnpBOTz8Jry5ym2K-zfkqkK1VtbJUnayZ-i-e5_ErxE3HTesMtzJ6I-ZBu2h8T\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLTAhnX3O2lESLZYL9y7w8txPisktNhNpI-h3hZpULhz_-yMEId_7-NW8RGCMbZ6_W8CRH6LnL7Icxdw3nISINh3DGcldAmF8jojjG17gPIVvCCk1WdKfgYSkC_oAThQDESoAOz-VGAahHroLUNSnCm1tHmExy5tRX3EGi0xO3ep-1iMSGuMb_aoo3hxIuEZE4_J37RGoE--t2yoU4pKDxfbnHNYYfl48KgIb_qBzUt9O-gOF5P3oMM7G5HpMHjq3lraD0Ep19tiq5c_P-JO21V7QiJBB8XiwqgIHsEwGaLsm3J2NdQjLHot1xy8_A8x04ZTqHw-d_LnpBOTz8Jry5ym2K-zfkqkK1VtbJUnayZ-i-e5_ErxE3HTesMtzJ6I-ZBu2h8T\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"qBUhkppTt1rZFbcmcQcqhw\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-candidates\"><div class=\"rc-canonical-car\"></div></div><div class=\"rc-imageselect-desc\">Select all images with <strong>cars</strong></div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSu6KJ0tMzrENsXJM2H5K8GDF_2PZOEYKew4UxN49JDmoXnrlOFLYbETkJfXyG-kXWdmiTIg3XgR8vVfIf8J4oR1DpEyi9HcPaV9kLNeq-0aK3P1Vw62wBm3OOhU_zeP49kiwmy4icv4ro9NQjfBxw1scZgYsj_R41sBDvlLkofoDMrWNzsAjwFAM2pmbRGKf6qThzQ6ijSAjHBAD_oIK4E4m7kgeUZyEvw9-2MN_8AJoGXtI_74LdvbkngnF1qqK5gIKYX05AyaI39M1-TXfT5Gq2ePu8XMKUR709pZPc22Pw9lni0a1I-UyfGMJJ1u0Pvh0HKO6atPREGFcXwvhOQsSHakAGuzHUE8V5ywUqpW3mNFE0xly-GK07BbGMicQZ-7F-9\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLSu6KJ0tMzrENsXJM2H5K8GDF_2PZOEYKew4UxN49JDmoXnrlOFLYbETkJfXyG-kXWdmiTIg3XgR8vVfIf8J4oR1DpEyi9HcPaV9kLNeq-0aK3P1Vw62wBm3OOhU_zeP49kiwmy4icv4ro9NQjfBxw1scZgYsj_R41sBDvlLkofoDMrWNzsAjwFAM2pmbRGKf6qThzQ6ijSAjHBAD_oIK4E4m7kgeUZyEvw9-2MN_8AJoGXtI_74LdvbkngnF1qqK5gIKYX05AyaI39M1-TXfT5Gq2ePu8XMKUR709pZPc22Pw9lni0a1I-UyfGMJJ1u0Pvh0HKO6atPREGFcXwvhOQsSHakAGuzHUE8V5ywUqpW3mNFE0xly-GK07BbGMicQZ-7F-9&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSu6KJ0tMzrENsXJM2H5K8GDF_2PZOEYKew4UxN49JDmoXnrlOFLYbETkJfXyG-kXWdmiTIg3XgR8vVfIf8J4oR1DpEyi9HcPaV9kLNeq-0aK3P1Vw62wBm3OOhU_zeP49kiwmy4icv4ro9NQjfBxw1scZgYsj_R41sBDvlLkofoDMrWNzsAjwFAM2pmbRGKf6qThzQ6ijSAjHBAD_oIK4E4m7kgeUZyEvw9-2MN_8AJoGXtI_74LdvbkngnF1qqK5gIKYX05AyaI39M1-TXfT5Gq2ePu8XMKUR709pZPc22Pw9lni0a1I-UyfGMJJ1u0Pvh0HKO6atPREGFcXwvhOQsSHakAGuzHUE8V5ywUqpW3mNFE0xly-GK07BbGMicQZ-7F-9\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSu6KJ0tMzrENsXJM2H5K8GDF_2PZOEYKew4UxN49JDmoXnrlOFLYbETkJfXyG-kXWdmiTIg3XgR8vVfIf8J4oR1DpEyi9HcPaV9kLNeq-0aK3P1Vw62wBm3OOhU_zeP49kiwmy4icv4ro9NQjfBxw1scZgYsj_R41sBDvlLkofoDMrWNzsAjwFAM2pmbRGKf6qThzQ6ijSAjHBAD_oIK4E4m7kgeUZyEvw9-2MN_8AJoGXtI_74LdvbkngnF1qqK5gIKYX05AyaI39M1-TXfT5Gq2ePu8XMKUR709pZPc22Pw9lni0a1I-UyfGMJJ1u0Pvh0HKO6atPREGFcXwvhOQsSHakAGuzHUE8V5ywUqpW3mNFE0xly-GK07BbGMicQZ-7F-9\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"/dM7smPRYX0+FKHz5eMxYw\">document.body.className += \" js-enabled\";</script></body></html>");
inputDataList.add("<!DOCTYPE HTML><html dir=\"ltr\"><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>reCAPTCHA challenge</title><link rel=\"stylesheet\" href=\"https://www.gstatic.com/recaptcha/api2/v1557729121476/fallback__ltr.css\" type=\"text/css\" charset=\"utf-8\"></head><body><div class=\"fbc\"><div class=\"fbc-alert\"></div><div class=\"fbc-header\"><div class=\"fbc-logo\"><div class=\"fbc-logo-img\"></div><div class=\"fbc-logo-text\">reCAPTCHA</div></div><div class=\"fbc-imageselect-candidates\"></div><div class=\"fbc-imageselect-message-without-candidate-image\"><label for=\"response\" class=\"fbc-imageselect-message-text\"><div class=\"rc-imageselect-desc-no-canonical\">Select all images with a <strong>bus</strong>.</div></label></div></div><div><div class=\"fbc-imageselect-challenge\"><form method=\"POST\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSe4m_kEnKDI7Zg9oYjJ28Y1XKwS7uZ10NlWRoq-2e5tLG3r47ClAG3F_pTLqQC_krxnHkt8UBIV5EfW5goPvQQQN2W8ll3YYiMjWM_ge1_Z9lk_7M5KCriFBFhmPMB1MtMfeXS5LpcekGDSq9J2O20zySzNHXZ7xkvx5vJ327ioNoDEizwInEaLMG5tMqaWthqZE_-DZlpI7n3v35Glt3hNuT_utgSlBBqt7yipMuy-dunICsXT3Oxojeb-zcvPk3SFsWyMcTI-354eV1PfA-7q0mOGIADYuavzciBKjfZEHrsR9su48sHj_AH8RG4b_8yBzmR7WAj7Va-EhZzxDnlGdfBVqUo5wVUyJxlZe6NWkNkBwiaisxhC8As0VJIY0u_ugms\"/><div class=\"fbc-payload-imageselect\"><input class=\"fbc-imageselect-checkbox-1\" type=\"checkbox\" name=\"response\" value=\"0\"><input class=\"fbc-imageselect-checkbox-2\" type=\"checkbox\" name=\"response\" value=\"1\"><input class=\"fbc-imageselect-checkbox-3\" type=\"checkbox\" name=\"response\" value=\"2\"><input class=\"fbc-imageselect-checkbox-4\" type=\"checkbox\" name=\"response\" value=\"3\"><input class=\"fbc-imageselect-checkbox-5\" type=\"checkbox\" name=\"response\" value=\"4\"><input class=\"fbc-imageselect-checkbox-6\" type=\"checkbox\" name=\"response\" value=\"5\"><input class=\"fbc-imageselect-checkbox-7\" type=\"checkbox\" name=\"response\" value=\"6\"><input class=\"fbc-imageselect-checkbox-8\" type=\"checkbox\" name=\"response\" value=\"7\"><input class=\"fbc-imageselect-checkbox-9\" type=\"checkbox\" name=\"response\" value=\"8\"><img class=\"fbc-imageselect-payload\" src=\"/recaptcha/api2/payload?c=03AOLTBLSe4m_kEnKDI7Zg9oYjJ28Y1XKwS7uZ10NlWRoq-2e5tLG3r47ClAG3F_pTLqQC_krxnHkt8UBIV5EfW5goPvQQQN2W8ll3YYiMjWM_ge1_Z9lk_7M5KCriFBFhmPMB1MtMfeXS5LpcekGDSq9J2O20zySzNHXZ7xkvx5vJ327ioNoDEizwInEaLMG5tMqaWthqZE_-DZlpI7n3v35Glt3hNuT_utgSlBBqt7yipMuy-dunICsXT3Oxojeb-zcvPk3SFsWyMcTI-354eV1PfA-7q0mOGIADYuavzciBKjfZEHrsR9su48sHj_AH8RG4b_8yBzmR7WAj7Va-EhZzxDnlGdfBVqUo5wVUyJxlZe6NWkNkBwiaisxhC8As0VJIY0u_ugms&amp;k=6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc\" alt=\"reCAPTCHA challenge image\"/></div><div class=\"fbc-button-verify\"><input type=\"submit\" value=\"Verify\"/></div></form></div></div><div class=\"fbc-buttons\"><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSe4m_kEnKDI7Zg9oYjJ28Y1XKwS7uZ10NlWRoq-2e5tLG3r47ClAG3F_pTLqQC_krxnHkt8UBIV5EfW5goPvQQQN2W8ll3YYiMjWM_ge1_Z9lk_7M5KCriFBFhmPMB1MtMfeXS5LpcekGDSq9J2O20zySzNHXZ7xkvx5vJ327ioNoDEizwInEaLMG5tMqaWthqZE_-DZlpI7n3v35Glt3hNuT_utgSlBBqt7yipMuy-dunICsXT3Oxojeb-zcvPk3SFsWyMcTI-354eV1PfA-7q0mOGIADYuavzciBKjfZEHrsR9su48sHj_AH8RG4b_8yBzmR7WAj7Va-EhZzxDnlGdfBVqUo5wVUyJxlZe6NWkNkBwiaisxhC8As0VJIY0u_ugms\"/><input type=\"hidden\" name=\"reason\" value=\"r\"/><input class=\"fbc-button-reload fbc-button\" type=\"submit\" value=\"Get a new challenge\"/></form></div><div class=\"fbc-button-holder\"><form method=\"POST\" tabindex=\"-1\"><input type=\"hidden\" name=\"c\" value=\"03AOLTBLSe4m_kEnKDI7Zg9oYjJ28Y1XKwS7uZ10NlWRoq-2e5tLG3r47ClAG3F_pTLqQC_krxnHkt8UBIV5EfW5goPvQQQN2W8ll3YYiMjWM_ge1_Z9lk_7M5KCriFBFhmPMB1MtMfeXS5LpcekGDSq9J2O20zySzNHXZ7xkvx5vJ327ioNoDEizwInEaLMG5tMqaWthqZE_-DZlpI7n3v35Glt3hNuT_utgSlBBqt7yipMuy-dunICsXT3Oxojeb-zcvPk3SFsWyMcTI-354eV1PfA-7q0mOGIADYuavzciBKjfZEHrsR9su48sHj_AH8RG4b_8yBzmR7WAj7Va-EhZzxDnlGdfBVqUo5wVUyJxlZe6NWkNkBwiaisxhC8As0VJIY0u_ugms\"/><input type=\"hidden\" name=\"reason\" value=\"a\"/><input class=\"fbc-button-audio fbc-button\" type=\"submit\" value=\"Get an audio challenge\"/></form></div></div></div><div class=\"fbc-why-fallback\"><a href=\"https://support.google.com/recaptcha#6262736\" target=\"_blank\">Want an easier challenge?</a></div><div class=\"fbc-separator\"></div><div class=\"fbc-privacy\"><a href=\"https://www.google.com/intl/en/policies/privacy/\" target=\"_blank\">Privacy</a> - <a href=\"https://www.google.com/intl/en/policies/terms/\" target=\"_blank\">Terms</a></div></div><script nonce=\"AxGVM2LSHezkZMBRJNGTTQ\">document.body.className += \" js-enabled\";</script></body></html>");
for (int i = 0; i < inputDataList.size(); ++i) {
resultCheckboxList.add(new ArrayList<>());
resultCheckboxList.get(i).add(0);
resultCheckboxList.get(i).add(1);
resultCheckboxList.get(i).add(2);
resultCheckboxList.get(i).add(3);
resultCheckboxList.get(i).add(4);
resultCheckboxList.get(i).add(5);
resultCheckboxList.get(i).add(6);
resultCheckboxList.get(i).add(7);
resultCheckboxList.get(i).add(8);
}
resultTitleList.add("Select all images with cars");
resultTitleList.add("Select all images with mountains or hills");
resultTitleList.add("Select all images with crosswalks");
resultTitleList.add("Select all images with bridges");
resultTitleList.add("Select all images with bicycles");
resultTitleList.add("Select all images with cars");
resultTitleList.add("Select all images with a bus");
resultCParameterList.add("03AOLTBLSABiot1uRaxXzd4_PRTTGbxW4AV8NOI947nBNVIBwdfOC2DwB0gdrPnfe8YYLI3kkW_tzwTJbQwZk0_nKaIsfXLaGWnnrEhvRMstWDzRin27w_Yalo6OS8Yr5sIqYBUfI496UtsoDGSL8NVQAbxjXocz_E7DTNXVBMfdLPx093-9vUHKH4yt4Mo6HuKSXmBPC2KNL4j_yl78YQ_VG1mprDwUkQeW-MQZxBOQb4MyhWZMOmNp_aRgHKGpJYHpcVMljDUvwZRk_xLw-NoJAWsgCIAt6pfrUE9jvHxjE4fep8OCH2T-6g-_Lla_UovuyEVIfUi1MQa6KWQMypsavA2mVUjTvIe_NkkO8fJ6gteHqUc7a9FTIHHs1OR5uV7fD0SCn9G5ii");
resultCParameterList.add("03AOLTBLRv_ZKMPWAc0bBYTnC9wPIQElGB6H6SrifMnrj1yDeFnUPNpOPgGZHdaGPVzfieFHzQOh4GIKWUBPQ_aMs3gp0EJmgdP-LAGFBZIreVB-boqP1DyIblN-3ws1bxCyVvw4kSanc08rPVr7G2nwy7b0kkBV82x8ypU1QP1fQR1HxC8qUddQZSLvgmkFiRatbaOqMdsMPDwl1ENJVrzTkX0sQGmfqnf2aisqRbSsiH0BrW1_wTLPjiGv1SW-FrBYWKJZBWP_FanbTftUuhKLaYTjABDD2mcBg-7-QEpFbaFqi7cwSA4Y-SsCiJg7y0DBL8PjsDSxOqoY_Upc5I-0GI3X21KJLJMLxq9tRkWZbsyhHXNyFzzM_4PfOIiGErbTMzICa596q7");
resultCParameterList.add("03AOLTBLQdQO0rHKgYInXnNyPho7cEllKtboAokZsqQPHyE5VkAEXwvkvin540F_CAPIA872WSFqdlShtJvERZPgOP_DmuO4lAF7CxIRDeRzyMd2kKF-ivS3XADiISevh50q1qtolKOW6nhdktgo4JxW3nej539yRZxJ4X6SRde_29QsGgqtTUUB82CYWZ2vOa9yclvuMMLPTFfIIRQHy4DNQXqVOEKV0PfvBatjLhq4ekuYgEoHbni97ePTmjvfsL0gy6CR2SAmOf6m7oJm2snVyBBgxWfMnPue6wypmHco7JRLcEsRHOvUDBLa6rMT5p7fiRP3sxPQNcv_H6prK_EAtSPOB29SELUlf7G72UlcxBNOaKxsOY_xzyFHnyFPRTERh2xc7FEmDF");
resultCParameterList.add("03AOLTBLTkdQd0zGmSjFw9OCiKz18VT-h4lleJaBwtNMSDPFsUSR_9qepA1uCUW_FNAju-tgYzTOTjmjf0wWmvfLlwKCxEsyMKfYobnJXXYcOHyAwaOJRtEOAwn2SSmVEzlE1DYZ89lFH7XB5rw6tGpSJRJQkvitoVK-aLg_gzmYxbYJPH_VK9ofkfeGfhnZ6bsXoz1vnnhHYOXm7apmKjDEk6NIxKqB_FHDFclemX8rr7liJBaTcJ98I20a9wXGinBUEEyupoQ5gdnoYqLMu_XIQaRYtdmRsCgtm9RorpkJZxaqEpqfusfpFZUntIXkXF31dmx0hL-B5DpA4uFOBI6UmR2oPLAA2LhStMgKtlnl1IYwyrmaeYUybV0rPl0F5jMAr3GZxEa7Ld");
resultCParameterList.add("03AOLTBLTAhnX3O2lESLZYL9y7w8txPisktNhNpI-h3hZpULhz_-yMEId_7-NW8RGCMbZ6_W8CRH6LnL7Icxdw3nISINh3DGcldAmF8jojjG17gPIVvCCk1WdKfgYSkC_oAThQDESoAOz-VGAahHroLUNSnCm1tHmExy5tRX3EGi0xO3ep-1iMSGuMb_aoo3hxIuEZE4_J37RGoE--t2yoU4pKDxfbnHNYYfl48KgIb_qBzUt9O-gOF5P3oMM7G5HpMHjq3lraD0Ep19tiq5c_P-JO21V7QiJBB8XiwqgIHsEwGaLsm3J2NdQjLHot1xy8_A8x04ZTqHw-d_LnpBOTz8Jry5ym2K-zfkqkK1VtbJUnayZ-i-e5_ErxE3HTesMtzJ6I-ZBu2h8T");
resultCParameterList.add("03AOLTBLSu6KJ0tMzrENsXJM2H5K8GDF_2PZOEYKew4UxN49JDmoXnrlOFLYbETkJfXyG-kXWdmiTIg3XgR8vVfIf8J4oR1DpEyi9HcPaV9kLNeq-0aK3P1Vw62wBm3OOhU_zeP49kiwmy4icv4ro9NQjfBxw1scZgYsj_R41sBDvlLkofoDMrWNzsAjwFAM2pmbRGKf6qThzQ6ijSAjHBAD_oIK4E4m7kgeUZyEvw9-2MN_8AJoGXtI_74LdvbkngnF1qqK5gIKYX05AyaI39M1-TXfT5Gq2ePu8XMKUR709pZPc22Pw9lni0a1I-UyfGMJJ1u0Pvh0HKO6atPREGFcXwvhOQsSHakAGuzHUE8V5ywUqpW3mNFE0xly-GK07BbGMicQZ-7F-9");
resultCParameterList.add("03AOLTBLSe4m_kEnKDI7Zg9oYjJ28Y1XKwS7uZ10NlWRoq-2e5tLG3r47ClAG3F_pTLqQC_krxnHkt8UBIV5EfW5goPvQQQN2W8ll3YYiMjWM_ge1_Z9lk_7M5KCriFBFhmPMB1MtMfeXS5LpcekGDSq9J2O20zySzNHXZ7xkvx5vJ327ioNoDEizwInEaLMG5tMqaWthqZE_-DZlpI7n3v35Glt3hNuT_utgSlBBqt7yipMuy-dunICsXT3Oxojeb-zcvPk3SFsWyMcTI-354eV1PfA-7q0mOGIADYuavzciBKjfZEHrsR9su48sHj_AH8RG4b_8yBzmR7WAj7Va-EhZzxDnlGdfBVqUo5wVUyJxlZe6NWkNkBwiaisxhC8As0VJIY0u_ugms");
}
@Test
public void testCheckBoxParsing() throws CaptchaNoJsHtmlParser.CaptchaNoJsV2ParsingError {
for (int i = 0; i < inputDataList.size(); ++i) {
String inputData = inputDataList.get(i);
CaptchaInfo captchaInfo = new CaptchaInfo();
parser.parseCheckboxes(inputData, captchaInfo);
for (int j = 0; j < captchaInfo.checkboxes.size(); j++) {
Integer checkbox = captchaInfo.checkboxes.get(j);
assertEquals(checkbox, resultCheckboxList.get(i).get(j));
}
}
}
@Test
public void testTitleParsing() throws CaptchaNoJsHtmlParser.CaptchaNoJsV2ParsingError {
for (int i = 0; i < inputDataList.size(); ++i) {
String inputData = inputDataList.get(i);
CaptchaInfo captchaInfo = new CaptchaInfo();
parser.parseChallengeTitle(inputData, captchaInfo);
String title = captchaInfo.captchaTitle.getTitle();
assertEquals(resultTitleList.get(i), title);
}
}
@Test
public void testCValueParsing() throws CaptchaNoJsHtmlParser.CaptchaNoJsV2ParsingError {
for (int i = 0; i < inputDataList.size(); ++i) {
String inputData = inputDataList.get(i);
CaptchaInfo captchaInfo = new CaptchaInfo();
parser.parseCParameter(inputData, captchaInfo);
String cParameter = captchaInfo.cParameter;
assertEquals(resultCParameterList.get(i), cParameter);
}
}
}
Loading…
Cancel
Save