YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
- =========================
- π§ CONFIG
- =========================
- =========================
- π SETUP
- =========================
- =========================
- β‘ AI MODEL
- =========================
- =========================
- π TEXT NORMALIZATION
- =========================
- =========================
- π€ AI BIO SCAN
- =========================
- =========================
- π NETWORK HELPERS
- =========================
- =========================
- π WORKER THREAD
- =========================
- =========================
- π₯ CONSOLE COMMANDS
- =========================
- =========================
- π MAIN
- =========================
import json import time import threading import urllib.request import urllib.error import re from transformers import pipeline
=========================
π§ CONFIG
=========================
START_USER_ID = 1074729050 # Start scanning after your ID BATCH_SIZE = 500 MAX_BATCHES = 10
DELAY_AFTER_SUCCESS = 1 DELAY_AFTER_RATE_LIMIT = 5 BREAK_AFTER_USERS = 530 BREAK_DURATION = 15 # seconds
RAW_KEYWORDS = [ "bunny", "bunnny", "cempie", "pie", "clm", "master", "old man", "boy", "loli", "lolipop", "nertga", "nga", "nrger", "furry", "cp", "con", "comming", "cmzing", "czmming", "14yo", "endanger", "girl", "rcist", "rcst", "black", "blacked", "inch", "inches", "long", "stick", "beat it", "baby", "child", "bull", "bbc", "feet", "armpit", "big", "bbb", "bigbull", "giantess", "naughty", "BBD", "Maid", "Uwu", "Toy", "t0y", "filler", "Seed", "Asian", "butt", "abdl" ]
=========================
π SETUP
=========================
lock = threading.Lock() batch_next_id = [START_USER_ID + i * BATCH_SIZE for i in range(MAX_BATCHES)] batch_scanned_count = [0] * MAX_BATCHES bad_actors = [] scanned_ids = set()
=========================
β‘ AI MODEL
=========================
MODEL_NAME = "deepseek-ai/DeepSeek-R1" # Smaller model to reduce lag classifier = pipeline("text-classification", model=MODEL_NAME)
=========================
π TEXT NORMALIZATION
=========================
LEET_MAP = str.maketrans({ "0": "o", "1": "i", "3": "e", "4": "a", "5": "s", "7": "t", "@": "a", "$": "s" })
def normalize(text): if not isinstance(text, str): return "" text = text.lower().translate(LEET_MAP) text = re.sub(r"[^a-z\s]", "", text) text = re.sub(r"\s+", " ", text) return text.strip()
NORMALIZED_KEYWORDS = [normalize(k) for k in RAW_KEYWORDS]
def contains_bad_keyword(text): text = normalize(text) for kw in NORMALIZED_KEYWORDS: if kw in text: return kw return None
=========================
π€ AI BIO SCAN
=========================
def hf_ai_scan_bio(bio_text): if not bio_text: return None try: result = classifier(bio_text)[0] # {'label': 'LABEL', 'score': 0.95} label = result['label'] score = result['score'] if label.lower() in ["safe", "none"]: return None return f"{label} (confidence: {score:.2f})" except Exception as e: print("AI scan failed:", e) return None
=========================
π NETWORK HELPERS
=========================
def fetch_json(url): req = urllib.request.Request(url, headers={"User-Agent": "Roblox-Scanner/1.0"}) with urllib.request.urlopen(req, timeout=10) as response: return json.load(response)
def get_user_profile(user_id): return fetch_json(f"https://users.roblox.com/v1/users/{user_id}")
def get_user_favorites(user_id): try: data = fetch_json( f"https://favorites.roblox.com/v1/users/{user_id}/assets?assetType=0&limit=50" ) return [item.get("name") for item in data.get("data", []) if item.get("name")] except Exception: return []
=========================
π WORKER THREAD
=========================
def worker(batch_index, thread_speed=1): global scanned_ids
while True:
with lock:
start_id = batch_next_id[batch_index]
end_id = start_id + BATCH_SIZE
batch_next_id[batch_index] += BATCH_SIZE
for user_id in range(start_id, end_id):
if user_id in scanned_ids:
continue
try:
profile = get_user_profile(user_id)
favorites = get_user_favorites(user_id)
username = profile.get("name", "")
display_name = profile.get("displayName", "")
bio = profile.get("description", "")
name_hits = []
bio_hits = []
# Check username & display name
for field in (username, display_name):
kw = contains_bad_keyword(field)
if kw:
name_hits.append(kw)
# AI scan bio
if bio:
ai_result = hf_ai_scan_bio(bio)
if ai_result:
bio_hits.append(ai_result)
# Check favorites
if favorites:
for fav in favorites:
kw = contains_bad_keyword(fav)
if kw:
name_hits.append(kw)
# Mark bad actors
with lock:
scanned_ids.add(user_id)
batch_scanned_count[batch_index] += 1
if name_hits or bio_hits:
bad_actors.append({
"user_id": user_id,
"username": username,
"display_name": display_name,
"name_matches": sorted(set(name_hits)),
"bio_matches": sorted(set(bio_hits)),
})
# Break every BREAK_AFTER_USERS
if batch_scanned_count[batch_index] % BREAK_AFTER_USERS == 0:
time.sleep(BREAK_DURATION)
# Delay based on thread speed
time.sleep(DELAY_AFTER_SUCCESS / thread_speed)
except urllib.error.HTTPError as e:
if e.code == 404:
continue
elif e.code == 429:
time.sleep(DELAY_AFTER_RATE_LIMIT)
else:
continue
except Exception:
continue
=========================
π₯ CONSOLE COMMANDS
=========================
def console_listener(): """ Commands: .show -> Show flagged users (red) .ashow -> Show flagged users (blue) .finish -> Stop scanning & show all flagged users .ait -> Show AI thought process .showids -> Show Roblox IDs of flagged users .thread X -> Set scanning speed (1-10) .help / !help -> Show commands """ global DELAY_AFTER_SUCCESS
while True:
cmd = input().strip().lower()
with lock:
if cmd == ".show":
print("\n=== FLAGGED USERS (RED) ===")
for actor in bad_actors:
print(f"{actor['username']} | Names: {actor['name_matches']} | Bio: {actor['bio_matches']}")
elif cmd == ".ashow":
print("\n=== FLAGGED USERS (BLUE) ===")
for actor in bad_actors:
print(f"{actor['username']} | Names: {actor['name_matches']} | Bio: {actor['bio_matches']}")
elif cmd == ".finish":
print("\n=== FINAL FLAGGED LIST ===")
for actor in bad_actors:
print(f"{actor['username']} | Names: {actor['name_matches']} | Bio: {actor['bio_matches']}")
print("Stopping scanner...")
exit(0)
elif cmd == ".ait":
print("\n=== AI THOUGHT PROCESS ===")
for actor in bad_actors:
if actor['bio_matches']:
print(f"||//||\\|| AI THOUGHT ON: {actor['username']} -> {actor['bio_matches']}")
elif cmd == ".showids":
print("\n=== FLAGGED USER IDs ===")
for actor in bad_actors:
print(actor['user_id'])
elif cmd.startswith(".thread"):
parts = cmd.split()
if len(parts) == 2 and parts[1].isdigit():
speed = min(max(int(parts[1]), 1), 10)
DELAY_AFTER_SUCCESS = 1 / speed
print(f"Thread speed set to {speed}")
elif cmd in [".help", "!help"]:
print(console_listener.__doc__)
else:
print("Unknown command. Type .help for commands.")
=========================
π MAIN
=========================
def main(): # Start console listener threading.Thread(target=console_listener, daemon=True).start()
# Start worker threads
for i in range(MAX_BATCHES):
threading.Thread(target=worker, args=(i,), daemon=True).start()
while True:
time.sleep(10)
if name == "main": main()