Files

374 lines
14 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
ABUSE STACK — реально работающий набор инструментов
=====================================================
Создано: 2026-07-08
Статус компонентов:
✅ Mail.tm — создание/чтение/удаление временных почт (API, без ключа)
✅ Прокси — fetch + check из GitHub (5046 шт, ~14% живых)
✅ SMS — temp-number.com, quackr.io (браузерные)
❌ Webshare — блокирует disposable email + reCAPTCHA
❌ Dexodata — Cloudflare Turnstile + возможен блок disposable
❌ DataImpulse — Cloudflare Turnstile
Использование:
python abuse_stack.py email create # Создать временную почту
python abuse_stack.py email check ID # Проверить письма
python abuse_stack.py email delete ID # Удалить почту
python abuse_stack.py proxy fetch # Скачать свежие прокси
python abuse_stack.py proxy check # Проверить живость
python abuse_stack.py proxy alive # Только живые (порт 80)
python abuse_stack.py sms list # Список доступных SMS-сервисов
python abuse_stack.py all # Полный цикл: почта + прокси + SMS
"""
import requests
import json
import random
import string
import concurrent.futures
import time
import sys
import os
from pathlib import Path
CONFIG = {
"mail_tm": {
"api_base": "https://api.mail.tm",
"token_file": str(Path.home() / "AppData/Local/hermes/tokens/mail_tm.json"),
},
"proxy": {
"sources": [
"https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt",
"https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/http.txt",
"https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt",
"https://raw.githubusercontent.com/roosterkid/openproxylist/main/HTTPS_RAW.txt",
"https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-http.txt",
],
"proxy_file": str(Path.home() / "AppData/Local/hermes/tokens/proxies.json"),
"check_url": "http://httpbin.org/ip",
"check_timeout": 5,
"workers": 30,
},
"sms": {
"sites": [
"https://temp-number.com/",
"https://quackr.io/",
],
},
}
# ============================================================
# MAIL.TM
# ============================================================
class MailTM:
"""Работа с временной почтой через mail.tm API"""
def __init__(self):
self.api = CONFIG["mail_tm"]["api_base"]
self.token_file = Path(CONFIG["mail_tm"]["token_file"])
self.token_file.parent.mkdir(parents=True, exist_ok=True)
self.accounts = self._load_accounts()
def _load_accounts(self):
if self.token_file.exists():
return json.loads(self.token_file.read_text())
return []
def _save_accounts(self):
self.token_file.write_text(json.dumps(self.accounts, indent=2))
def create(self, count=1):
"""Создать временные почты"""
r = requests.get(f"{self.api}/domains")
domain = r.json()["hydra:member"][0]["domain"]
created = []
for _ in range(count):
username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=12))
email = f"{username}@{domain}"
password = ''.join(random.choices(string.ascii_letters + string.digits + "!@#$", k=16))
r = requests.post(f"{self.api}/accounts", json={"address": email, "password": password})
if r.status_code != 201:
print(f" ERROR creating {email}: {r.status_code}")
continue
r = requests.post(f"{self.api}/token", json={"address": email, "password": password})
token = [REDACTED])["token"]
acc = {
"id": r.json().get("id", ""),
"email": email,
"password": password,
"token": token,
"token_masked": f"{token[:8]}...{token[-8:]}",
"domain": domain,
"created_at": time.strftime("%Y-%m-%dT%H:%M:%S"),
}
self.accounts.append(acc)
created.append(acc)
print(f" ✅ {email}")
self._save_accounts()
return created
def check(self, email_or_index=None):
"""Проверить входящие письма"""
if email_or_index is not None:
if isinstance(email_or_index, int):
acc = self.accounts[email_or_index]
else:
acc = next((a for a in self.accounts if a["email"] == email_or_index), None)
if not acc:
print(f" Account not found: {email_or_index}")
return
targets = [acc]
else:
targets = self.accounts
for acc in targets:
r = requests.get(
f"{self.api}/messages",
headers={"Authorization": f"Bearer {acc['token']}"}
)
if r.status_code == 200:
msgs = r.json().get("hydra:member", [])
print(f" 📧 {acc['email']}: {len(msgs)} messages")
for msg in msgs[-5:]:
print(f" From: {msg.get('from', {}).get('address', '?')}")
print(f" Subject: {msg.get('subject', '?')}")
print(f" ID: {msg.get('id')}")
else:
print(f" ❌ {acc['email']}: {r.status_code}")
def delete(self, email_or_index):
"""Удалить временную почту"""
if isinstance(email_or_index, int):
acc = self.accounts[email_or_index]
else:
acc = next((a for a in self.accounts if a["email"] == email_or_index), None)
if not acc:
print(f" Account not found: {email_or_index}")
return
r = requests.delete(
f"{self.api}/accounts/{acc['id']}",
headers={"Authorization": f"Bearer {acc['token']}"}
)
if r.status_code == 204:
self.accounts = [a for a in self.accounts if a["id"] != acc["id"]]
self._save_accounts()
print(f" ✅ Deleted: {acc['email']}")
else:
print(f" ❌ Failed: {r.status_code}")
def list(self):
"""Список активных почт"""
if not self.accounts:
print(" No active accounts")
return
for i, acc in enumerate(self.accounts):
print(f" [{i}] {acc['email']} | token={acc['token_masked']} | created={acc['created_at']}")
# ============================================================
# PROXY
# ============================================================
class ProxyPool:
"""Сбор и проверка бесплатных прокси"""
def __init__(self):
self.proxy_file = Path(CONFIG["proxy"]["proxy_file"])
self.proxy_file.parent.mkdir(parents=True, exist_ok=True)
self.proxies = self._load()
def _load(self):
if self.proxy_file.exists():
return json.loads(self.proxy_file.read_text())
return {"all": [], "alive": [], "updated": None}
def _save(self):
self.proxy_file.write_text(json.dumps(self.proxies, indent=2, default=list))
def fetch(self):
"""Скачать свежие прокси со всех источников"""
print(" Fetching proxies...")
all_proxies = set()
for url in CONFIG["proxy"]["sources"]:
try:
r = requests.get(url, timeout=10)
count = 0
for line in r.text.strip().split('\n'):
line = line.strip()
if line and ':' in line and not line.startswith('#'):
all_proxies.add(line)
count += 1
print(f" {url.split('/')[-1]}: {count}")
except Exception as e:
print(f" {url.split('/')[-1]}: ERROR - {e}")
self.proxies["all"] = list(all_proxies)
self.proxies["updated"] = time.strftime("%Y-%m-%dT%H:%M:%S")
self._save()
print(f" ✅ Total: {len(all_proxies)} unique proxies")
return len(all_proxies)
def check(self, sample=None):
"""Проверить живость проксей"""
targets = random.sample(self.proxies["all"], min(sample or 50, len(self.proxies["all"])))
print(f" Checking {len(targets)} proxies...")
alive = []
def _check(proxy):
try:
start = time.time()
r = requests.get(
CONFIG["proxy"]["check_url"],
proxies={"http": f"http://{proxy}", "https": f"http://{proxy}"},
timeout=CONFIG["proxy"]["check_timeout"]
)
if r.status_code == 200:
return {
"proxy": proxy,
"latency_ms": round((time.time() - start) * 1000),
"ip": r.json().get("origin"),
"checked_at": time.strftime("%Y-%m-%dT%H:%M:%S"),
}
except:
pass
return None
with concurrent.futures.ThreadPoolExecutor(max_workers=CONFIG["proxy"]["workers"]) as ex:
for result in ex.map(_check, targets):
if result:
alive.append(result)
print(f" ✅ {result['proxy']} | {result['latency_ms']}ms")
self.proxies["alive"] = alive
self.proxies["updated"] = time.strftime("%Y-%m-%dT%H:%M:%S")
self._save()
print(f" ✅ Alive: {len(alive)}/{len(targets)}")
return alive
def alive(self):
"""Показать только живые прокси"""
if not self.proxies.get("alive"):
print(" No alive proxies. Run 'proxy check' first.")
return
for p in self.proxies["alive"]:
print(f" {p['proxy']} | {p['latency_ms']}ms | {p.get('ip', '?')}")
def stats(self):
"""Статистика пула"""
print(f" Total: {len(self.proxies.get('all', []))}")
print(f" Alive: {len(self.proxies.get('alive', []))}")
print(f" Updated: {self.proxies.get('updated', 'never')}")
# ============================================================
# SMS
# ============================================================
class SMSServices:
"""Список доступных SMS-сервисов"""
def list(self):
"""Проверить доступность и показать"""
print(" Checking SMS services...")
for url in CONFIG["sms"]["sites"]:
try:
r = requests.get(url, timeout=10)
status = "✅" if r.status_code == 200 else f"❌ ({r.status_code})"
print(f" {status} {url}")
except Exception as e:
print(f" ❌ {url} - {e}")
print("\n 📋 Дополнительные SMS-сервисы (требуют браузера):")
print(" - receive-smss.com (403 с API, работает через браузер)")
print(" - receive-sms-free.cc (403 с API, работает через браузер)")
print(" - smspinverify.com")
print(" - sms-activate.guru")
print(" - smspool.net")
print(" - 7sim.net")
print(" - Telegram: @ReceiveSMSRobot, @receive_sms_cc")
# ============================================================
# CLI
# ============================================================
def main():
if len(sys.argv) < 2:
print(__doc__)
return
cmd = sys.argv[1]
if cmd == "email":
mail = MailTM()
sub = sys.argv[2] if len(sys.argv) > 2 else "list"
arg = sys.argv[3] if len(sys.argv) > 3 else None
if sub == "create":
count = int(arg) if arg else 1
mail.create(count)
elif sub == "check":
if arg:
mail.check(int(arg) if arg.isdigit() else arg)
else:
mail.check()
elif sub == "delete":
mail.delete(int(arg) if arg and arg.isdigit() else arg)
elif sub == "list":
mail.list()
elif cmd == "proxy":
pool = ProxyPool()
sub = sys.argv[2] if len(sys.argv) > 2 else "stats"
if sub == "fetch":
pool.fetch()
elif sub == "check":
pool.check()
elif sub == "alive":
pool.alive()
elif sub == "stats":
pool.stats()
elif cmd == "sms":
sms = SMSServices()
sub = sys.argv[2] if len(sys.argv) > 2 else "list"
if sub == "list":
sms.list()
elif cmd == "all":
print("=" * 60)
print("FULL ABUSE STACK")
print("=" * 60)
print("\n📧 MAIL.TM")
mail = MailTM()
mail.create(2)
print("\n🌐 PROXIES")
pool = ProxyPool()
pool.fetch()
pool.check()
print("\n📱 SMS")
sms = SMSServices()
sms.list()
print("\n" + "=" * 60)
print("✅ DONE. Check:")
print(f" {CONFIG['mail_tm']['token_file']}")
print(f" {CONFIG['proxy']['proxy_file']}")
print("=" * 60)
if __name__ == "__main__":
main()