{"id":3051,"date":"2026-05-31T14:29:17","date_gmt":"2026-05-31T14:29:17","guid":{"rendered":"https:\/\/deathbycaptcha.com\/blog\/?p=3051"},"modified":"2026-05-31T20:33:29","modified_gmt":"2026-05-31T20:33:29","slug":"automating-captcha-submission-with-playwright-and-death-by-captcha","status":"publish","type":"post","link":"https:\/\/deathbycaptcha.com\/blog\/usage-best-practices\/automating-captcha-submission-with-playwright-and-death-by-captcha","title":{"rendered":"Automating Captchas with Playwright &#038; Death By Captcha"},"content":{"rendered":"\n<p>Browser automation becomes significantly more powerful when combined with intelligent captcha solving. If your workflow involves solving a captcha and submitting it to a website, manually solving it quickly becomes inefficient. A more scalable approach is to combine our captcha solving API with&nbsp;<strong>Playwright<\/strong>. This article walks through how to implement that workflow using&nbsp;<strong>Node.js<\/strong>.<a href=\"https:\/\/deathbycaptcha.com\/blog\/wp-content\/uploads\/2026\/05\/playwrite-post-featured-img.jpg\"><\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The workflow in a nutshell<\/h4>\n\n\n\n<p>The first step is submitting the captcha to&nbsp;<a href=\"https:\/\/deathbycaptcha.com\/\">Death By Captcha<\/a>&nbsp;API, check if the token is ready by polling the API every 5 seconds until a token is returned, then the token is inserted into the hidden&nbsp;<code>textarea<\/code>&nbsp;element with ID&nbsp;<code>g-recaptcha-response<\/code>&nbsp;and finally the form needs to be submitted.<\/p>\n\n\n\n<p><strong>This is a high level view of the whole pipeline:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">ReCAPTCHA \u2192 Submit captcha to API \u2192 Poll API for solution token \u2192 Browser Automation \u2192 Submission<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Why Use Playwright for This Workflow?<\/h4>\n\n\n\n<p>There are several browser automation frameworks available, but Playwright is especially well suited for modern API-driven automation.<\/p>\n\n\n\n<p><strong>a) Built-in async\/await support<\/strong><\/p>\n\n\n\n<p>The workflow reads clearly from top to bottom.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">await page.goto(...)await page.fill(...)await page.click(...)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>b) Cleaner browser interaction<\/strong><\/p>\n\n\n\n<p>Playwright provides direct methods for common form interactions such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Filling fields<\/li>\n\n\n\n<li>Clicking buttons<\/li>\n\n\n\n<li>Waiting for page readiness<\/li>\n<\/ul>\n\n\n\n<p>This keeps your implementation concise.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Understanding how to set up your own Playwright automation<\/h4>\n\n\n\n<p><strong>Note:<\/strong>&nbsp;We have added the full code at the bottom, this section is a high level overview of the overall Playwright workflow.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 1: Configure client to solve the captcha<\/h5>\n\n\n\n<p>a) Either Integrate our&nbsp;<a href=\"https:\/\/github.com\/deathbycaptcha\/deathbycaptcha-api-client-nodejs\/blob\/master\/examples\/example.reCAPTCHA_v2.js\">existing Node.js client<\/a>&nbsp;with your own logic,<\/p>\n\n\n\n<p>b) or use the sample code at the bottom section of the article (you can <a href=\"https:\/\/deathbycaptcha.com\/blog\/usage-best-practices\/how-to-solve-recaptcha-v2-invisible-with-node-js-and-death-by-captcha\">read more<\/a> about it\u2019s internal functions and setup).<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 2: Install required dependencies<\/h5>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>npm install playwright\nnpx playwright install<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #61AFEF\">npm<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">install<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">playwright<\/span><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">npx<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">playwright<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">install<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>The&nbsp;<strong><code>npm<\/code>&nbsp;<\/strong>dependency gives your Node.js application access to browser automation.<\/p>\n\n\n\n<p>The&nbsp;<strong><code>npx<\/code>&nbsp;<\/strong>dependency is needed since it gives you the binaries, downloads the actual browsers Playwright controls:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chromium<\/li>\n\n\n\n<li>Firefox<\/li>\n\n\n\n<li>WebKit<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 3: Configuring the Submission Target<\/h5>\n\n\n\n<p>The first part of the implementation defines the destination and selectors.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const SUBMISSION_URL = \"https:\/\/www.google.com\/recaptcha\/api2\/demo\";<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SUBMISSION_URL<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;https:\/\/www.google.com\/recaptcha\/api2\/demo&quot;<\/span><span style=\"color: #ABB2BF\">;<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>And the page elements:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const SELECTORS = {\n  \/\/ add selectors here\n  submitButton: \"#recaptcha-demo-submit\"\n}<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SELECTORS<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ add selectors here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">submitButton<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;#recaptcha-demo-submit&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p>Centralizing selectors makes updates easier if the page structure changes.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 4: Get the Captcha Result<\/h5>\n\n\n\n<p>Before interacting with the browser, your application needs to confirm that Death By Captcha API returned a token.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const retrieveToken = async ()<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">retrieveToken<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">async<\/span><span style=\"color: #ABB2BF\"> ()<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Its job is to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Return the token fetched<\/li>\n\n\n\n<li>Close the app on error<\/li>\n<\/ul>\n\n\n\n<p>This prevents invalid submissions.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 5: Launch Chromium<\/h5>\n\n\n\n<p>Playwright launches Chromium (This creates a browser context ready for automation) and calls `submitToPage()` which receives Playwright context and which executes the submission to the page only if a token was successfully fetched.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\u00a0const browser = await chromium.launch()\n\u00a0\n\u00a0const token = await retrieveToken()\n\u00a0\n\u00a0if (token) {\n\u00a0 \u00a0const page = await browser.newPage()\n\u00a0 \u00a0await submitToPage(page)\n\u00a0 \u00a0console.log(\"Captcha solved successfully\")\n }<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">browser<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">chromium<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">launch<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">token<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">retrieveToken<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0<\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75\">token<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0<\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">browser<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">newPage<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0<\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitToPage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">page<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">\u00a0 \u00a0<\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Captcha solved successfully&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> }<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Stage 6: Submission of token &amp; form<\/h5>\n\n\n\n<p>The final step:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const submitToPage = async (page) => {\n  await page.goto(SUBMISSION_URL)\n\n  await page.evaluate((value) => {\n    const textArea = document.querySelector(\"#g-recaptcha-response\")\n    textArea.value = value\n    textArea.dispatchEvent(new Event(\"input\", { bubbles: true }))\n  }, token)\n\n  await page.click(SELECTORS.submitButton)\n}<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitToPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75; font-style: italic\">page<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">goto<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">SUBMISSION_URL<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">evaluate<\/span><span style=\"color: #ABB2BF\">((<\/span><span style=\"color: #E06C75; font-style: italic\">value<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">document<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">querySelector<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;#g-recaptcha-response&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">value<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dispatchEvent<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Event<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;input&quot;<\/span><span style=\"color: #ABB2BF\">, { <\/span><span style=\"color: #E06C75\">bubbles<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\"> }))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }, <\/span><span style=\"color: #E06C75\">token<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">click<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">SELECTORS<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">submitButton<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><code>submitToPage()<\/code><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Waits until Playwright goes to the submission URL<\/li>\n\n\n\n<li>To then Wait for <code>textArea<\/code> token injection, this selector requires a different treatment since it&#8217;s a hidden element.<\/li>\n\n\n\n<li>Waits until form gets submitted with a click on the submit button.<\/li>\n<\/ol>\n\n\n\n<p>This completes the workflow automatically.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Complete code:<\/h4>\n\n\n\n<p><strong>Step 1: Make sure your \u2018<em>package.json\u2019<\/em>&nbsp;is set up correctly<\/strong><\/p>\n\n\n\n<p><strong>Make sure:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>That <code>\u201ctype\u201d<\/code> is set to <code>\u201cmodule\u201d<\/code> for ES6<\/li>\n\n\n\n<li>To have&nbsp;<code>index.js<\/code>&nbsp;as your app entry point by using: <code>\u201cmain\u201d: \u201cindex.js\u201d<\/code><\/li>\n\n\n\n<li>To have a \u201cstart\u201d script which runs your Node.js app: <code>\u201cstart\u201d: \u201cnode index.js\u201d<\/code><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#abb2bf33\" stroke=\"#abb2bf4d\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlightsMuted\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>{\n  \"name\": \"playwrite_automation\",\n &#91;...&#93;\n  \"type\": \"module\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"start\": \"node index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"\n  }\n}<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">&quot;name&quot;<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;playwrite_automation&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #FFFFFF\">&#91;...&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">&quot;type&quot;<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;module&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">&quot;main&quot;<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;index.js&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">&quot;scripts&quot;<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">&quot;start&quot;<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;node index.js&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">&quot;test&quot;<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;echo <\/span><span style=\"color: #56B6C2\">\\&quot;<\/span><span style=\"color: #98C379\">Error: no test specified<\/span><span style=\"color: #56B6C2\">\\&quot;<\/span><span style=\"color: #98C379\"> &amp;&amp; exit 1&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JSON<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Step 2: Install dependencies<\/strong><\/p>\n\n\n\n<p>Skip this step if you\u2019ve already installed them in the previous section<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlights\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>npm install playwright\nnpx playwright install<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #61AFEF\">npm<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">install<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">playwright<\/span><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">npx<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">playwright<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">install<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">Bash<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Step 3: Use the code<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>recaptcha-solver.js (DBC captcha solving)<\/code><\/pre>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlights\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const API_URL = \"http:\/\/api.dbcapi.me\/api\/captcha\"\nconst USERNAME = \"your_username\"\nconst PASSWORD = \"your_password\"\n\nconst CAPTCHA_PARAMS = {\n  proxy: \"http:\/\/user:password@127.0.0.1:3128\", \/\/ leave empty if no proxy\n  proxytype: \"HTTP\",                            \/\/ leave empty if no proxy\n  googlekey: \"6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-\",\n  pageurl: \"https:\/\/www.google.com\/recaptcha\/api2\/demo\"\n}\n\nconst TYPE = 4\n\nconst submitCaptcha = async () => {\n  const formData = new FormData()\n\n  formData.append(\"username\", USERNAME)\n  formData.append(\"password\", PASSWORD)\n  formData.append(\"type\", TYPE)\n  formData.append(\"token_params\", JSON.stringify(CAPTCHA_PARAMS))\n\n  const response = await fetch(API_URL, {\n    method: \"POST\",\n    body: formData\n  })\n\n  if (!response.ok) {\n    throw new Error(`Submission to DBC failed: ${response.status}`)\n  }\n  const text = await response.text()\n  const params = new URLSearchParams(text)\n\n  return params.get(\"captcha\")\n}\n\nconst getToken = async (captchaId) => {\n  const response = await fetch(`${API_URL}\/${captchaId}`)\n\n  if (!response.ok) {\n    throw new Error(`Fetch failed: ${response.status}`)\n  }\n\n  return await response.text()\n}\n\n\/\/ Sleep helper\nconst delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const solveCaptcha = async () => {\n  try {\n    console.log(\"Submitting captcha...\")\n    const captchaId = await submitCaptcha()\n\n    console.log(\"Solving captcha...\")\n    console.log(\"Captcha ID:\", captchaId)\n\n    const maxAttempts = 24\n\n    for (let attempt = 1; attempt &lt;= maxAttempts; attempt++) {\n      console.log(`Waiting 5 seconds before attempt ${attempt}...`)\n      await delay(5000)\n\n      console.log(`Checking result... Attempt ${attempt}`)\n\n      const result = await getToken(captchaId)\n      const params = new URLSearchParams(result)\n      const token = params.get(\"text\")\n\n      if (token.length > 1) {\n        console.log(\"Final response:\")\n        return {\n          success: true,\n          data: token\n        }\n      } else if (token === \"?\") {\n        return {\n          success: false,\n          error: \"Empty response.\"\n        }\n      }\n\n      console.log(\"Result not ready yet.\")\n    }\n    console.log(\"Timed out waiting for resolution.\")\n  } catch (error) {\n    return {\n      success: false,\n      error\n    }\n  }\n}<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">API_URL<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;http:\/\/api.dbcapi.me\/api\/captcha&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">USERNAME<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;your_username&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PASSWORD<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;your_password&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">CAPTCHA_PARAMS<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">proxy<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;http:\/\/user:password@127.0.0.1:3128&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ leave empty if no proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">proxytype<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;HTTP&quot;<\/span><span style=\"color: #ABB2BF\">,                            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ leave empty if no proxy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">googlekey<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">pageurl<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;https:\/\/www.google.com\/recaptcha\/api2\/demo&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">TYPE<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">4<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitCaptcha<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> () <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">formData<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">FormData<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E5C07B\">formData<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;username&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">USERNAME<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E5C07B\">formData<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;password&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">PASSWORD<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E5C07B\">formData<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;type&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">TYPE<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E5C07B\">formData<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">append<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;token_params&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">JSON<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">stringify<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">CAPTCHA_PARAMS<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetch<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">API_URL<\/span><span style=\"color: #ABB2BF\">, {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">method<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;POST&quot;<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">body<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E06C75\">formData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  })<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #56B6C2\">!<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">ok<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">throw<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Error<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">`Submission to DBC failed: <\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">status<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">`<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">text<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">params<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">URLSearchParams<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">text<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">params<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">get<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;captcha&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">getToken<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75; font-style: italic\">captchaId<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">fetch<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">`<\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E5C07B\">API_URL<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">\/<\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E06C75\">captchaId<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">`<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #56B6C2\">!<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">ok<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">throw<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Error<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">`Fetch failed: <\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">status<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">`<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">text<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Sleep helper<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">delay<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75; font-style: italic\">ms<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">Promise<\/span><span style=\"color: #ABB2BF\">((<\/span><span style=\"color: #E06C75; font-style: italic\">resolve<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">setTimeout<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">resolve<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E06C75\">ms<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">export<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">solveCaptcha<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> () <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Submitting captcha...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">captchaId<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitCaptcha<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Solving captcha...&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Captcha ID:&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E06C75\">captchaId<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">maxAttempts<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">24<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">attempt<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">; <\/span><span style=\"color: #E06C75\">attempt<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">&lt;=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">maxAttempts<\/span><span style=\"color: #ABB2BF\">; <\/span><span style=\"color: #E06C75\">attempt<\/span><span style=\"color: #56B6C2\">++<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">`Waiting 5 seconds before attempt <\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E06C75\">attempt<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">...`<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">delay<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #D19A66\">5000<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">`Checking result... Attempt <\/span><span style=\"color: #C678DD\">${<\/span><span style=\"color: #E06C75\">attempt<\/span><span style=\"color: #C678DD\">}<\/span><span style=\"color: #98C379\">`<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">result<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">getToken<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">captchaId<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">params<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">URLSearchParams<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">result<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">token<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">params<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">get<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;text&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E5C07B\">token<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">length<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">&gt;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Final response:&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #E06C75\">success<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E06C75\">token<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      } <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75\">token<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">===<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;?&quot;<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #E06C75\">success<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #E06C75\">error<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;Empty response.&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Result not ready yet.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Timed out waiting for resolution.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75\">error<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E06C75\">success<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E06C75\">error<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>index.js (Playwright execution)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#282c34;display:none;background-color:#abb2bf\" aria-label=\"Copy\" data-copied-text=\"Copied!\" data-has-text-button=\"textSimple\" data-inside-header-type=\"headlights\" aria-live=\"polite\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import { solveCaptcha } from \".\/recaptcha-solver.js\"\nimport { chromium } from \"playwright\"\n\nconst SUBMISSION_URL = \"https:\/\/www.google.com\/recaptcha\/api2\/demo\"\n\nconst SELECTORS = {\n  \/\/ add selectors here\n  submitButton: \"#recaptcha-demo-submit\"\n}\n\nconst retrieveToken = async () => {\n  const response = await solveCaptcha()\n\n  if (!response.success) {\n    console.error(response.error)\n    return\n  }\n\n  console.log(response.data)\n  return response.data\n}\n\nconst token = await retrieveToken()\n\nconst submitToPage = async (page) => {\n  await page.goto(SUBMISSION_URL)\n\n  await page.evaluate((value) => {\n    const textArea = document.querySelector(\"#g-recaptcha-response\")\n    textArea.value = value\n    textArea.dispatchEvent(new Event(\"input\", { bubbles: true }))\n  }, token)\n\n  await page.click(SELECTORS.submitButton)\n}\n\nconst solvePageCaptcha = async () => {\n  const browser = await chromium.launch({\n    headless: false,\n  })\n\n  try {\n    if (token) {\n      const page = await browser.newPage()\n      await submitToPage(page)\n      console.log(\"Captcha solved successfully\")\n    }\n  } catch (error) {\n    console.error(\"Token submission failed:\", error.message)\n  } finally {\n    await browser.close()\n  }\n}\n\nsolvePageCaptcha()<\/textarea><\/pre><span class=\"cbp-btn-text\">Copy<\/span><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E06C75\">solveCaptcha<\/span><span style=\"color: #ABB2BF\"> } <\/span><span style=\"color: #C678DD\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;.\/recaptcha-solver.js&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #E06C75\">chromium<\/span><span style=\"color: #ABB2BF\"> } <\/span><span style=\"color: #C678DD\">from<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;playwright&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SUBMISSION_URL<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;https:\/\/www.google.com\/recaptcha\/api2\/demo&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SELECTORS<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ add selectors here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E06C75\">submitButton<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #98C379\">&quot;#recaptcha-demo-submit&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">retrieveToken<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> () <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">solveCaptcha<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #56B6C2\">!<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">success<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">error<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">error<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">response<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">token<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">retrieveToken<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitToPage<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75; font-style: italic\">page<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">goto<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">SUBMISSION_URL<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">evaluate<\/span><span style=\"color: #ABB2BF\">((<\/span><span style=\"color: #E06C75; font-style: italic\">value<\/span><span style=\"color: #ABB2BF\">) <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">document<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">querySelector<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;#g-recaptcha-response&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">value<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E06C75\">value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">textArea<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">dispatchEvent<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #C678DD\">new<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">Event<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;input&quot;<\/span><span style=\"color: #ABB2BF\">, { <\/span><span style=\"color: #E06C75\">bubbles<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\"> }))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }, <\/span><span style=\"color: #E06C75\">token<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">click<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E5C07B\">SELECTORS<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">submitButton<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">solvePageCaptcha<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">async<\/span><span style=\"color: #ABB2BF\"> () <\/span><span style=\"color: #C678DD\">=&gt;<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">browser<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">chromium<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">launch<\/span><span style=\"color: #ABB2BF\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E06C75\">headless<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  })<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">try<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75\">token<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">const<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">page<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #56B6C2\">=<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">browser<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">newPage<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">submitToPage<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #E06C75\">page<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">log<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Captcha solved successfully&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  } <\/span><span style=\"color: #C678DD\">catch<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #E06C75\">error<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #E5C07B\">console<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">error<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Token submission failed:&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #E5C07B\">error<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">message<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  } <\/span><span style=\"color: #C678DD\">finally<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">await<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">browser<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">close<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #61AFEF\">solvePageCaptcha<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282c34;color:#9da5b4;font-size:12px;line-height:1;position:relative\">JavaScript<\/span><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Expected output:<\/h4>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"992\" style=\"aspect-ratio: 1906 \/ 992;\" width=\"1906\" controls src=\"https:\/\/deathbycaptcha.com\/blog\/wp-content\/uploads\/2026\/05\/playwright-output.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Browser automation becomes significantly more powerful when combined with intelligent captcha solving. If your workflow involves solving a captcha and submitting it to a website, manually solving it quickly becomes inefficient. A more scalable approach is to combine our captcha solving API with&nbsp;Playwright. This article walks through how to implement that workflow using&nbsp;Node.js. The workflow [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3068,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[59,52],"tags":[],"class_list":["post-3051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-useful-articles","category-usage-best-practices"],"_links":{"self":[{"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/posts\/3051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/comments?post=3051"}],"version-history":[{"count":9,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/posts\/3051\/revisions"}],"predecessor-version":[{"id":3080,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/posts\/3051\/revisions\/3080"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/media\/3068"}],"wp:attachment":[{"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/media?parent=3051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/categories?post=3051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/deathbycaptcha.com\/blog\/wp-json\/wp\/v2\/tags?post=3051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}