크롤링을 한다거나, 한국 ip 차단 된 사이트를 접속하는 등 vpn이 필요한 경우가 종종있다.
프로그램을 짜면서 ip를 바꿔야만 하는일이 그렇게 많을거 같진 않지만 뭐.. 기록용으로 남겨둔다
코드 출처는 여기
실행해보고 ip가 바뀌었는지 확인은 요기서 해보면 된다
리눅스에서 실행
vpngate의 무료 vpn를 받아서 openvpn이라는 프로그램으로 vpn을 연결한다
이 프로그램은 리눅스에서만 작동한다. 테스트 해본 환경은 Ubuntu 20LTS버전이다.
openvpn을 깔아주자
sudo apt-get install openvpn
vpngate.py
#!/usr/bin/env python3
"""Pick server and start connection with VPNGate (http://www.vpngate.net/en/)"""
import requests
import os
import sys
import tempfile
import subprocess
import base64
import time
__author__ = "Andrea Lazzarotto"
__copyright__ = "Copyright 2014+, Andrea Lazzarotto"
__license__ = "GPLv3"
__version__ = "1.0"
__maintainer__ = "Andrea Lazzarotto"
__email__ = "andrea.lazzarotto@gmail.com"
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 BaseException:
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())
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 BaseException:
try:
x.kill()
except BaseException:
pass
while x.poll() != 0:
time.sleep(1)
print("\nVPN terminated")
실행 방법은 간단하다. python3 vpngate.py korea
이렇게 vpngate.py [국가명 | 국가코드]를 적어주면 해당 국가에 대한 vpn 정보중 제일 환경이 좋은거로 연결해준다.
윈도우에서 실행
여기서 Windows 64-bit MSI installer 받아서 설치해준다
이제 환경변수를 설정해주자
윈도우키누르고 "환경" 검색 후 "시스템 환경 변수 편집" 클릭
해당 경로로 들어가서 openvpn이 설치된 경로에 bin폴더를 환경변수로 잡아줌
기존에 켜졌던 프로세스는 환경변수 적용안되니 껐다키고, 새로킨 cmd에서 openvpn이라고 쳤을때 반응이 있으면 설정 완료 된거임
vpngate.py
import requests
import os
import sys
import tempfile
import subprocess
import base64
import time
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 BaseException:
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())
x = subprocess.Popen(["openvpn", "--config", path])
try:
while True:
time.sleep(600)
# termination with Ctrl+C
except BaseException:
try:
x.kill()
except BaseException:
pass
while x.poll() != 0:
time.sleep(1)
print("\nVPN terminated")
실행방법은 python vpngate.py korea
주의! 이때 cmd를 관리자 권한으로 실행시켜야함!
실행전과 실행후 ip확인 사이트에서 ip가 달라졌는지 확인하면 된다.
이 코드를 응용해서 멀티프로세스같은것을 이용하든 약간의 수정을 하든해서
자신의 프로그램을 사용할때 ip를 변경하는 작업을 할 수 있을것이다.
'Python' 카테고리의 다른 글
파이썬 프로젝트 추천! 아스키 아트(ASCII ART) 프로젝트 (0) | 2022.10.27 |
---|---|
python 주식 퀀트&백테스팅 관련 라이브러리 정리 (0) | 2022.07.30 |
python pandas 중복된 데이터를 가진 행을 하나로 줄이기 reduce (1) | 2022.07.19 |
Python 이미지파일(jpg) pdf로 바꾸기 (0) | 2022.06.27 |
파이썬 유튜브 영상 정보 다운로드하기 pytube (0) | 2022.06.20 |