Skip to content

Instantly share code, notes, and snippets.

@KMKnation
Forked from Lazza/README.md
Last active November 13, 2024 21:01
Show Gist options
  • Select an option

  • Save KMKnation/dde9b11d38435d0f062a68b7baef3433 to your computer and use it in GitHub Desktop.

Select an option

Save KMKnation/dde9b11d38435d0f062a68b7baef3433 to your computer and use it in GitHub Desktop.
VPNGate Python script with python3 support

vpngate.py

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.

Usage

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 for Korea Republic Of
  • Russia will work for Russian Federation
  • ... and so on

Demo

Here is a short Youtube video showcasing an example usage:

YT video

Requirements

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.

#!/usr/bin/env python
"""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]).decode('utf-8'))
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')
@derGraph
Copy link

AUTH: Received control message: AUTH_FAILED

@glaucocustodio
Copy link

what should be the contents of /etc/openvpn/update-resolv-conf? It's asking for password, maybe it's because I don't have this update-resolv-conf file set..

@glaucocustodio
Copy link

@MeteorsLiu
Copy link

MeteorsLiu commented Mar 5, 2023

Consider about the OpenVPN option "--down" instead of polling?

--down will execute the script when the VPN gets down, which could reduce the unnecessary resource.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment