This snippet of code was posted in 2014 and slightly revised in 2016 and 2017. It was more of a quick'n'dirty script than a polished tool. It is made only for Linux and in Python 2, which has since become outdated.
I currently do not use it, and I suggest you avoid it as well. Please do not expect support for using this script.
🔥 If you need an alternative, @glaucocustodio has kindly suggested EasyVPN in this comment.
The rest of the README is left for historical purposed.
This script allows to use the free VPN service provided by VPNGate in an easy way. The user just needs to provide the desidered output country, and the script automatically chooses the best server.
After this step, OpenVPN is launched with the proper configuration. The VPN can be terminated by pressing Ctrl+C.
Run the script by providing the desired output country:
vpngate.py US
Both country codes and country names are supported, as listed on the VPNGate website, e.g.:
vpngate.py "United Kingdom"
Moreover, the script allows to input countries with any case (Italy
, italy
, ItALy
all work) and with partial names:
Korea
will work forKorea Republic Of
Russia
will work forRussian Federation
- ... and so on
Here is a short Youtube video showcasing an example usage:
OpenVPN needs to be installed.
The script should run on any Linux distribution with the Python Requests module installed. The user running the script must be able to run sudo
commands in order to start openvpn
.
"""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()
f = open(path, 'w')
f.write(base64.b64decode(winner[-1]))
f.write('\nscript-security 2\nup /etc/openvpn/update-resolv-conf\ndown /etc/openvpn/update-resolv-conf')
f.close()
x = subprocess.Popen(['sudo', 'openvpn', '--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')