diff --git a/newnew.py b/newnew.py
index 02cc391..5511016 100644
--- a/newnew.py
+++ b/newnew.py
@@ -4,7 +4,6 @@ import string
import time
import socket
import threading
-import discord
import asyncio
from datetime import datetime
import json
@@ -14,25 +13,22 @@ import sys
# IRC connection settings
SERVER = "irc.supernets.org"
PORT = 6667
-CHANNEL = "#superbowl"
-OLD_CHANNEL = "#blackhole"
-NICKNAME = "butts"
-NICKSERV_PASSWORD = "butts"
-
-# Discord Bot Token
-DISCORD_BOT_TOKEN = "il1k3A1pH4B3tS0upZcUz1tT4ugHtM32r33dGuDS"
+CHANNEL = "#"
+OUTPUT_CHANNEL = "#"
+OLD_CHANNEL = "#"
+NICKNAME = ""
+NICKSERV_PASSWORD = ""
# Counters and metrics
valid_invite_count = 0
scanned_invite_count = 0
-valid_invites = []
error_count = 0
rate_limited_count = 0
scan_state_file = "scan_state.json"
user_agents = [
- "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Mobile Safari/537.36",
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
- "Mozilla/5.0 (Linux; Android 9; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.101 Mobile Safari/537.36"
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
]
# Load scan state if exists
@@ -67,62 +63,7 @@ def generate_random_code():
characters = string.ascii_letters + string.digits
return ''.join(random.choice(characters) for _ in range(length))
-async def join_discord_and_list_members(client, invite_url, server_name, log_file, irc_socket):
- try:
- invite = await client.fetch_invite(invite_url)
- guild_id = invite.guild.id
- guild = client.get_guild(guild_id)
-
- if guild is None:
- print(f"Invite URL {invite_url} is valid but does not reference a guild.")
- irc_socket.sendall(f"PRIVMSG {CHANNEL} :Invite URL {invite_url} is valid but does not reference a guild.\r\n".encode("utf-8"))
- return
-
- members = await guild.fetch_members(limit=None).flatten()
- member_count = len(members)
- creation_date = guild.created_at.strftime("%Y-%m-%d %H:%M:%S")
- print(f"Joined server: {guild.name} (Members: {member_count}, Created: {creation_date})")
- irc_socket.sendall(f"PRIVMSG {CHANNEL} :Joining server: {server_name} ({invite_url}, Members: {member_count}, Created: {creation_date})\r\n".encode("utf-8"))
- member_names = ", ".join(member.name for member in members)
- log_file.write(f"{server_name}, {invite_url}, Members: {member_count}, Created: {creation_date}, {member_names}\n")
- log_file.flush()
- valid_invites.append((invite_url, datetime.now()))
- except Exception as e:
- global error_count
- error_count += 1
- print(f"Error joining server or fetching members: {e}")
- irc_socket.sendall(f"PRIVMSG {CHANNEL} :Error joining server or fetching members: {e}\r\n".encode("utf-8"))
-
-async def check_invite_http(url, log_file, irc_socket, client):
- global valid_invite_count, scanned_invite_count, rate_limited_count
- scanned_invite_count += 1
- headers = {'User-Agent': get_random_user_agent()}
- async with aiohttp.ClientSession() as session:
- try:
- async with session.get(url, headers=headers, timeout=10) as response:
- if response.status == 429:
- rate_limited_count += 1
- print("Rate limit encountered. Slowing down.")
- await asyncio.sleep(10)
- return
- if response.status == 200 and "Join the" in await response.text():
- server_name = "Unknown Server"
- if "
" in await response.text() and "" in await response.text():
- start = (await response.text()).find("") + len("")
- end = (await response.text()).find("")
- server_name = (await response.text())[start:end].strip()
- print(f"Valid invite found: {url}, {server_name}")
- log_file.write(f"Valid invite: {url}, {server_name}\n")
- log_file.flush()
- valid_invite_count += 1
- await join_discord_and_list_members(client, url, server_name, log_file, irc_socket)
- else:
- print(f"Invalid invite: {url}")
- except Exception as e:
- global error_count
- error_count += 1
- print(f"Error checking invite: {url} - {e}")
-
+# Keep IRC connection alive by responding to PING messages
def keep_connection_alive(irc_socket):
try:
while True:
@@ -135,6 +76,7 @@ def keep_connection_alive(irc_socket):
except socket.error as e:
print(f"Connection error in keep_connection_alive: {e}")
+# Handle initial IRC connection and commands
def handle_irc_connection(irc_socket):
irc_socket.sendall(f"NICK {NICKNAME}\r\n".encode("utf-8"))
irc_socket.sendall(f"USER {NICKNAME} 0 * :{NICKNAME}\r\n".encode("utf-8"))
@@ -143,36 +85,87 @@ def handle_irc_connection(irc_socket):
time.sleep(5)
irc_socket.sendall(f"PRIVMSG NickServ :IDENTIFY {NICKSERV_PASSWORD}\r\n".encode("utf-8"))
print("Identified with NickServ.")
- print("Waiting 5 seconds before leaving #blackhole...")
+ print("Waiting 5 seconds before leaving old channel...")
time.sleep(5)
irc_socket.sendall(f"PART {OLD_CHANNEL}\r\n".encode("utf-8"))
print(f"Left channel {OLD_CHANNEL}")
irc_socket.sendall(f"JOIN {CHANNEL}\r\n".encode("utf-8"))
print(f"Joined channel {CHANNEL}")
irc_socket.sendall(f"PRIVMSG {CHANNEL} :Starting invite scanner...\r\n".encode("utf-8"))
+ irc_socket.sendall(f"JOIN {OUTPUT_CHANNEL}\r\n".encode("utf-8"))
+ print(f"Joined output channel {OUTPUT_CHANNEL}")
+ irc_socket.sendall(f"PRIVMSG {OUTPUT_CHANNEL} :Starting invite scanner...\r\n".encode("utf-8"))
+
+async def check_invite_http(url, log_file, irc_socket):
+ global valid_invite_count, scanned_invite_count, rate_limited_count
+ scanned_invite_count += 1
+ headers = {'User-Agent': get_random_user_agent()}
+ api_url = url.replace("discord.com/invite", "discord.com/api/invites") + "?with_counts=true"
+ async with aiohttp.ClientSession() as session:
+ try:
+ async with session.get(api_url, headers=headers, timeout=10) as response:
+ if response.status == 429:
+ rate_limited_count += 1
+ print("Rate limit encountered. Slowing down.")
+ irc_socket.sendall(f"!!!RATE LIMIT HIT!!! - 5 MINUTE NAP.\r\n".encode("utf-8"))
+ await asyncio.sleep(300)
+ return
+ if response.status == 200:
+ data = await response.json()
+ guild_name = data.get("guild", {}).get("name", "Unknown Server")
+ guild_id = data.get("guild", {}).get("id", "Unknown")
+ description = data.get("guild", {}).get("description", "No description")
+ verification_level = data.get("guild", {}).get("verification_level", "Unknown")
+ nsfw_level = data.get("guild", {}).get("nsfw_level", "Unknown")
+ nsfw = data.get("guild", {}).get("nsfw", False)
+ premium_count = data.get("guild", {}).get("premium_subscription_count", 0)
+ presence_count = data.get("approximate_presence_count", 0)
+ member_count = data.get("approximate_member_count", 0)
+
+ log_entry = (f"Valid invite: {url}\n"
+ f"Guild Name: {guild_name}\n"
+ f"Guild ID: {guild_id}\n"
+ f"Description: {description}\n"
+ f"Verification Level: {verification_level}\n"
+ f"NSFW Level: {nsfw_level}\n"
+ f"NSFW: {nsfw}\n"
+ f"Premium Subscribers: {premium_count}\n"
+ f"Active Members: {presence_count}\n"
+ f"Total Members: {member_count}\n")
+ log_file.write(log_entry + "\n")
+ log_file.flush()
+ valid_invite_count += 1
+
+ irc_socket.sendall(f"PRIVMSG {OUTPUT_CHANNEL} :Valid invite found: {url} - Server name: {guild_name} - Description: {description} - Verification Level: {verification_level} - Members: {presence_count}/{member_count} - Premium subscribers: Premium Subscribers: {premium_count} - Verification Level: {verification_level} - NSFW: {nsfw} - NSFW Level: {nsfw_level}\r\n".encode("utf-8"))
+ else:
+ print(f"Invalid invite: {url}")
+ except Exception as e:
+ global error_count
+ error_count += 1
+ print(f"Error checking invite: {url} - {e}")
async def report_valid_invites(irc_socket):
global valid_invite_count, scanned_invite_count, error_count, rate_limited_count
while True:
await asyncio.sleep(600) # 10 minutes
irc_socket.sendall(f"PRIVMSG {CHANNEL} :Valid invites found: {valid_invite_count}, Links scanned: {scanned_invite_count}, Errors: {error_count}, Rate limits hit: {rate_limited_count}\r\n".encode("utf-8"))
+ irc_socket.sendall(f"PRIVMSG {OUTPUT_CHANNEL} :Valid invites found: {valid_invite_count}, Links scanned: {scanned_invite_count}, Errors: {error_count}, Rate limits hit: {rate_limited_count}\r\n".encode("utf-8"))
-async def shutdown_handler(irc_socket, client):
+async def shutdown_handler(irc_socket):
print("Shutting down gracefully...")
irc_socket.sendall(f"PRIVMSG {CHANNEL} :Stopping invite scanner.\r\n".encode("utf-8"))
+ irc_socket.sendall(f"PRIVMSG {OUTPUT_CHANNEL} :Stopping invite scanner.\r\n".encode("utf-8"))
irc_socket.close()
- await client.close()
save_scan_state()
sys.exit()
-async def run_scanner(log_file, irc_socket, client):
- global shutdown_event
+async def run_scanner(log_file, irc_socket):
try:
- while not shutdown_event.is_set():
+ while True:
random_code = generate_random_code()
invite_url = f"https://discord.com/invite/{random_code}"
- await check_invite_http(invite_url, log_file, irc_socket, client)
- await asyncio.sleep(random.uniform(0.5, 1))
+ await check_invite_http(invite_url, log_file, irc_socket)
+ await asyncio.sleep(random.uniform(5, 10))
except KeyboardInterrupt:
pass
@@ -182,30 +175,11 @@ async def main():
irc_socket = socket.create_connection((SERVER, PORT))
handle_irc_connection(irc_socket)
- intents = discord.Intents.all()
- client = discord.Client(intents=intents)
-
- @client.event
- async def on_ready():
- print(f'Logged in as {client.user}')
-
- global shutdown_event
- shutdown_event = threading.Event() # Use threading.Event instead of asyncio.Event
-
- def on_signal(signum, frame):
- shutdown_event.set() # Set the shutdown_event to signal termination
-
- signal.signal(signal.SIGINT, on_signal)
- signal.signal(signal.SIGTERM, on_signal)
+ signal.signal(signal.SIGINT, lambda *args: sys.exit())
+ signal.signal(signal.SIGTERM, lambda *args: sys.exit())
asyncio.create_task(report_valid_invites(irc_socket))
- scanner_task = asyncio.create_task(run_scanner(log_file, irc_socket, client))
-
- try:
- await client.start(DISCORD_BOT_TOKEN) # Properly start the Discord client
- await scanner_task
- finally:
- await shutdown_handler(irc_socket, client)
+ await run_scanner(log_file, irc_socket)
if __name__ == "__main__":
load_scan_state()