Last active
September 22, 2022 03:37
-
-
Save im-noob/15c20628c96d3ab4f3e5654ff293cd67 to your computer and use it in GitHub Desktop.
vpngate.py In python 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# Origal Soruce: https://gist.github.com/Lazza/bbc15561b65c16db8ca8 | |
"""Pick server and start connection with VPNGate (http://www.vpngate.net/en/)""" | |
import requests, os, sys, tempfile, subprocess, base64, time | |
__author__ = "Andrea Lazzarotto" | |
__copyright__ = "Copyright 2014+, Andrea Lazzarotto" | |
__license__ = "GPLv3" | |
__version__ = "1.0" | |
__maintainer__ = "Andrea Lazzarotto" | |
__email__ = "[email protected]" | |
if len(sys.argv) != 2: | |
print('usage: ' + sys.argv[0] + ' [country name | country code]') | |
exit(1) | |
country = sys.argv[1] | |
if len(country) == 2: | |
i = 6 # short name for country | |
elif len(country) > 2: | |
i = 5 # long name for country | |
else: | |
print('Country is too short!') | |
exit(1) | |
try: | |
vpn_data = requests.get('http://www.vpngate.net/api/iphone/').text.replace('\r','') | |
servers = [line.split(',') for line in vpn_data.split('\n')] | |
labels = servers[1] | |
labels[0] = labels[0][1:] | |
servers = [s for s in servers[2:] if len(s) > 1] | |
except: | |
print('Cannot get VPN servers data') | |
exit(1) | |
desired = [s for s in servers if country.lower() in s[i].lower()] | |
found = len(desired) | |
print('Found ' + str(found) + ' servers for country ' + country) | |
if found == 0: | |
exit(1) | |
supported = [s for s in desired if len(s[-1]) > 0] | |
print(str(len(supported)) + ' of these servers support OpenVPN') | |
# We pick the best servers by score | |
winner = sorted(supported, key=lambda s: float(s[2].replace(',','.')), reverse=True)[0] | |
print("\n== Best server ==") | |
pairs = list(zip(labels, winner))[:-1] | |
for (l, d) in pairs[:4]: | |
print(l + ': ' + d) | |
print(pairs[4][0] + ': ' + str(float(pairs[4][1]) / 10**6) + ' MBps') | |
print("Country: " + pairs[5][1]) | |
print("\nLaunching VPN...") | |
_, path = tempfile.mkstemp() | |
# Creating File here | |
path = 'tmp/config.conf' | |
f = open(path, 'w') | |
f.write(base64.b64decode(winner[-1]).decode('ascii')) | |
f.write('\nscript-security 2\nup /etc/openvpn/update-resolv-conf\ndown /etc/openvpn/update-resolv-conf\npull-filter ignore auth-token') | |
f.close() | |
x = subprocess.Popen(['sudo', 'openvpn', '--auth-nocache', '--config', path]) | |
try: | |
while True: | |
time.sleep(600) | |
# termination with Ctrl+C | |
except: | |
try: | |
x.kill() | |
except: | |
pass | |
while x.poll() != 0: | |
time.sleep(1) | |
print('\nVPN terminated') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
use (cmd) instead of sudo