Was this helpful?
How to bypass invisible reCAPTCHA v2 on Dribbble
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)
- Open the login page https://dribbble.com/session/new in your browser.
- Press F12 to open Developer Tools (DevTools) and go to the Elements tab.
- Press Ctrl+F (or Cmd+F) and search for g-recaptcha or data-sitekey.
- You will find a div element similar to this:
- The value of the data-sitekey attribute is your websiteKey.
- Copy the full URL from the browser's address bar. This will be your websiteURL.
Method 2: Via network requests (Network tab)
- Open Developer Tools (F12) and go to the Network tab.
- Enable Preserve log and reload the page.
- In the filter, type recaptcha or api.js.
- Find requests to Google servers, such as /recaptcha/api2/anchor.
- Click on the request and go to the Payload or Params tab.
- 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
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
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:
- Examine the page source code (Elements tab). Find the div with the class g-recaptcha.
- 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").
- 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. |
Useful Links
- API testing sandbox: https://2captcha.com/setting#sandbox
- reCAPTCHA v2 API documentation: https://2captcha.com/api-docs/recaptcha-v2
- Article: How to pass reCAPTCHA v2 token via callback: https://2captcha.com/h/recaptcha-v2-callback
- Captcha bypass extension: https://2captcha.com/captcha-bypass-extension
- Browser API for parsing: https://2captcha.com/scraper/browser-api/dashboard
- Python SDK on GitHub: https://github.com/2captcha/2captcha-python
- Other examples of bypassing captchas on websites: https://2captcha.com/h?category=sites