Created
March 1, 2015 13:19
-
-
Save zed/08ca0adfb3b7457cb834 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# from https://raw.githubusercontent.com/Anorov/PySocks/cd6844dfc4dbe4550e30d9271d8d29cca23e3702/sockshandler.py | |
""" | |
SocksiPy + urllib2 handler | |
version: 0.2 | |
author: e<e@tr0ll.in> | |
This module provides a Handler which you can use with urllib2 to allow it to tunnel your connection through a socks.sockssocket socket, with out monkey patching the original socket... | |
""" | |
import ssl | |
try: | |
import urllib2 | |
import httplib | |
except ImportError: # Python 3 | |
import urllib.request as urllib2 | |
import http.client as httplib | |
import socks # $ pip install PySocks | |
def merge_dict(a, b): | |
d = a.copy() | |
d.update(b) | |
return d | |
class SocksiPyConnection(httplib.HTTPConnection): | |
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs): | |
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password) | |
httplib.HTTPConnection.__init__(self, *args, **kwargs) | |
def connect(self): | |
self.sock = socks.socksocket() | |
self.sock.setproxy(*self.proxyargs) | |
if type(self.timeout) in (int, float): | |
self.sock.settimeout(self.timeout) | |
self.sock.connect((self.host, self.port)) | |
class SocksiPyConnectionS(httplib.HTTPSConnection): | |
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs): | |
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password) | |
httplib.HTTPSConnection.__init__(self, *args, **kwargs) | |
def connect(self): | |
sock = socks.socksocket() | |
sock.setproxy(*self.proxyargs) | |
if type(self.timeout) in (int, float): | |
sock.settimeout(self.timeout) | |
sock.connect((self.host, self.port)) | |
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) | |
class SocksiPyHandler(urllib2.HTTPHandler, urllib2.HTTPSHandler): | |
def __init__(self, *args, **kwargs): | |
self.args = args | |
self.kw = kwargs | |
urllib2.HTTPHandler.__init__(self) | |
def http_open(self, req): | |
def build(host, port=None, timeout=0, **kwargs): | |
kw = merge_dict(self.kw, kwargs) | |
conn = SocksiPyConnection(*self.args, host=host, port=port, timeout=timeout, **kw) | |
return conn | |
return self.do_open(build, req) | |
def https_open(self, req): | |
def build(host, port=None, timeout=0, **kwargs): | |
kw = merge_dict(self.kw, kwargs) | |
conn = SocksiPyConnectionS(*self.args, host=host, port=port, timeout=timeout, **kw) | |
return conn | |
return self.do_open(build, req) | |
if __name__ == "__main__": | |
import sys | |
try: | |
port = int(sys.argv[1]) | |
except (ValueError, IndexError): | |
port = 9050 | |
opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, "localhost", port)) | |
print("HTTP: " + opener.open("http://httpbin.org/ip").read().decode()) | |
print("HTTPS: " + opener.open("https://httpbin.org/ip").read().decode()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment