autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
374
skills/free-tools-abuse/scripts/abuse_stack.py
Normal file
374
skills/free-tools-abuse/scripts/abuse_stack.py
Normal file
@@ -0,0 +1,374 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user