Logo of «2Captcha»To home page
Captcha bypass tutorials

Was this helpful?

How to bypass invisible reCAPTCHA v2 on Dribbble

Gregory Fisher
Gregory Fisher

Technical engineer

The Dribbble website (dribbble.com) uses an invisible version of reCAPTCHA v2 to protect its login form from automated requests. The main feature of this captcha type is that the user does not see the standard "I am not a robot" checkbox. The verification is triggered automatically in the background when attempting to submit the form.

The primary challenges in bypassing this are twofold: first, the sitekey might be hidden deeper in the code, and second, after receiving the token from the API, it must be passed through a special JavaScript function (callback) rather than a hidden field. Otherwise, the site will ignore the solution and block the form submission. In this guide, we will break down all the steps to solve this task.

Task Parameters (API v2)

To send a task via the modern API v2, the createTask endpoint is used. The request body must be in JSON format.

Parameter Type Required Description
clientKey String Yes Your API key
type String Yes Task type: RecaptchaV2TaskProxyless or RecaptchaV2Task
websiteURL String Yes The full URL of the target web page where the captcha is loaded
websiteKey String Yes reCAPTCHA site key. Can be found in the data-sitekey property of the div element
isInvisible Boolean Yes For invisible reCAPTCHA v2, this parameter must be set to true

How to find parameters

Parameters for reCAPTCHA v2 are static and can be extracted from the page source code or network traffic.

Method 1: Via page source code (Elements tab)

  1. Open the login page https://dribbble.com/session/new in your browser.
  2. Press F12 to open Developer Tools (DevTools) and go to the Elements tab.
  3. Press Ctrl+F (or Cmd+F) and search for g-recaptcha or data-sitekey.
  4. You will find a div element similar to this:
  5. The value of the data-sitekey attribute is your websiteKey.
  6. Copy the full URL from the browser's address bar. This will be your websiteURL.

Method 2: Via network requests (Network tab)

  1. Open Developer Tools (F12) and go to the Network tab.
  2. Enable Preserve log and reload the page.
  3. In the filter, type recaptcha or api.js.
  4. Find requests to Google servers, such as /recaptcha/api2/anchor.
  5. Click on the request and go to the Payload or Params tab.
  6. In the URL parameters, find the k field. Its value is your websiteKey.

Code Examples

Python + requests (API v2)

Example of sending a task and polling for the result using the requests library via API v2 endpoints.

python Copy
import requests
import time

API_KEY = 'YOUR_API_KEY'
WEBSITE_URL = 'https://dribbble.com/session/new'
WEBSITE_KEY = '6LdmBTIUAAAAAM4NIokaWu8p3BBuYEw3CxuDdyg_'

# 1. Create task via API v2
url = 'https://2captcha.com/createTask'
headers = {
    'Content-Type': 'application/json'
}
payload = {
    "clientKey": API_KEY,
    "task": {
        "type": "RecaptchaV2TaskProxyless",
        "websiteURL": WEBSITE_URL,
        "websiteKey": WEBSITE_KEY,
        "isInvisible": True
    }
}

response = requests.post(url, headers=headers, json=payload)
result = response.json()

if result.get('errorId') == 0:
    task_id = result.get('taskId')
    print(f"Task created, ID: {task_id}")
    
    # 2. Get result via API v2
    res_url = 'https://2captcha.com/getTaskResult'
    while True:
        time.sleep(5) # Pause between requests
        
        res_payload = {
            "clientKey": API_KEY,
            "taskId": task_id
        }
        
        res_response = requests.post(res_url, headers=headers, json=res_payload).json()
        
        if res_response.get('errorId') == 0 and res_response.get('status') == 'ready':
            print("Captcha solved successfully!")
            token = res_response['solution']['gRecaptchaResponse']
            print(f"Token: {token}")
            break
        elif res_response.get('errorId') != 0:
            print(f"Error: {res_response.get('errorDescription')}")
            break
        else:
            # Status processing - task is not ready yet
            continue
else:
    print(f"Task creation error: {result.get('errorDescription')}")

Python + Playwright

Example of automation that dynamically extracts the sitekey, sends the task via API v2, and injects the token via callback.

python Copy
from playwright.sync_api import sync_playwright
import requests
import time

API_KEY = 'YOUR_API_KEY'
TARGET_URL = 'https://dribbble.com/session/new'

def solve_dribbble_invisible_recaptcha():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            page.goto(TARGET_URL)
            
            # Wait for the reCAPTCHA widget to appear (even if invisible, it exists in the DOM)
            page.wait_for_selector('.g-recaptcha', timeout=10000)
            
            # Extract sitekey from the data-sitekey attribute
            site_key = page.evaluate("""
                () => {
                    const captchaDiv = document.querySelector('.g-recaptcha');
                    return captchaDiv ? captchaDiv.getAttribute('data-sitekey') : null;
                }
            """)
            
            if not site_key:
                raise Exception("Failed to find reCAPTCHA sitekey on the page.")
            
            print(f"Found sitekey: {site_key}")
            
            # Send to API v2
            api_url = 'https://2captcha.com/createTask'
            headers = {'Content-Type': 'application/json'}
            payload = {
                "clientKey": API_KEY,
                "task": {
                    "type": "RecaptchaV2TaskProxyless",
                    "websiteURL": page.url,
                    "websiteKey": site_key,
                    "isInvisible": True
                }
            }
            
            task_response = requests.post(api_url, headers=headers, json=payload).json()
            if task_response.get('errorId') != 0:
                raise Exception(f"Task creation error: {task_response.get('errorDescription')}")
                
            task_id = task_response.get('taskId')
            
            # Waiting for the solution via getTaskResult
            res_url = 'https://2captcha.com/getTaskResult'
            token = None
            for _ in range(20):
                time.sleep(5)
                res = requests.post(res_url, headers=headers, json={"clientKey": API_KEY, "taskId": task_id}).json()
                if res.get('status') == 'ready':
                    token = res['solution']['gRecaptchaResponse']
                    break
                if res.get('errorId') != 0:
                    print(f"API error: {res.get('errorDescription')}")
                    break
                    
            if token:
                print(f"Token received: {token}")
                
                # Injecting the token via callback
                page.evaluate(f"""
                    // 1. Attempt to find and call the named callback (replace 'yourCallbackName' with the real one if it exists in data-callback)
                    if (typeof yourCallbackName === 'function') {{
                        yourCallbackName("{token}");
                    }}
                    
                    // 2. Alternative universal injection method via internal grecaptcha structure
                    const textarea = document.querySelector('textarea[name="g-recaptcha-response"]');
                    if (textarea) {{
                        textarea.value = "{token}";
                        textarea.dispatchEvent(new Event('change', {{ bubbles: true }}));
                    }}
                    
                    console.log("Token injection attempted");
                """)
                print("Token passed via callback/DOM.")
            else:
                print("Failed to get token.")
                
        except Exception as e:
            print(f"Error: {e}")
        finally:
            # browser.close()

if __name__ == '__main__':
    solve_dribbble_invisible_recaptcha()

How to use the received token (Passing via callback)

Invisible reCAPTCHA v2 on the Dribbble website, like on many other modern sites, will ignore the token if it is simply placed in a hidden form field. The site expects the widget to report successful validation by triggering a callback function, which is usually tied to the form submission button.

To implement this correctly:

  1. Examine the page source code (Elements tab). Find the div with the class g-recaptcha.
  2. Check if it has a data-callback="function_name" attribute. If it does, simply call this function via page.evaluate, passing it the token: function_name("YOUR_TOKEN").
  3. If there is no data-callback attribute, use the universal injection method via the internal ___grecaptcha_cfg structure or change event emulation, which is described in detail in our specialized article: How to pass reCAPTCHA v2 token via callback (https://2captcha.com/h/recaptcha-v2-callback).

Alternative Solving Methods

Besides the direct API, there are two additional ways to bypass reCAPTCHA v2 on Dribbble that can be useful in various automation scenarios.

1. Browser Extension (Captcha Bypass Extension)

If you work manually or use Selenium/Playwright automation with a real browser, you can install our special captcha bypass extension.

Advantages:

  • No need to write code for intercepting parameters and sending requests
  • Automatically detects the appearance of the captcha and solves it in the background
  • Works with most popular captcha types, including invisible reCAPTCHA v2
  • Ideal for manual browsing or complex automation scenarios

More about the extension: https://2captcha.com/captcha-bypass-extension

2. Browser API (Scraper)

For complex parsing tasks where you need not only to bypass the captcha but also extract data from the page after successful login, we offer Browser API — a cloud solution based on headless browsers.

Advantages:

  • Fully managed cloud browser with built-in captcha bypass support
  • No need to configure proxies, User-Agent, or fight against blocks
  • Built-in data extraction functions (screenshots, HTML, JavaScript execution)
  • Automatic captcha solving when navigating the site
  • Ideal for mass parsing and data collection

More about Browser API: https://2captcha.com/scraper/browser-api/dashboard

Common Errors and Solutions (API v2)

Error / Problem Cause Solution
ERROR_KEY_DOES_NOT_EXIST Invalid or empty API key. Check that the key is copied correctly from the dashboard.
ERROR_ZERO_BALANCE Insufficient funds in the account. Top up your account balance.
ERROR_INVALID_PARAMETERS Missing required parameters or invalid JSON format. Ensure the task object contains all necessary fields, including isInvisible: true.
ERROR_GOOGLEKEY Invalid websiteKey format or domain mismatch. Ensure the key starts with 6L and is copied without extra spaces. websiteURL must exactly match the key's domain.
ERROR_CAPTCHA_UNSOLVABLE The captcha cannot be solved (expired). Ensure you are not waiting too long before sending the task, and that the websiteURL is current.
Token not accepted by the form Incorrect token injection method (site expects callback). Do not rely solely on hidden fields. Find the callback function in the source code or use the method from the callback article.