NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Spamurai Pro by Alcazi
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Professional TikTok Share Bot - Matrix Edition with Background Toggle
// @author Alcazi
// @license MIT
// @match https://www.tiktok.com/*
// @match https://tiktok.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_notification
// @grant unsafeWindow
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
let CONFIG = {
copyInterval: 1000,
randomMode: true,
randomVariance: 300,
minInterval: 500,
maxInterval: 3000,
speedLevel: 3,
debug: true,
backgroundVisible: false // New feature
};
const CSS = `
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css');
.spamurai-overlay {
position: fixed !important;
top: 0 !important; left: 0 !important;
width: 100vw !important; height: 100vh !important;
background: rgba(0, 0, 0, 0.75) !important;
backdrop-filter: blur(25px) saturate(120%) !important;
-webkit-backdrop-filter: blur(25px) saturate(120%) !important;
z-index: 999999 !important;
display: flex !important;
justify-content: center !important;
align-items: center !important;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;
animation: overlayFadeIn 0.6s cubic-bezier(0.4, 0, 0.2, 1) !important;
transition: background 0.3s ease, backdrop-filter 0.3s ease !important;
}
.spamurai-overlay.background-visible {
background: rgba(0, 0, 0, 0.3) !important;
backdrop-filter: blur(5px) saturate(150%) !important;
-webkit-backdrop-filter: blur(5px) saturate(150%) !important;
}
@keyframes overlayFadeIn {
from {
opacity: 0;
backdrop-filter: blur(0px);
}
to {
opacity: 1;
backdrop-filter: blur(25px);
}
}
.matrix-canvas {
position: absolute !important;
top: 0 !important; left: 0 !important;
width: 100% !important; height: 100% !important;
z-index: 1 !important;
pointer-events: none !important;
opacity: 0.4 !important;
transition: opacity 0.3s ease !important;
}
.spamurai-overlay.background-visible .matrix-canvas {
opacity: 0.2 !important;
}
.spamurai-container {
background: linear-gradient(145deg, rgba(18, 18, 18, 0.98), rgba(28, 28, 30, 0.95)) !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
border-radius: 20px !important;
padding: 24px !important;
width: 380px !important;
backdrop-filter: blur(40px) !important;
-webkit-backdrop-filter: blur(40px) !important;
box-shadow:
0 32px 64px rgba(0, 0, 0, 0.8),
0 0 0 1px rgba(255, 255, 255, 0.03),
inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
position: relative !important;
z-index: 1000000 !important;
animation: containerSlideIn 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
transition: all 0.3s ease !important;
}
.spamurai-overlay.background-visible .spamurai-container {
background: linear-gradient(145deg, rgba(18, 18, 18, 0.95), rgba(28, 28, 30, 0.9)) !important;
backdrop-filter: blur(30px) !important;
-webkit-backdrop-filter: blur(30px) !important;
box-shadow:
0 32px 64px rgba(0, 0, 0, 0.6),
0 0 0 1px rgba(255, 255, 255, 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.12) !important;
}
@keyframes containerSlideIn {
from {
opacity: 0;
transform: translateY(30px) scale(0.9);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.spamurai-header {
text-align: center !important;
margin-bottom: 24px !important;
position: relative !important;
padding-bottom: 16px !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
}
.spamurai-logo {
background: linear-gradient(135deg, #ff0050 0%, #ff4458 25%, #ff6b35 50%, #ff8e53 75%, #ffad71 100%) !important;
-webkit-background-clip: text !important;
-webkit-text-fill-color: transparent !important;
background-clip: text !important;
font-size: 28px !important;
font-weight: 700 !important;
margin-bottom: 6px !important;
letter-spacing: -1px !important;
text-shadow: 0 0 30px rgba(255, 0, 80, 0.3) !important;
}
.spamurai-subtitle {
color: rgba(255, 255, 255, 0.8) !important;
font-size: 13px !important;
font-weight: 500 !important;
margin-bottom: 4px !important;
}
.spamurai-version {
color: rgba(255, 255, 255, 0.4) !important;
font-size: 11px !important;
font-weight: 400 !important;
}
.spamurai-close {
position: absolute !important;
top: -12px !important; right: -12px !important;
background: rgba(255, 59, 92, 0.9) !important;
border: 2px solid rgba(255, 255, 255, 0.1) !important;
color: white !important;
width: 32px !important; height: 32px !important;
border-radius: 50% !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
font-size: 14px !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
z-index: 1000001 !important;
backdrop-filter: blur(20px) !important;
-webkit-backdrop-filter: blur(20px) !important;
}
.spamurai-close:hover {
background: rgba(255, 59, 92, 1) !important;
transform: scale(1.1) rotate(90deg) !important;
box-shadow: 0 8px 25px rgba(255, 59, 92, 0.4) !important;
}
.spamurai-close:active {
transform: scale(0.95) rotate(90deg) !important;
}
.background-toggle {
position: absolute !important;
top: -12px !important; right: 28px !important;
background: rgba(64, 224, 208, 0.9) !important;
border: 2px solid rgba(255, 255, 255, 0.1) !important;
color: white !important;
width: 32px !important; height: 32px !important;
border-radius: 50% !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
font-size: 14px !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
z-index: 1000001 !important;
backdrop-filter: blur(20px) !important;
-webkit-backdrop-filter: blur(20px) !important;
}
.background-toggle:hover {
background: rgba(64, 224, 208, 1) !important;
transform: scale(1.1) !important;
box-shadow: 0 8px 25px rgba(64, 224, 208, 0.4) !important;
}
.background-toggle:active {
transform: scale(0.95) !important;
}
.background-toggle.active {
background: rgba(255, 165, 0, 0.9) !important;
}
.background-toggle.active:hover {
background: rgba(255, 165, 0, 1) !important;
box-shadow: 0 8px 25px rgba(255, 165, 0, 0.4) !important;
}
.stats-professional {
display: grid !important;
grid-template-columns: repeat(3, 1fr) !important;
gap: 12px !important;
margin-bottom: 20px !important;
}
.stat-card-pro {
background: rgba(255, 255, 255, 0.02) !important;
border: 1px solid rgba(255, 255, 255, 0.06) !important;
border-radius: 12px !important;
padding: 16px 12px !important;
text-align: center !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
position: relative !important;
overflow: hidden !important;
}
.stat-card-pro::before {
content: '' !important;
position: absolute !important;
top: 0 !important; left: 0 !important;
right: 0 !important; height: 2px !important;
background: linear-gradient(90deg, transparent, rgba(255, 0, 80, 0.6), transparent) !important;
opacity: 0 !important;
transition: opacity 0.3s ease !important;
}
.stat-card-pro:hover {
border-color: rgba(255, 0, 80, 0.3) !important;
background: rgba(255, 0, 80, 0.03) !important;
transform: translateY(-2px) !important;
}
.stat-card-pro:hover::before {
opacity: 1 !important;
}
.stat-number-pro {
color: #ff0050 !important;
font-size: 20px !important;
font-weight: 700 !important;
line-height: 1.2 !important;
margin-bottom: 4px !important;
}
.stat-label-pro {
color: rgba(255, 255, 255, 0.6) !important;
font-size: 10px !important;
font-weight: 500 !important;
text-transform: uppercase !important;
letter-spacing: 0.8px !important;
}
.control-section {
background: rgba(255, 255, 255, 0.02) !important;
border: 1px solid rgba(255, 255, 255, 0.06) !important;
border-radius: 16px !important;
padding: 18px !important;
margin-bottom: 16px !important;
}
.control-row-pro {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
margin-bottom: 12px !important;
}
.control-row-pro:last-child {
margin-bottom: 0 !important;
}
.control-label-pro {
color: rgba(255, 255, 255, 0.9) !important;
font-size: 13px !important;
font-weight: 600 !important;
display: flex !important;
align-items: center !important;
gap: 8px !important;
}
.control-icon {
color: #ff0050 !important;
font-size: 14px !important;
}
.speed-control-pro {
display: flex !important;
align-items: center !important;
gap: 8px !important;
}
.speed-display {
background: rgba(255, 0, 80, 0.1) !important;
border: 1px solid rgba(255, 0, 80, 0.2) !important;
border-radius: 8px !important;
padding: 6px 12px !important;
color: #ff0050 !important;
font-size: 11px !important;
font-weight: 600 !important;
cursor: pointer !important;
transition: all 0.2s ease !important;
text-transform: uppercase !important;
}
.speed-display:hover {
background: rgba(255, 0, 80, 0.15) !important;
border-color: rgba(255, 0, 80, 0.3) !important;
}
.toggle-professional {
position: relative !important;
width: 48px !important; height: 24px !important;
background: rgba(255, 255, 255, 0.1) !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-radius: 12px !important;
cursor: pointer !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
}
.toggle-professional.active {
background: linear-gradient(45deg, #ff0050, #ff4458) !important;
border-color: rgba(255, 0, 80, 0.3) !important;
box-shadow: 0 0 20px rgba(255, 0, 80, 0.3) !important;
}
.toggle-knob-pro {
position: absolute !important;
top: 1px !important; left: 1px !important;
width: 20px !important; height: 20px !important;
background: white !important;
border-radius: 10px !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2) !important;
}
.toggle-professional.active .toggle-knob-pro {
transform: translateX(24px) !important;
}
.status-grid {
display: grid !important;
grid-template-columns: repeat(4, 1fr) !important;
gap: 8px !important;
margin-bottom: 20px !important;
padding: 12px !important;
background: rgba(0, 0, 0, 0.2) !important;
border: 1px solid rgba(255, 255, 255, 0.05) !important;
border-radius: 12px !important;
}
.status-indicator {
display: flex !important;
flex-direction: column !important;
align-items: center !important;
gap: 4px !important;
}
.status-dot-pro {
width: 8px !important; height: 8px !important;
border-radius: 50% !important;
transition: all 0.3s ease !important;
}
.status-dot-pro.active {
background: #00ff88 !important;
box-shadow: 0 0 12px rgba(0, 255, 136, 0.6) !important;
animation: statusPulse 2s infinite !important;
}
.status-dot-pro.inactive {
background: rgba(255, 255, 255, 0.2) !important;
}
.status-dot-pro.random {
background: #ffaa00 !important;
animation: randomPulse 1.5s infinite !important;
}
.status-dot-pro.background {
background: #40e0d0 !important;
animation: backgroundPulse 2s infinite !important;
}
@keyframes statusPulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.6; transform: scale(1.2); }
}
@keyframes randomPulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.1); }
}
@keyframes backgroundPulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.8; transform: scale(1.15); }
}
.status-text-pro {
color: rgba(255, 255, 255, 0.7) !important;
font-size: 8px !important;
font-weight: 500 !important;
text-transform: uppercase !important;
text-align: center !important;
}
.btn-professional {
width: 100% !important;
padding: 14px 20px !important;
border: none !important;
border-radius: 12px !important;
font-family: inherit !important;
font-size: 13px !important;
font-weight: 600 !important;
cursor: pointer !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
margin-bottom: 10px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
gap: 8px !important;
text-transform: uppercase !important;
letter-spacing: 0.5px !important;
position: relative !important;
overflow: hidden !important;
}
.btn-professional::before {
content: '' !important;
position: absolute !important;
top: 0 !important; left: -100% !important;
width: 100% !important; height: 100% !important;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent) !important;
transition: left 0.6s ease !important;
}
.btn-professional:hover::before {
left: 100% !important;
}
.btn-toggle {
background: linear-gradient(135deg, #ff0050, #ff4458) !important;
color: white !important;
border: 1px solid rgba(255, 0, 80, 0.3) !important;
box-shadow: 0 8px 25px rgba(255, 0, 80, 0.3) !important;
}
.btn-toggle:hover {
transform: translateY(-2px) !important;
box-shadow: 0 12px 35px rgba(255, 0, 80, 0.4) !important;
}
.btn-toggle:active {
transform: translateY(0) !important;
}
.btn-toggle.running {
background: linear-gradient(135deg, #ff3b5c, #ff6b6b) !important;
border-color: rgba(255, 107, 107, 0.3) !important;
box-shadow: 0 8px 25px rgba(255, 107, 107, 0.3) !important;
}
.btn-toggle.running:hover {
box-shadow: 0 12px 35px rgba(255, 107, 107, 0.4) !important;
}
.btn-support {
background: linear-gradient(135deg, #667eea, #764ba2) !important;
color: white !important;
border: 1px solid rgba(102, 126, 234, 0.3) !important;
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.2) !important;
font-size: 11px !important;
padding: 10px 16px !important;
}
.btn-support:hover {
transform: translateY(-1px) !important;
box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3) !important;
}
.mini-spamurai-button {
position: fixed !important;
bottom: 24px !important;
right: 24px !important;
width: 64px !important;
height: 64px !important;
background: linear-gradient(145deg, rgba(18, 18, 18, 0.9), rgba(28, 28, 30, 0.8)) !important;
border: 2px solid #ff0050 !important;
border-radius: 20px !important;
color: #ff0050 !important;
cursor: pointer !important;
z-index: 999998 !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
font-size: 24px !important;
font-weight: 700 !important;
font-family: 'Inter', sans-serif !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
backdrop-filter: blur(20px) !important;
-webkit-backdrop-filter: blur(20px) !important;
box-shadow: 0 12px 30px rgba(255, 0, 80, 0.3) !important;
}
.mini-spamurai-button:hover {
transform: scale(1.05) translateY(-2px) !important;
border-color: #ff4458 !important;
box-shadow: 0 20px 45px rgba(255, 0, 80, 0.5) !important;
background: linear-gradient(145deg, rgba(28, 28, 30, 0.9), rgba(18, 18, 18, 0.8)) !important;
}
.notification-pro {
position: fixed !important;
top: 20px !important; right: 20px !important;
padding: 16px 20px !important;
background: rgba(18, 18, 18, 0.98) !important;
border: 1px solid rgba(255, 0, 80, 0.3) !important;
border-radius: 12px !important;
color: rgba(255, 255, 255, 0.9) !important;
font-size: 13px !important;
font-weight: 500 !important;
z-index: 1000000 !important;
backdrop-filter: blur(30px) !important;
-webkit-backdrop-filter: blur(30px) !important;
max-width: 320px !important;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.6) !important;
animation: notificationSlide 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
font-family: 'Inter', sans-serif !important;
}
@keyframes notificationSlide {
from { transform: translateX(100%) translateY(-10px); opacity: 0; }
to { transform: translateX(0) translateY(0); opacity: 1; }
}
.footer-professional {
text-align: center !important;
margin-top: 16px !important;
padding-top: 16px !important;
border-top: 1px solid rgba(255, 255, 255, 0.06) !important;
}
.footer-text-pro {
color: rgba(255, 255, 255, 0.4) !important;
font-size: 10px !important;
font-weight: 400 !important;
margin-bottom: 4px !important;
}
.support-link-pro {
color: #ff0050 !important;
text-decoration: none !important;
font-weight: 600 !important;
transition: all 0.2s ease !important;
}
.support-link-pro:hover {
color: #ff4458 !important;
text-decoration: underline !important;
}
`;
let isRunning = false;
let modalSetupDone = false;
let totalCopies = 0;
let successCount = 0;
let errorCount = 0;
let copyInterval = null;
let gui = null;
let miniSpamurai = null;
let lastFoundCopyButton = null;
let startTime = null;
let matrixCanvas = null;
let matrixCtx = null;
let matrixAnimation = null;
let copyObserver = null;
// ===== BACKGROUND TOGGLE FUNCTION =====
function toggleBackground() {
CONFIG.backgroundVisible = !CONFIG.backgroundVisible;
const overlay = document.querySelector('.spamurai-overlay');
const backgroundBtn = document.getElementById('background-toggle');
if (overlay && backgroundBtn) {
if (CONFIG.backgroundVisible) {
overlay.classList.add('background-visible');
backgroundBtn.classList.add('active');
backgroundBtn.innerHTML = '<i class="fas fa-eye-slash"></i>';
backgroundBtn.title = 'Hide Background';
showNotification('Background visible - Click to hide', 'info');
console.log('🌟 Background now visible');
} else {
overlay.classList.remove('background-visible');
backgroundBtn.classList.remove('active');
backgroundBtn.innerHTML = '<i class="fas fa-eye"></i>';
backgroundBtn.title = 'Show Background';
showNotification('Background hidden - Click to show', 'info');
console.log('🌑 Background now hidden');
}
updateStats();
}
}
// ===== ENHANCED MATRIX EFFECT =====
function createMatrixCanvas() {
matrixCanvas = document.createElement('canvas');
matrixCanvas.className = 'matrix-canvas';
matrixCanvas.width = window.innerWidth;
matrixCanvas.height = window.innerHeight;
matrixCtx = matrixCanvas.getContext('2d');
const overlay = document.querySelector('.spamurai-overlay');
if (overlay) {
overlay.appendChild(matrixCanvas);
}
return matrixCanvas;
}
function startMatrixEffect() {
if (!matrixCanvas) createMatrixCanvas();
const chars = 'SPAMURAI01Alcazi';
const fontSize = 14;
const columns = Math.floor(matrixCanvas.width / fontSize);
const drops = Array(columns).fill(1);
function drawMatrix() {
// Semi-transparent black background to create trail effect
matrixCtx.fillStyle = 'rgba(0, 0, 0, 0.05)';
matrixCtx.fillRect(0, 0, matrixCanvas.width, matrixCanvas.height);
// Set text properties
matrixCtx.fillStyle = '#ff0050';
matrixCtx.font = `${fontSize}px 'Inter', monospace`;
matrixCtx.shadowColor = '#ff0050';
matrixCtx.shadowBlur = 8;
// Draw characters
for (let i = 0; i < drops.length; i++) {
const text = chars[Math.floor(Math.random() * chars.length)];
const x = i * fontSize;
const y = drops[i] * fontSize;
// Add some randomness to the glow
matrixCtx.shadowBlur = Math.random() * 10 + 5;
matrixCtx.fillText(text, x, y);
// Reset drops when they reach bottom or randomly
if (y > matrixCanvas.height && Math.random() > 0.975) {
drops[i] = 0;
}
drops[i]++;
}
}
function animate() {
drawMatrix();
if (isRunning) {
matrixAnimation = requestAnimationFrame(animate);
}
}
animate();
}
function stopMatrixEffect() {
if (matrixAnimation) {
cancelAnimationFrame(matrixAnimation);
matrixAnimation = null;
}
if (matrixCanvas && matrixCanvas.parentNode) {
matrixCanvas.parentNode.removeChild(matrixCanvas);
matrixCanvas = null;
matrixCtx = null;
}
}
// ===== KOPIERT COUNTER =====
function startCopyObserver() {
// Stop existing observer
if (copyObserver) {
copyObserver.disconnect();
}
copyObserver = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // Element node
// Check if this is the "Kopiert" notification
const kopiertElement = node.querySelector('.css-oe45gz-notice-content');
if (kopiertElement) {
const alertElement = kopiertElement.querySelector('[role="alert"]');
if (alertElement && alertElement.textContent.includes('Kopiert')) {
totalCopies++;
successCount++;
updateStats();
if (totalCopies % 5 === 0) {
showNotification(`${totalCopies} shares completed!`, 'success');
}
}
}
// Also check direct matches
if (node.querySelector && node.querySelector('span')) {
const spans = node.querySelectorAll('span');
spans.forEach(span => {
if (span.textContent && span.textContent.trim() === 'Kopiert') {
totalCopies++;
successCount++;
updateStats();
}
});
}
}
});
});
});
// Observe the entire document for changes
copyObserver.observe(document.body, {
childList: true,
subtree: true
});
}
function stopCopyObserver() {
if (copyObserver) {
copyObserver.disconnect();
copyObserver = null;
}
}
// ===== SPEED CONTROL =====
function updateSpeed() {
const speedLevels = [
{ interval: 2000, label: "Slow" },
{ interval: 1500, label: "Medium-" },
{ interval: 1000, label: "Medium" },
{ interval: 750, label: "Fast" },
{ interval: 500, label: "Ultra" }
];
const level = speedLevels[CONFIG.speedLevel - 1];
CONFIG.copyInterval = level.interval;
const speedValue = document.getElementById('speed-value');
if (speedValue) {
speedValue.textContent = level.label;
}
if (isRunning && copyInterval) {
clearInterval(copyInterval);
startCopyInterval();
}
showNotification(`Speed: ${level.label}`, 'info');
}
function cycleSpeed() {
CONFIG.speedLevel = CONFIG.speedLevel >= 5 ? 1 : CONFIG.speedLevel + 1;
updateSpeed();
}
function getRandomInterval() {
if (!CONFIG.randomMode) return CONFIG.copyInterval;
const variance = CONFIG.randomVariance;
const randomOffset = (Math.random() - 0.5) * 2 * variance;
const interval = CONFIG.copyInterval + randomOffset;
return Math.max(CONFIG.minInterval, Math.min(CONFIG.maxInterval, interval));
}
// ===== NOTIFICATION SYSTEM =====
function showNotification(message, type = 'info') {
const existingNotifications = document.querySelectorAll('.notification-pro');
existingNotifications.forEach(notif => notif.remove());
const notification = document.createElement('div');
notification.className = 'notification-pro';
let icon = '';
switch(type) {
case 'success': icon = '<i class="fas fa-check" style="color: #00ff88; margin-right: 8px;"></i>'; break;
case 'error': icon = '<i class="fas fa-times" style="color: #ff6b6b; margin-right: 8px;"></i>'; break;
case 'info': icon = '<i class="fas fa-info" style="color: #ff0050; margin-right: 8px;"></i>'; break;
}
notification.innerHTML = icon + message;
document.body.appendChild(notification);
setTimeout(() => {
if (notification.parentNode) {
notification.remove();
}
}, 4000);
}
// ===== MODAL OPENING =====
function findShareButton() {
const selectors = [
'i[data-e2e="share-icon"]',
'[data-e2e="share-icon"]',
'button[data-e2e="share-icon"]',
'[role="button"][data-e2e="share-icon"]',
'div[data-e2e="share-icon"]'
];
for (const selector of selectors) {
const elements = document.querySelectorAll(selector);
for (const element of elements) {
const rect = element.getBoundingClientRect();
if (rect.width > 0 && rect.height > 0) {
return element;
}
}
}
return null;
}
function openModalFixed() {
return new Promise(async (resolve) => {
try {
const shareButton = findShareButton();
if (!shareButton) {
showNotification('Share button not found!', 'error');
resolve(false);
return;
}
shareButton.scrollIntoView({ behavior: 'instant', block: 'center' });
await sleep(300);
const rect = shareButton.getBoundingClientRect();
const x = rect.left + rect.width / 2;
const y = rect.top + rect.height / 2;
const events = [
new MouseEvent('mouseenter', { bubbles: true, clientX: x, clientY: y }),
new MouseEvent('mouseover', { bubbles: true, clientX: x, clientY: y }),
new MouseEvent('mousemove', { bubbles: true, clientX: x, clientY: y })
];
events.forEach((event, i) => {
setTimeout(() => {
try {
shareButton.dispatchEvent(event);
} catch (e) {}
}, i * 100);
});
await sleep(800);
try {
shareButton.click();
} catch (e) {
showNotification('Click failed', 'error');
}
await sleep(1200);
modalSetupDone = true;
resolve(true);
} catch (error) {
showNotification('Modal failed', 'error');
resolve(false);
}
});
}
// ===== COPY BUTTON SEARCH =====
function findCopyButton() {
const copyButtons = document.querySelectorAll('button, div[role="button"], a');
for (const button of copyButtons) {
const text = button.textContent?.toLowerCase() || '';
const title = button.title?.toLowerCase() || '';
const ariaLabel = button.getAttribute('aria-label')?.toLowerCase() || '';
if (text.includes('link kopieren') ||
text.includes('copy link') ||
title.includes('kopieren') ||
title.includes('copy') ||
ariaLabel.includes('kopieren') ||
ariaLabel.includes('copy')) {
const rect = button.getBoundingClientRect();
if (rect.width > 10 && rect.height > 10) {
return button;
}
}
}
return null;
}
function performCopy() {
return new Promise(async (resolve) => {
try {
const copyButton = findCopyButton();
if (!copyButton) {
resolve(false);
return;
}
for (let i = 0; i < 3; i++) {
try {
copyButton.click();
await sleep(50);
} catch (e) {}
}
resolve(true);
} catch (error) {
resolve(false);
}
});
}
// ===== MAIN BOT LOGIC =====
function performSpamuraiAction() {
return new Promise(async (resolve) => {
try {
if (!window.location.href.includes('/live')) {
showNotification('Not in live stream!', 'error');
stopSpamurai();
resolve(false);
return;
}
if (!modalSetupDone) {
const modalSuccess = await openModalFixed();
if (!modalSuccess) {
resolve(false);
return;
}
}
const success = await performCopy();
resolve(success);
} catch (error) {
resolve(false);
}
});
}
function startCopyInterval() {
const interval = getRandomInterval();
copyInterval = setTimeout(() => {
if (isRunning) {
performSpamuraiAction().then(() => {
if (isRunning) {
startCopyInterval();
}
});
}
}, interval);
}
function toggleSpamurai() {
if (isRunning) {
stopSpamurai();
} else {
startSpamurai();
}
}
function startSpamurai() {
if (isRunning) return;
if (!window.location.href.includes('/live')) {
showNotification('Please navigate to a TikTok Live stream first!', 'error');
return;
}
isRunning = true;
modalSetupDone = false;
totalCopies = 0;
successCount = 0;
errorCount = 0;
startTime = Date.now();
startMatrixEffect();
startCopyObserver();
startCopyInterval();
updateStats();
updateButtons();
showNotification('Spamurai Pro ACTIVATED with Matrix Effect!', 'success');
}
function stopSpamurai() {
if (!isRunning) return;
isRunning = false;
modalSetupDone = false;
if (copyInterval) {
clearTimeout(copyInterval);
copyInterval = null;
}
stopMatrixEffect();
stopCopyObserver();
const runtime = startTime ? ((Date.now() - startTime) / 1000).toFixed(1) : 0;
showNotification(`Stopped. Runtime: ${runtime}s, Total: ${totalCopies}`, 'info');
updateStats();
updateButtons();
}
// ===== UTILITY =====
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// ===== FORCE HIDE GUI FUNCTION =====
function forceHideGUI() {
console.log('🚀 FORCE HIDE GUI CALLED!');
try {
// Remove the overlay completely
const overlay = document.querySelector('.spamurai-overlay');
if (overlay) {
overlay.remove();
console.log('✅ Overlay removed!');
}
// Reset GUI variable
gui = null;
// Show mini button
if (miniSpamurai) {
miniSpamurai.style.display = 'block';
console.log('✅ Mini button shown!');
} else {
createMiniButton();
console.log('✅ Mini button recreated!');
}
} catch (error) {
console.error('❌ Force hide error:', error);
}
}
// ===== MINI BUTTON =====
function createMiniButton() {
const existing = document.querySelector('.mini-spamurai-button');
if (existing) existing.remove();
miniSpamurai = document.createElement('button');
miniSpamurai.className = 'mini-spamurai-button';
miniSpamurai.innerHTML = 'S';
miniSpamurai.title = 'Spamurai Pro v1.3 - Alcazi Edition - 2025-05-30 11:26:59';
miniSpamurai.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
showGUI();
});
document.body.appendChild(miniSpamurai);
}
function createGUI() {
// Force remove any existing GUI
const existing = document.querySelector('.spamurai-overlay');
if (existing) existing.remove();
gui = document.createElement('div');
gui.className = 'spamurai-overlay';
gui.style.display = 'none';
gui.innerHTML = `
<div class="spamurai-container">
<div class="spamurai-header">
<div class="spamurai-logo">SPAMURAI PRO</div>
<div class="spamurai-subtitle">Professional TikTok Share Bot</div>
<div class="spamurai-version">v1.3 • Alcazi Edition • 2025-05-30 11:26:59</div>
<button class="background-toggle" id="background-toggle" title="Show Background">
<i class="fas fa-eye"></i>
</button>
<button class="spamurai-close" id="close-gui" title="Close Spamurai">
<i class="fas fa-times"></i>
</button>
</div>
<div class="stats-professional">
<div class="stat-card-pro">
<div class="stat-number-pro" id="copy-count">0</div>
<div class="stat-label-pro">Total Shares</div>
</div>
<div class="stat-card-pro">
<div class="stat-number-pro" id="success-count">0</div>
<div class="stat-label-pro">Successful</div>
</div>
<div class="stat-card-pro">
<div class="stat-number-pro" id="success-rate">0%</div>
<div class="stat-label-pro">Success Rate</div>
</div>
</div>
<div class="control-section">
<div class="control-row-pro">
<div class="control-label-pro">
<i class="fas fa-tachometer-alt control-icon"></i>
Speed
</div>
<div class="speed-control-pro">
<div class="speed-display" id="speed-value">Medium</div>
</div>
</div>
<div class="control-row-pro">
<div class="control-label-pro">
<i class="fas fa-dice control-icon"></i>
Anti-Detection Mode
</div>
<div class="toggle-professional active" id="random-switch">
<div class="toggle-knob-pro"></div>
</div>
</div>
</div>
<div class="status-grid">
<div class="status-indicator">
<div class="status-dot-pro" id="status-dot"></div>
<span class="status-text-pro" id="status-text">Offline</span>
</div>
<div class="status-indicator">
<div class="status-dot-pro" id="random-dot"></div>
<span class="status-text-pro">Random</span>
</div>
<div class="status-indicator">
<div class="status-dot-pro" id="live-dot"></div>
<span class="status-text-pro">Live</span>
</div>
<div class="status-indicator">
<div class="status-dot-pro" id="background-dot"></div>
<span class="status-text-pro">View</span>
</div>
</div>
<button class="btn-professional btn-toggle" id="toggle-btn">
<i class="fas fa-play" id="toggle-icon"></i>
<span id="toggle-text">START SPAMURAI</span>
</button>
<button class="btn-professional btn-support" id="donate-btn">
<i class="fas fa-coffee"></i> Support Developer
</button>
<div class="footer-professional">
<div class="footer-text-pro">Professional TikTok Automation Tool with Background Toggle</div>
<div class="footer-text-pro">
Support: <a href="https://t.me/A1cazi" class="support-link-pro" target="_blank">@A1cazi</a>
</div>
</div>
</div>
`;
document.body.appendChild(gui);
setupEventListeners();
updateSpeed();
}
function setupEventListeners() {
try {
console.log('🔧 Setting up event listeners...');
// ✅ ULTIMATE CLOSE BUTTON FIX - Multiple methods
const closeBtn = document.getElementById('close-gui');
if (closeBtn) {
console.log('🎯 Close button found, setting up listeners...');
// Method 1: Direct onclick
closeBtn.onclick = function(e) {
console.log('🔥 Method 1: Direct onclick triggered!');
e.preventDefault();
e.stopPropagation();
forceHideGUI();
return false;
};
// Method 2: addEventListener click
closeBtn.addEventListener('click', function(e) {
console.log('🔥 Method 2: addEventListener triggered!');
e.preventDefault();
e.stopPropagation();
forceHideGUI();
}, { once: false, capture: true });
// Method 3: addEventListener mousedown
closeBtn.addEventListener('mousedown', function(e) {
console.log('🔥 Method 3: mousedown triggered!');
e.preventDefault();
e.stopPropagation();
forceHideGUI();
}, { once: false, capture: true });
// Method 4: Touch events for mobile
closeBtn.addEventListener('touchstart', function(e) {
console.log('🔥 Method 4: touchstart triggered!');
e.preventDefault();
e.stopPropagation();
forceHideGUI();
}, { once: false, capture: true });
console.log('✅ All close button listeners attached!');
} else {
console.error('❌ Close button not found!');
}
// ✅ NEW: Background Toggle Button
const backgroundBtn = document.getElementById('background-toggle');
if (backgroundBtn) {
console.log('🎯 Background button found, setting up listeners...');
backgroundBtn.onclick = function(e) {
console.log('🔥 Background toggle clicked!');
e.preventDefault();
e.stopPropagation();
toggleBackground();
return false;
};
backgroundBtn.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
toggleBackground();
}, { once: false, capture: true });
console.log('✅ Background toggle listeners attached!');
}
// Toggle button (Start/Stop)
const toggleBtn = document.getElementById('toggle-btn');
if (toggleBtn) {
toggleBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
toggleSpamurai();
});
}
// Speed control
const speedValue = document.getElementById('speed-value');
if (speedValue) {
speedValue.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
cycleSpeed();
});
}
// Random toggle
const randomSwitch = document.getElementById('random-switch');
if (randomSwitch) {
randomSwitch.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
CONFIG.randomMode = !CONFIG.randomMode;
randomSwitch.classList.toggle('active', CONFIG.randomMode);
updateStats();
showNotification(`Anti-Detection ${CONFIG.randomMode ? 'ENABLED' : 'DISABLED'}`, 'info');
});
}
// Donate button
const donateBtn = document.getElementById('donate-btn');
if (donateBtn) {
donateBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
try {
window.open('https://buymeacoffee.com/alcazi', '_blank');
showNotification('Thank you for your support! ❤️', 'success');
} catch (e) {
showNotification('Could not open donation link', 'error');
}
});
}
// Overlay click to close (backup method)
const overlay = document.querySelector('.spamurai-overlay');
if (overlay) {
overlay.addEventListener('click', (e) => {
if (e.target === overlay) {
console.log('🔥 Overlay click triggered!');
forceHideGUI();
}
});
}
// ESC key to close
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && gui && gui.style.display === 'flex') {
console.log('🔥 ESC key triggered!');
forceHideGUI();
}
});
console.log('✅ All event listeners setup complete!');
} catch (error) {
console.error('❌ Event listener error:', error);
}
}
function showGUI() {
try {
if (!gui) createGUI();
gui.style.display = 'flex';
if (miniSpamurai) miniSpamurai.style.display = 'none';
updateStats();
console.log('✅ GUI shown successfully!');
} catch (error) {
console.error('❌ Show GUI error:', error);
}
}
function hideGUI() {
try {
console.log('🔧 hideGUI called (legacy method)');
forceHideGUI(); // Use the force method instead
} catch (error) {
console.error('❌ Hide GUI error:', error);
}
}
function updateStats() {
try {
const elements = {
'copy-count': totalCopies,
'success-count': successCount,
'success-rate': totalCopies > 0 ? Math.round((successCount / totalCopies) * 100) + '%' : '0%'
};
Object.entries(elements).forEach(([id, value]) => {
const el = document.getElementById(id);
if (el) el.textContent = value;
});
const statusDot = document.getElementById('status-dot');
const statusText = document.getElementById('status-text');
if (statusDot && statusText) {
if (isRunning) {
statusDot.className = 'status-dot-pro active';
statusText.textContent = modalSetupDone ? 'Active' : 'Setup';
} else {
statusDot.className = 'status-dot-pro inactive';
statusText.textContent = 'Offline';
}
}
const randomDot = document.getElementById('random-dot');
if (randomDot) {
randomDot.className = CONFIG.randomMode ? 'status-dot-pro random' : 'status-dot-pro inactive';
}
const liveDot = document.getElementById('live-dot');
if (liveDot) {
const inLive = window.location.href.includes('/live');
liveDot.className = inLive ? 'status-dot-pro active' : 'status-dot-pro inactive';
}
// NEW: Background status dot
const backgroundDot = document.getElementById('background-dot');
if (backgroundDot) {
backgroundDot.className = CONFIG.backgroundVisible ? 'status-dot-pro background' : 'status-dot-pro inactive';
}
} catch (error) {
console.error('Stats update error:', error);
}
}
function updateButtons() {
try {
const toggleBtn = document.getElementById('toggle-btn');
const toggleIcon = document.getElementById('toggle-icon');
const toggleText = document.getElementById('toggle-text');
if (toggleBtn && toggleIcon && toggleText) {
if (isRunning) {
toggleBtn.classList.add('running');
toggleIcon.className = 'fas fa-stop';
toggleText.textContent = 'STOP SPAMURAI';
} else {
toggleBtn.classList.remove('running');
toggleIcon.className = 'fas fa-play';
toggleText.textContent = 'START SPAMURAI';
}
}
} catch (error) {
console.error('Button update error:', error);
}
}
// ===== INIT =====
function init() {
try {
const style = document.createElement('style');
style.textContent = CSS;
document.head.appendChild(style);
setTimeout(() => {
createMiniButton();
setInterval(updateStats, 1000);
showNotification('Spamurai Pro v1.3 with Background Toggle loaded! 🚀', 'success');
console.log('🚀 Spamurai Pro v1.3 - Alcazi Edition with Background Toggle initialized!');
}, 1000);
} catch (error) {
console.error('Init error:', error);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
// SPA Handler
let lastUrl = location.href;
new MutationObserver(() => {
const url = location.href;
if (url !== lastUrl) {
lastUrl = url;
setTimeout(() => {
if (!document.querySelector('.mini-spamurai-button')) {
createMiniButton();
}
}, 1000);
}
}).observe(document, { subtree: true, childList: true });
})();