You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.8 KiB

4 years ago
  1. #!/usr/bin/env python
  2. """
  3. SocksiPy + urllib2 handler
  4. version: 0.3
  5. author: e<e@tr0ll.in>
  6. 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...
  7. """
  8. import ssl
  9. try:
  10. import urllib2
  11. import httplib
  12. except ImportError: # Python 3
  13. import urllib.request as urllib2
  14. import http.client as httplib
  15. import socks # $ pip install PySocks
  16. def merge_dict(a, b):
  17. d = a.copy()
  18. d.update(b)
  19. return d
  20. class SocksiPyConnection(httplib.HTTPConnection):
  21. def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
  22. self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
  23. httplib.HTTPConnection.__init__(self, *args, **kwargs)
  24. def connect(self):
  25. self.sock = socks.socksocket()
  26. self.sock.setproxy(*self.proxyargs)
  27. if type(self.timeout) in (int, float):
  28. self.sock.settimeout(self.timeout)
  29. self.sock.connect((self.host, self.port))
  30. class SocksiPyConnectionS(httplib.HTTPSConnection):
  31. def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
  32. self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
  33. httplib.HTTPSConnection.__init__(self, *args, **kwargs)
  34. def connect(self):
  35. sock = socks.socksocket()
  36. sock.setproxy(*self.proxyargs)
  37. if type(self.timeout) in (int, float):
  38. sock.settimeout(self.timeout)
  39. sock.connect((self.host, self.port))
  40. self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
  41. class SocksiPyHandler(urllib2.HTTPHandler, urllib2.HTTPSHandler):
  42. def __init__(self, *args, **kwargs):
  43. self.args = args
  44. self.kw = kwargs
  45. urllib2.HTTPHandler.__init__(self)
  46. def http_open(self, req):
  47. def build(host, port=None, timeout=0, **kwargs):
  48. kw = merge_dict(self.kw, kwargs)
  49. conn = SocksiPyConnection(*self.args, host=host, port=port, timeout=timeout, **kw)
  50. return conn
  51. return self.do_open(build, req)
  52. def https_open(self, req):
  53. def build(host, port=None, timeout=0, **kwargs):
  54. kw = merge_dict(self.kw, kwargs)
  55. conn = SocksiPyConnectionS(*self.args, host=host, port=port, timeout=timeout, **kw)
  56. return conn
  57. return self.do_open(build, req)
  58. if __name__ == "__main__":
  59. import sys
  60. try:
  61. port = int(sys.argv[1])
  62. except (ValueError, IndexError):
  63. port = 9050
  64. opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, "localhost", port))
  65. print("HTTP: " + opener.open("http://httpbin.org/ip").read().decode())
  66. print("HTTPS: " + opener.open("https://httpbin.org/ip").read().decode())