Was this helpful?
How to solve FunCaptcha (Arkose Labs) on GTOP100
Technical engineer
Introduction
GTOP100 is a popular server rating for various online games (such as MapleStory, RuneScape, and others). To protect the voting process from abuse, the site uses FunCaptcha (Arkose Labs). This is an interactive captcha that often requires completing an image-based task (for example, rotating a picture or selecting an object).
In this guide, we will break down how to get the necessary parameters, solve FunCaptcha via the 2Captcha API, and correctly inject the token into the voting page.
Task parameters
To bypass FunCaptcha on GTOP100, the FunCaptchaTaskProxyless task type is used (if you are not using your own proxies) or FunCaptchaTask. Data blob is not required for this site.
json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "FunCaptchaTaskProxyless",
"websiteURL": "https://gtop100.com/MapleStory/server-103514?vote=1&pingUsername=summerboy9",
"websitePublicKey": "FDED3FA5-1764-490F-8BA3-7CE7B0553BC9",
"surl": "https://client-api.arkoselabs.com"
}
}
How to find parameters
websiteURL
This is the full address of the page where the captcha appears. For GTOP100, this is the voting page for a specific server. The URL always contains the game parameters, server ID, and username.
Example: https://gtop100.com/MapleStory/server-103514?vote=1&pingUsername=summerboy9
websitePublicKey (publickey)
This is the Arkose Labs public key, which has a UUID format.
- Open the voting page and press F12 (DevTools).
- Go to the Elements tab.
- Press Ctrl+F and type data-pkey or public-key.
- Copy the attribute value. For GTOP100, it is FDED3FA5-1764-490F-8BA3-7CE7B0553BC9.
Alternative method: Go to the Network tab, filter by Fetch/XHR or JS, find requests to arkoselabs.com or funcaptcha. The public_key will be specified in the request parameters.
surl (apiSubdomain)
This parameter points to a custom API subdomain for Arkose Labs, if used on the site.
- On the Elements tab, find the script tag that loads the captcha script.
- Usually, it is a URL like https://client-api.arkoselabs.com/fc/api... or https://arkoselabs.com/fc/api...
- Copy the full domain URL (in this case, https://client-api.arkoselabs.com). If the standard domain is used, this parameter can be omitted.
Code examples
Python + requests (Getting the token)
If you just need to get the token to subsequently submit the form via API or a hidden field:
python
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
from twocaptcha import TwoCaptcha
api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
solver = TwoCaptcha(api_key)
try:
result = solver.funcaptcha(
site_key='FDED3FA5-1764-490F-8BA3-7CE7B0553BC9',
url='https://gtop100.com/MapleStory/server-103514?vote=1&pingUsername=summerboy9',
surl='https://client-api.arkoselabs.com'
)
print(f"Token successfully received: {result['code']}")
except Exception as e:
print(f"An error occurred: {e}")
Python + Playwright (Browser automation)
When automating a browser, the token needs to be injected into a hidden field or a callback function needs to be called to make the voting button active.
python
import asyncio
from playwright.async_api import async_playwright
from twocaptcha import TwoCaptcha
API_KEY = 'YOUR_API_KEY'
SITE_KEY = 'FDED3FA5-1764-490F-8BA3-7CE7B0553BC9'
PAGE_URL = 'https://gtop100.com/MapleStory/server-103514?vote=1&pingUsername=summerboy9'
async def solve_captcha():
solver = TwoCaptcha(API_KEY)
try:
result = solver.funcaptcha(
site_key=SITE_KEY,
url=PAGE_URL,
surl='https://client-api.arkoselabs.com'
)
token = result['code']
print(f"Captcha solved! Token: {token}")
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto(PAGE_URL)
await page.wait_for_selector('iframe[src*="arkoselabs"]', timeout=10000)
# Inject the token into the hidden field
await page.evaluate(f"""
const tokenInput = document.getElementById('funaptcha-token');
if (tokenInput) {{
tokenInput.value = '{token}';
}}
// If a callback is used, call it via ___grecaptcha_cfg or a direct call
if (typeof window.parent.onSuccess === 'function') {{
window.parent.onSuccess('{token}');
}}
""")
# Click the voting button if it has become active
# await page.click('button[type="submit"]')
await asyncio.sleep(5)
await browser.close()
except Exception as e:
print(f"Error: {e}")
asyncio.run(solve_captcha())
Solution accuracy reports
If the site rejected the received token, be sure to report it via the reportIncorrect method. This helps the service improve its algorithms and refunds your funds for the failed attempt. If the token successfully passed the verification, send reportCorrect.
You can submit a report via the API:
python
import requests
API_KEY = "YOUR_API_KEY"
TASK_ID = "123456789"
# Report for an incorrect solution
requests.post(
"https://api.2captcha.com/reportIncorrect",
json={"clientKey": API_KEY, "taskId": TASK_ID}
)
# Report for a correct solution
requests.post(
"https://api.2captcha.com/reportCorrect",
json={"clientKey": API_KEY, "taskId": TASK_ID}
)
Detailed guide on submitting reports with examples for different languages: https://2captcha.com/h/how-to-submit-reports
Common errors and solutions
| Error / Problem | Cause | Solution |
|---|---|---|
| ERROR_CAPTCHA_UNSOLVABLE | The IP address from which the captcha is being solved is blocked by Arkose Labs | Use the FunCaptchaTask task type and pass high-quality residential proxies. Datacenter IPs are often blocked. |
| Token received, but the site rejects the vote | The token was not injected into the correct field, the lifespan expired, or the IP changed | Make sure you inject the token into the correct hidden field or call the callback. Use a proxy for the final request. |
| ERROR_WRONG_USER_KEY | Invalid API key | Check that you are using the correct key from 2Captcha. |
| Captcha iframe not found | The page loads dynamically | Add explicit waits (waitForSelector) for the iframe with arkoselabs or funcaptcha. |
Useful links
- Sandbox for API testing: https://2captcha.com/setting#sandbox
- FunCaptcha (Arkose Labs) documentation: https://2captcha.com/api-docs/arkoselabs-funcaptcha
- Detailed guide on submitting reports: https://2captcha.com/h/how-to-submit-reports
- Library for Python: https://github.com/2captcha/2captcha-python