DZHQ Captcha Solver

Modern Captcha Solver For DZHQ Bypass Bot

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         DZHQ Captcha Solver
// @namespace    http://tampermonkey.net/
// @version      3
// @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);
        }
      },
        mh: {
            src: "https://www.google.com/recaptcha/api.js?render=6LcJ2G0sAAAAAJrsfZaGW0yuNr_bJTfZ8SODgVmM",
            render() {
                const key = "6LcJ2G0sAAAAAJrsfZaGW0yuNr_bJTfZ8SODgVmM";

                const wait = setInterval(() => {
                    if (window.grecaptcha?.ready && window.grecaptcha?.execute) {
                        clearInterval(wait);

                        grecaptcha.ready(() => {
                            grecaptcha.execute(key, { action: "verify" })
                                .then(token => {
                                // same behaviour as callback in recaptcha engine
                                onSolved(0, token);
                            })
                                .catch(err => {
                                console.error("MH error:", err);
                            });
                        });
                    }
                }, 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);
  }
})();