Captcha bypass tutorials

Was this helpful?

How to solve FunCaptcha (Arkose Labs) on GTOP100

Gregory Fisher
Gregory Fisher

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 Copy
{
    "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.

  1. Open the voting page and press F12 (DevTools).
  2. Go to the Elements tab.
  3. Press Ctrl+F and type data-pkey or public-key.
  4. 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.

  1. On the Elements tab, find the script tag that loads the captcha script.
  2. Usually, it is a URL like https://client-api.arkoselabs.com/fc/api... or https://arkoselabs.com/fc/api...
  3. 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 Copy
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 Copy
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 Copy
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.