2019년 7월 27일 토요일

python에서 proxy 설정 읽어 처리하기 (processing proxy setting in python) using pypac


proxy 환경에서 완벽한 web page 접속을 하기 위하여 작업을 시작하였습니다. proxy 설정이 ip로만 구성된것이 아니라 간혹 pac https://en.wikipedia.org/wiki/Proxy_auto-config 파일 형태로 된곳도 있어 이것을 어떻게 처리할까 고민하였습니다.
IE 설정값을 읽어서 그것을 처리하도록 아래와 같이 구현하였습니다.

import winreg as reg  
import os     
from pypac import PACSession, get_pac
import requests


def get_proxy_server():
 key = reg.HKEY_CURRENT_USER 
 key_value = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"

 open = reg.OpenKey(key,key_value,0,reg.KEY_ALL_ACCESS)
 value = None
 value = None
 try:
  value, type = reg.QueryValueEx(open,"ProxyServer")
  print("ProxyServer",value,"Type:",type)
 except FileNotFoundError:
  pass
 # now close the opened key 
 reg.CloseKey(open)
 return value
 
def get_auto_proxy_url():
 key = reg.HKEY_CURRENT_USER 
 key_value = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"

 open = reg.OpenKey(key,key_value,0,reg.KEY_ALL_ACCESS)
 value = None
 try:
  value, type = reg.QueryValueEx(open,"AutoConfigURL")
  print("AutoConfigURL",value,"Type:",type)
 except FileNotFoundError:
  pass
 # now close the opened key 
 reg.CloseKey(open)
 return value


session = None
proxies = {}
proxy_url = get_auto_proxy_url()
proxy_server = get_proxy_server()

if( proxy_url!=None ):
 try:
  pac = get_pac(url=proxy_url)
  session = PACSession(pac)
 except:
  session = requests.Session()
elif( proxy_server!=None ):
 if( proxy_server.startswith("http") ):
  spldata = proxy_server.split(';')
  for data in spldata:
   vdata = data.split("=")
   if( len(vdata) == 2 ):
    if( vdata[0]=="http" ):
     proxies["http"] = vdata[1]
    elif( vdata[0]=="https" ):
     proxies["https"] = vdata[1] 
 else:     
  print(proxy_server)
  proxies["http"] = proxy_server
  proxies["https"] = proxy_server
 session = requests.Session()
else:
 session = requests.Session()

print(proxies)

req = session.get('http://www.daum.net',proxies=proxies)
html = req.text
header = req.headers
status = req.status_code
is_ok = req.ok

print(html)

위 코드는 IE의 레지스트리에서 값을 읽어 내는 방식입니다. proxy 주소일때와 pac파일일때 각각 분리하여 처리하도록 하였습니다. 그런데 테스트해보면 정상 동작하지 않았습니다.

pypac 패키지의 소스를 분석해보았습니다. pypac에서도 IE설정을 읽는 코드가 있었고 pypac를 잘못 이해하고 사용하고 있었습니다.

pypac 패키지 내부에서 모든 proxy처리가 가능하도록 되었습니다.

개선코드
import winreg as reg  
import os     
from pypac import PACSession, get_pac
import requests


session = None

try:
 pac = get_pac()
 session = PACSession(pac)

except:
 session = requests.Session()

req = session.get('http://www.daum.net')
html = req.text
header = req.headers
status = req.status_code
is_ok = req.ok

print(html)






댓글 없음:

댓글 쓰기