DZHQ Captcha Solver

Modern Captcha Solver For DZHQ Bypass Bot

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

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