GreasyFork captcha solvers: solve reCAPTCHA and hCaptcha
If you're automating stuff in the browser and run into captchas — here's how to solve them without backend or headless browsers.
Learn how to solve reCAPTCHA and hCaptcha directly in the browser using GreasyFork scripts API. No backend required.
You can inject a userscript via Tampermonkey or GreasyFork that:
- Detects reCAPTCHA or hCaptcha
 - Sends it to 2Captcha
 - Waits for the solution
 - Injects it into the page
 - Submits the form
 
Tested with 2captcha.com, but works just as well with solvecaptcha.com — they’re API-compatible, and SolveCaptcha is usually cheaper.
hcaptcha solver greasyfork
// ==UserScript==
// @name         hCaptcha Solver
// @namespace    https://example.com/
// @version      1.0
// @match        *://*/*
// @grant        none
// ==/UserScript==
(async () => {
  const key = 'YOUR_API_KEY';
  const el = document.querySelector('.h-captcha[data-sitekey]');
  if (!el) return;
  const sitekey = el.getAttribute('data-sitekey');
  const pageurl = location.href;
  const task = await fetch('https://api.2captcha.com/createTask', {
    method: 'POST',
    body: JSON.stringify({
      clientKey: key,
      task: {
        type: 'HCaptchaTaskProxyless',
        websiteKey: sitekey,
        websiteURL: pageurl
      }
    }),
    headers: { 'Content-Type': 'application/json' }
  }).then(r => r.json());
  const taskId = task.taskId;
  for (let i = 0; i < 20; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await fetch('https://api.2captcha.com/getTaskResult', {
      method: 'POST',
      body: JSON.stringify({ clientKey: key, taskId }),
      headers: { 'Content-Type': 'application/json' }
    }).then(r => r.json());
    if (res.status === 'ready') {
      const token = res.solution.gRecaptchaResponse;
      let input = document.querySelector('[name="h-captcha-response"]');
      if (!input) {
        input = document.createElement('textarea');
        input.name = 'h-captcha-response';
        input.style.display = 'none';
        document.body.appendChild(input);
      }
      input.value = token;
      el.closest('form')?.submit();
      break;
    }
  }
})();
            recaptcha solver greasyfork
// ==UserScript==
// ==UserScript==
// @name         reCAPTCHA Solver
// @namespace    https://example.com/
// @version      1.0
// @match        *://*/*
// @grant        none
// ==/UserScript==
(async () => {
  const key = 'YOUR_API_KEY';
  const el = document.querySelector('.g-recaptcha[data-sitekey]');
  if (!el) return;
  const sitekey = el.getAttribute('data-sitekey');
  const pageurl = location.href;
  const task = await fetch('https://api.2captcha.com/createTask', {
    method: 'POST',
    body: JSON.stringify({
      clientKey: key,
      task: {
        type: 'RecaptchaV2TaskProxyless',
        websiteKey: sitekey,
        websiteURL: pageurl,
        isInvisible: false
      }
    }),
    headers: { 'Content-Type': 'application/json' }
  }).then(r => r.json());
  const taskId = task.taskId;
  for (let i = 0; i < 20; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await fetch('https://api.2captcha.com/getTaskResult', {
      method: 'POST',
      body: JSON.stringify({ clientKey: key, taskId }),
      headers: { 'Content-Type': 'application/json' }
    }).then(r => r.json());
    if (res.status === 'ready') {
      const token = res.solution.gRecaptchaResponse;
      let input = document.querySelector('[name="g-recaptcha-response"]');
      if (!input) {
        input = document.createElement('textarea');
        input.name = 'g-recaptcha-response';
        input.style.display = 'none';
        document.body.appendChild(input);
      }
      input.value = token;
      el.closest('form')?.submit();
      break;
    }
  }
})();
            You can swap the API host to https://api.solvecaptcha.com and it’ll work with their service too — they’re usually faster and cheaper. Just replace the API key and you’re good to go.