DZHQ Captcha Solver

Modern Captcha Solver For DZHQ Bypass Bot

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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);
  }
})();