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)
댓글 없음:
댓글 쓰기