-
Notifications
You must be signed in to change notification settings - Fork 0
/
NordVPN.py
120 lines (99 loc) · 3.33 KB
/
NordVPN.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import subprocess
import time
import requests
class IPError(Exception):
pass
class ConnectionError(Exception):
pass
class InstallationError(Exception):
pass
class SessionError(Exception):
pass
class NordVPN:
def __init__(self, server="United States"):
"""
Initialize NordVPN with a default server.
Args:
server (str): Name of the server to connect to (default: "United States").
"""
self.server = server
@property
def is_nordvpn_installed(self):
"""
Check if NordVPN is installed.
Returns:
bool: True if NordVPN is installed, False otherwise.
"""
if os.name == "nt": # Windows
result = subprocess.run(["where", "nordvpn"], capture_output=True, text=True)
else: # Linux
result = subprocess.run(["which", "nordvpn"], capture_output=True, text=True)
return result.returncode == 0
def connect(self):
"""
Connect to a NordVPN server.
Raises:
ConnectionError: If an error occurs while connecting to NordVPN.
"""
try:
if os.name == "nt": # Windows
os.system(f"nordvpn -c -n {self.server}")
while True:
time.sleep(20)
try:
self.get_ip()
except IPError:
continue
else: # Linux
os.system(f"nordvpn -c -n {self.server}")
while True:
time.sleep(20)
try:
self.get_ip()
except IPError:
continue
except Exception as e:
raise ConnectionError(f"Error connecting to NordVPN: {str(e)}")
def disconnect(self):
"""
Disconnect from the NordVPN server.
Raises:
ConnectionError: If an error occurs while disconnecting from NordVPN.
"""
try:
if os.name == "nt": # Windows
os.system("nordvpn disconnect")
time.sleep(3)
else: # Linux
os.system("nordvpn disconnect")
time.sleep(3)
except Exception as e:
raise ConnectionError(f"Error disconnecting from NordVPN: {str(e)}")
def get_ip(self):
"""
Get the current public IP address.
Raises:
IPError: If an error occurs while getting the IP address.
"""
try:
response = requests.get('https://api.myip.com')
ip = response.json()["ip"]
print(f"Your IP is: {ip}")
except Exception as e:
raise IPError(f"Error getting IP address: {str(e)}")
def get_session(self):
"""
Renew IP and return a requests session with NordVPN proxy settings.
Returns:
requests.Session: A requests session object with NordVPN proxy settings.
Raises:
SessionError: If an error occurs while creating the session.
"""
try:
self.disconnect()
self.connect()
session = requests.Session()
return session
except Exception as e:
raise SessionError(f"Error creating session with NordVPN: {str(e)}")