Greasy Fork is available in English.

DZHQ Captcha Solver

Modern Captcha Solver For DZHQ Bypass Bot

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         DZHQ Captcha Solver
// @namespace    http://tampermonkey.net/
// @version      2
// @description  Modern Captcha Solver For DZHQ Bypass Bot
// @author       DZHQ Bypass
// @match        https://*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  try {
    const params = new URLSearchParams(location.search);
    const ncsm = params.get("ncsm");
    const siteKeyParam = params.get("sitekey");
    const id = params.get("id");
    const viewOnly = params.get("viewonly") === "1";

    if (!ncsm || !siteKeyParam || !id) return;

    const siteKeys = siteKeyParam.split("|").map(s => s.trim()).filter(Boolean);
    if (!siteKeys.length) return;

    const tokens = new Array(siteKeys.length).fill(null);

    document.open();
    document.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DZHQ Captcha Solver Pro</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }

  body {
    margin: 0;
    min-height: 100vh;
    background: linear-gradient(135deg, #0f172a 0%, #020617 50%, #0a0f1f 100%);
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
    color: #e2e8f0;
    position: relative;
    overflow-x: hidden;
  }

  /* Animated background particles */
  body::before {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-image: radial-gradient(circle at 25% 40%, rgba(59,130,246,0.08) 0%, transparent 50%),
                      radial-gradient(circle at 75% 85%, rgba(139,92,246,0.08) 0%, transparent 50%);
    pointer-events: none;
    z-index: 0;
  }

  /* Glassmorphism container */
  .app-container {
    position: relative;
    z-index: 1;
    max-width: 1400px;
    margin: 0 auto;
    padding: 1.5rem;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
  }

  /* Header Section */
  .header {
    background: rgba(15, 23, 42, 0.7);
    backdrop-filter: blur(20px);
    border-radius: 1.5rem;
    padding: 1.5rem 2rem;
    margin-bottom: 2rem;
    border: 1px solid rgba(71, 85, 105, 0.3);
    box-shadow: 0 20px 35px -12px rgba(0, 0, 0, 0.4);
  }

  .header-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 1rem;
  }

  .title h1 {
    font-size: 1.8rem;
    font-weight: 700;
    background: linear-gradient(135deg, #fff, #60a5fa, #c084fc);
    background-clip: text;
    -webkit-background-clip: text;
    color: transparent;
    letter-spacing: -0.5px;
  }

  .title p {
    font-size: 0.85rem;
    color: #94a3b8;
    margin-top: 0.3rem;
  }

  .stats {
    display: flex;
    gap: 1rem;
  }

  .stat-card {
    background: rgba(30, 41, 59, 0.6);
    border-radius: 1rem;
    padding: 0.6rem 1.2rem;
    text-align: center;
    border: 1px solid rgba(71, 85, 105, 0.3);
  }

  .stat-number {
    font-size: 1.5rem;
    font-weight: 700;
    color: #60a5fa;
  }

  .stat-label {
    font-size: 0.7rem;
    color: #94a3b8;
    text-transform: uppercase;
    letter-spacing: 0.5px;
  }

  /* Grid Layout */
  .captcha-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
    gap: 1.5rem;
    margin-bottom: 2rem;
    flex: 1;
  }

  /* Cards */
  .captcha-card {
    background: rgba(15, 23, 42, 0.75);
    backdrop-filter: blur(12px);
    border-radius: 1.5rem;
    border: 1px solid rgba(71, 85, 105, 0.4);
    overflow: hidden;
    transition: all 0.3s ease;
    animation: fadeInUp 0.5s ease backwards;
    animation-delay: calc(var(--index, 0) * 0.05s);
  }

  @keyframes fadeInUp {
    from {
      opacity: 0;
      transform: translateY(20px);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  }

  .captcha-card:hover {
    transform: translateY(-4px);
    border-color: #3b82f680;
    box-shadow: 0 20px 35px -12px rgba(0, 0, 0, 0.5);
  }

  .card-header {
    padding: 1.2rem 1.5rem;
    background: linear-gradient(135deg, rgba(30, 41, 59, 0.5), rgba(15, 23, 42, 0.8));
    border-bottom: 1px solid #1e293b;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  .card-number {
    font-weight: 700;
    font-size: 1.1rem;
    color: #cbd5e1;
  }

  .card-number span {
    color: #60a5fa;
    font-size: 1.3rem;
  }

  .status-indicator {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.75rem;
    font-weight: 600;
    padding: 0.3rem 0.8rem;
    border-radius: 2rem;
    background: #0f172a;
  }

  .status-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #f59e0b;
    animation: pulse 1.5s infinite;
  }

  @keyframes pulse {
    0%, 100% { opacity: 1; transform: scale(1); }
    50% { opacity: 0.5; transform: scale(0.8); }
  }

  .status-dot.solved {
    background: #22c55e;
    animation: none;
  }

  .captcha-content {
    padding: 1.8rem;
    min-height: 220px;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .captcha-widget {
    width: 100%;
    display: flex;
    justify-content: center;
  }

  /* Solved State */
  .solved-section {
    text-align: center;
  }

  .solved-icon {
    font-size: 3rem;
    margin-bottom: 0.5rem;
  }

  .solved-text {
    font-size: 1rem;
    font-weight: 600;
    color: #4ade80;
    margin-bottom: 0.75rem;
  }

  .token-display {
    background: #020617;
    border-radius: 0.75rem;
    padding: 0.75rem;
    margin: 0.75rem 0;
  }

  .token-display textarea {
    width: 100%;
    background: #0f172a;
    border: 1px solid #334155;
    border-radius: 0.5rem;
    padding: 0.6rem;
    color: #e2e8f0;
    font-family: 'Courier New', monospace;
    font-size: 0.7rem;
    resize: vertical;
  }

  .copy-btn {
    background: linear-gradient(135deg, #3b82f6, #2563eb);
    border: none;
    color: white;
    padding: 0.5rem 1rem;
    border-radius: 0.5rem;
    cursor: pointer;
    font-size: 0.8rem;
    font-weight: 500;
    transition: all 0.2s;
    margin-top: 0.5rem;
  }

  .copy-btn:hover {
    transform: scale(1.02);
    box-shadow: 0 4px 12px rgba(59,130,246,0.4);
  }

  .waiting-message {
    text-align: center;
    padding: 1rem;
    color: #94a3b8;
    font-size: 0.85rem;
  }

  /* Completion Screen */
  .completion-screen {
    background: rgba(15, 23, 42, 0.9);
    backdrop-filter: blur(20px);
    border-radius: 2rem;
    padding: 3rem 2rem;
    text-align: center;
    border: 1px solid #22c55e;
    animation: scaleIn 0.5s ease;
  }

  @keyframes scaleIn {
    from {
      opacity: 0;
      transform: scale(0.9);
    }
    to {
      opacity: 1;
      transform: scale(1);
    }
  }

  .completion-icon {
    font-size: 4rem;
    margin-bottom: 1rem;
  }

  .completion-screen h2 {
    font-size: 1.8rem;
    margin-bottom: 0.5rem;
    background: linear-gradient(135deg, #4ade80, #22c55e);
    background-clip: text;
    -webkit-background-clip: text;
    color: transparent;
  }

  .completion-screen p {
    color: #94a3b8;
  }

  /* Toast Notification */
  .toast {
    position: fixed;
    bottom: 2rem;
    right: 2rem;
    background: #1e293b;
    color: white;
    padding: 0.75rem 1.25rem;
    border-radius: 0.75rem;
    font-size: 0.85rem;
    z-index: 1000;
    animation: slideIn 0.3s ease;
    border-left: 3px solid #22c55e;
  }

  @keyframes slideIn {
    from {
      transform: translateX(100%);
      opacity: 0;
    }
    to {
      transform: translateX(0);
      opacity: 1;
    }
  }

  /* Notice Banner */
  .notice-banner {
    position: fixed;
    top: 1rem;
    left: 50%;
    transform: translateX(-50%);
    background: linear-gradient(135deg, #1e293b, #0f172a);
    border: 1px solid #f59e0b;
    border-radius: 1rem;
    padding: 0.75rem 1.5rem;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    z-index: 100;
    font-size: 0.85rem;
    box-shadow: 0 10px 25px -5px rgba(0,0,0,0.3);
    backdrop-filter: blur(10px);
  }

  /* Footer Copyright */
  .footer {
    text-align: center;
    padding: 1.5rem;
    margin-top: 1rem;
    border-top: 1px solid rgba(71, 85, 105, 0.2);
    font-size: 0.8rem;
    color: #64748b;
  }

  .footer a {
    color: #60a5fa;
    text-decoration: none;
  }

  .footer a:hover {
    text-decoration: underline;
  }

  @media (max-width: 640px) {
    .app-container {
      padding: 0.75rem;
    }
    .captcha-grid {
      grid-template-columns: 1fr;
    }
    .header-top {
      flex-direction: column;
      align-items: stretch;
    }
    .notice-banner {
      font-size: 0.7rem;
      padding: 0.5rem 1rem;
      top: 0.5rem;
    }
  }
</style>
</head>
<body>
<div class="notice-banner">
  <span>⚠️</span>
  <span>Please solve all captchas below — tokens will be submitted automatically when complete</span>
</div>
<div class="app-container">
  <div class="header">
    <div class="header-top">
      <div class="title">
        <h1>🔐 DZHQ Captcha Solver Pro</h1>
        <p>Complete all challenges to continue</p>
      </div>
      <div class="stats">
        <div class="stat-card">
          <div class="stat-number" id="solvedCount">0</div>
          <div class="stat-label">Solved</div>
        </div>
        <div class="stat-card">
          <div class="stat-number" id="totalCount">${siteKeys.length}</div>
          <div class="stat-label">Total</div>
        </div>
      </div>
    </div>
  </div>
  <div class="captcha-grid" id="root"></div>
  <div class="footer">
    © 2026 DZHQ Bypass — Advanced Captcha Solver
</div>
</body>
</html>
`);
    document.close();

    const root = document.getElementById("root");
    const solvedCountSpan = document.getElementById("solvedCount");
    const totalCountSpan = document.getElementById("totalCount");

    function updateProgress() {
      const solved = tokens.filter(t => t !== null).length;
      if (solvedCountSpan) solvedCountSpan.textContent = solved;
    }

    function showToast(message, isError = false) {
      const toast = document.createElement("div");
      toast.className = "toast";
      toast.style.borderLeftColor = isError ? "#ef4444" : "#22c55e";
      toast.textContent = message;
      document.body.appendChild(toast);
      setTimeout(() => toast.remove(), 3000);
    }


    function loadScript(src) {
      return new Promise((resolve, reject) => {
        const s = document.createElement("script");
        s.src = src;
        s.async = true;
        s.defer = true;
        s.onload = resolve;
        s.onerror = reject;
        document.head.appendChild(s);
      });
    }

    function postTokens() {
      const joined = tokens.join(" ");
      const xhr = new XMLHttpRequest();
      xhr.open("POST", "https://ct.tamdriven.workers.dev/", true);
      xhr.setRequestHeader("Content-Type", "application/json");
      xhr.onload = () => {
        if (xhr.status === 200) {
          showToast("✅ Tokens submitted successfully!");
        } else {
          showToast("⚠️ Token submission warning", true);
        }
      };
      xhr.onerror = () => showToast("❌ Failed to submit tokens", true);
      xhr.send(JSON.stringify({
        id: id,
        token: joined
      }));
    }

    function onSolved(index, token) {
      if (tokens[index] !== null) return;

      tokens[index] = token;
      updateProgress();

      const box = root.children[index];
      const card = box.closest('.captcha-card');

      if (viewOnly) {
        card.innerHTML = `
          <div class="card-header">
            <div class="card-number">Captcha <span>${index + 1}</span></div>
            <div class="status-indicator"><div class="status-dot solved"></div><span>Solved</span></div>
          </div>
          <div class="captcha-content">
            <div class="solved-section">
              <div class="solved-icon">✅</div>
              <div class="solved-text">Captcha Solved!</div>
              <div class="token-display">
                <textarea readonly rows="2">${token}</textarea>
                <button class="copy-btn">📋 Copy Token</button>
              </div>
            </div>
          </div>
        `;
        card.querySelector(".copy-btn").onclick = () => {
          navigator.clipboard.writeText(token);
          showToast("Token copied to clipboard!");
        };
      } else {
        card.innerHTML = `
          <div class="card-header">
            <div class="card-number">Captcha <span>${index + 1}</span></div>
            <div class="status-indicator"><div class="status-dot solved"></div><span>Solved ✓</span></div>
          </div>
          <div class="captcha-content">
            <div class="solved-section">
              <div class="solved-icon">✅</div>
              <div class="solved-text">Completed!</div>
              <div class="waiting-message">⏳ Waiting for other captchas...</div>
            </div>
          </div>
        `;

        if (tokens.every(Boolean)) {
          postTokens();
          root.innerHTML = `
            <div class="completion-screen">
              <div class="completion-icon">🎉</div>
              <h2>All Captchas Solved!</h2>
              <p>Tokens have been submitted successfully.</p>
              <p style="margin-top: 0.5rem; font-size: 0.8rem;">You can now close this window.</p>
            </div>
          `;
          showToast("🎉 All captchas completed! Returning to bot...");
        }
      }
    }

    const ENGINES = {
      recaptcha: {
        src: "https://www.google.com/recaptcha/api.js?render=explicit",
        render() {
          const wait = setInterval(() => {
            if (window.grecaptcha?.render && window.grecaptcha?.ready) {
              clearInterval(wait);
              grecaptcha.ready(() => {
                siteKeys.forEach((key, i) => {
                  grecaptcha.render(`captcha-${i}`, {
                    sitekey: key,
                    callback: token => onSolved(i, token)
                  });
                });
              });
            }
          }, 50);
        }
      },
      hcaptcha: {
        src: "https://js.hcaptcha.com/1/api.js?render=explicit",
        render() {
          const wait = setInterval(() => {
            if (window.hcaptcha) {
              clearInterval(wait);
              siteKeys.forEach((key, i) => {
                hcaptcha.render(`captcha-${i}`, {
                  sitekey: key,
                  callback: token => onSolved(i, token)
                });
              });
            }
          }, 50);
        }
      }
    };


    siteKeys.forEach((_, i) => {
      const card = document.createElement("div");
      card.className = "captcha-card";
      card.style.setProperty('--index', i);
      card.innerHTML = `
        <div class="card-header">
          <div class="card-number">Captcha <span>${i + 1}</span></div>
          <div class="status-indicator"><div class="status-dot"></div><span>Pending</span></div>
        </div>
        <div class="captcha-content">
          <div class="captcha-widget" id="captcha-${i}"></div>
        </div>
      `;
      root.appendChild(card);
    });

    updateProgress();

    const engine = ENGINES[ncsm];
    if (!engine) return;

    loadScript(engine.src).then(() => {
      engine.render();
      showToast("🔄 Captcha widgets loading...");
    }).catch(() => {
      showToast("❌ Failed to load captcha service", true);
    });

  } catch (e) {
    console.error("DZHQ Captcha Solver error:", e);
  }
})();