├── README.md ├── libs ├── __init__.py ├── base.py ├── genips.py └── pycui.py └── ps.py /README.md: -------------------------------------------------------------------------------- 1 | Python Proxy Scanner 2 | === 3 | #### 简介 4 | 最近想做一个`Chrome`翻墙工具,其中涉及到HTTP代理,想着不喜欢网上公开的免费信息,就自己利用点业余时间写了一个扫描HTTP代理的工具了。 5 | 匆忙发布,还有很多未完善的地方,日后再慢慢修改。 6 | 7 | #### 安装 8 | ```shell 9 | $ git clone https://github.com/h01/ProxyScanner.git 10 | ``` 11 | 12 | #### 使用 13 | ```shell 14 | $ ./ps.py -i 1.1.1.1-1.1.2.255 -p 8080 -t 50 -s test.txt 15 | ``` 16 | -------------------------------------------------------------------------------- /libs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h01/ProxyScanner/99b2e204cdd3a55b1ccea0c7d5103c0c87a3d2e4/libs/__init__.py -------------------------------------------------------------------------------- /libs/base.py: -------------------------------------------------------------------------------- 1 | #-*- coding:utf-8 -*- 2 | ''' 3 | @name Base Functions 4 | @modify 2014/11/27 5 | @author Holger 6 | @github https://github.com/h01/ProxyScanner 7 | @myblog http://ursb.org 8 | ''' 9 | from pycui import * 10 | from genips import genips 11 | import Queue, threading 12 | import urllib2, socket 13 | 14 | cui = pycui() 15 | gen = genips() 16 | cor = color() 17 | 18 | class base: 19 | def __init__(self): 20 | self._p = 8080 21 | self._t = 10 22 | self._i = [] 23 | self._o = [] 24 | self._r = [] 25 | self._s = '' 26 | def run(self, opts): 27 | for k, v in opts: 28 | if k in ['-v', '--version']: 29 | self.version() 30 | elif k in ['-p', '--port']: 31 | self._p = int(v) 32 | elif k in ['-i', '--ips']: 33 | _temp = v.split('-') 34 | self._i = gen.gen(_temp[0], _temp[1]) 35 | elif k in ['-t', '--thread']: 36 | self._t = int(v) 37 | elif k in ['-s', '--save']: 38 | self._s = v 39 | else: 40 | self.usage() 41 | if (65535 >= self._p > 0) and (100 >= self._t > 0) and (len(self._i) > 0): 42 | self.start() 43 | else: 44 | self.usage() 45 | def start(self): 46 | cui.w('Proxy Scanner started') 47 | cui.i('Nums: %s'%len(self._i)) 48 | cui.i('Port: %s'%self._p) 49 | cui.i('Thread: %s'%self._t) 50 | self.scanports() 51 | self.scanproxy() 52 | self.result() 53 | def scanports(self): 54 | cui.w('Start scanning the open port\'s IP..') 55 | def run(q): 56 | while not q.empty(): 57 | _ip = q.get() 58 | if self.checkPort(_ip, self._p): 59 | cui.s('Open: %s'%_ip) 60 | self._o.append(_ip) 61 | else: 62 | cui.e('Close: %s'%_ip) 63 | self.startThread(self._i, run) 64 | 65 | def scanproxy(self): 66 | if len(self._o) > 0: 67 | cui.w('Checking the proxy is available..') 68 | def run(q): 69 | while not q.empty(): 70 | _ip = q.get() 71 | if self.checkProxy(_ip, self._p): 72 | cui.s('OK: %s'%_ip) 73 | self._r.append(_ip) 74 | else: 75 | cui.e('NO: %s'%_ip) 76 | self.startThread(self._o, run) 77 | else: 78 | cui.i('Not proxy to checking..') 79 | def startThread(self, arr, func): 80 | __q = Queue.Queue() 81 | __t = [] 82 | for ip in arr: 83 | __q.put(ip) 84 | for i in range(self._t): 85 | __t.append(threading.Thread(target = func, args = (__q, ))) 86 | for i in range(self._t): 87 | __t[i].setDaemon(True) 88 | __t[i].start() 89 | for i in range(self._t): 90 | __t[i].join(timeout = 10) 91 | def checkPort(self, host, port): 92 | try: 93 | _s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 94 | _s.settimeout(3) 95 | _s.connect((host, int(port))) 96 | _s.close() 97 | return True 98 | except: 99 | return False 100 | def checkProxy(self, h, p): 101 | _p = "http://%s:%s"%(h, p) 102 | _h = urllib2.ProxyHandler({'http': _p}) 103 | _o = urllib2.build_opener(_h, urllib2.HTTPHandler) 104 | try: 105 | _r = _o.open('http://www.baidu.com/img/baidu_jgylogo3.gif', timeout = 5) 106 | _l = len(_r.read()) 107 | if _l == 705: 108 | return True 109 | return False 110 | except Exception,e: 111 | return False 112 | def result(self): 113 | if len(self._r) > 0: 114 | cui.i('Scan result:') 115 | for _r in self._r: 116 | print "\t%s:%s"%(_r, self._p) 117 | if self._s != '': 118 | _f = open(self._s, 'a') 119 | for _r in self._r: 120 | _f.write('%s:%s\n'%(_r, self._p)) 121 | _f.close() 122 | cui.s('Save as (%s)'%self._s) 123 | else: 124 | cui.i('Not result!') 125 | exit(0) 126 | def banner(self): 127 | return '''\ 128 | ______ _____ 129 | | ___ \ / ___| 130 | | |_/ / __ _____ ___ _\ `--. ___ __ _ _ __ _ __ ___ _ __ 131 | | __/ '__/ _ \ \/ / | | |`--. \/ __/ _` | '_ \| '_ \ / _ \ '__| 132 | | | | | | (_) > <| |_| /\__/ / (_| (_| | | | | | | | __/ | 133 | \_| |_| \___/_/\_\\\\__, \____/ \___\__,_|_| |_|_| |_|\___|_| 134 | __/ | 135 | |___/ ''' 136 | def usage(self): 137 | cor.p(self.banner(), cor.RED) 138 | cor.p('PS 1.0 (Proxy Scanner)', cor.GREEN) 139 | cor.p('\tAuthor: Holger', cor.YELLOW) 140 | cor.p('\tModify: 2014/11/27', cor.YELLOW) 141 | cor.p('\tGitHub: https://github.com/h01/ProxyScanner', cor.YELLOW) 142 | cor.p('\tMyBlog: http://ursb.org', cor.YELLOW) 143 | cor.p('\tVersion: 1.0', cor.RED) 144 | cor.p('Usage: ./ps [args] [value]', cor.GREEN) 145 | cor.p('Args: ', cor.PURPLE) 146 | cor.p('\t-v --version\t\tPS version') 147 | cor.p('\t-h --help\t\tHelp menu') 148 | cor.p('\t-i --ips\t\tIPS: 192.168.1.1-192.168.1.100') 149 | cor.p('\t-p --port\t\tProxy port (default:8080)') 150 | cor.p('\t-t --thread\t\tScan thread (default:10)') 151 | cor.p('\t-s --save\t\tSave scan result') 152 | exit(0) 153 | def version(self): 154 | cui.i('ProxyScanner version 1.0') 155 | exit(0) -------------------------------------------------------------------------------- /libs/genips.py: -------------------------------------------------------------------------------- 1 | #-*- coding:utf-8 -*- 2 | ''' 3 | @name GenIPS 4 | @modify 2014/11/27 5 | @author Holger 6 | @github https://github.com/h01/ProxyScanner 7 | @myblog http://ursb.org 8 | ''' 9 | class genips: 10 | def i2n(self, i): 11 | ''' ip to number ''' 12 | ip = [int(x) for x in i.split('.')] 13 | return ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3] 14 | 15 | def n2i(self, n): 16 | ''' number to ip ''' 17 | return '%s.%s.%s.%s'%( 18 | (n & 0xff000000) >> 24, 19 | (n & 0x00ff0000) >> 16, 20 | (n & 0x0000ff00) >> 8, 21 | n & 0x000000ff 22 | ) 23 | 24 | def gen(self, s, e): 25 | ''' genIPS:s=startIP(192.168.1.1);e=endIP(192.168.1.255) ''' 26 | return [self.n2i(n) for n in range(self.i2n(s), self.i2n(e) + 1) if n & 0xff] -------------------------------------------------------------------------------- /libs/pycui.py: -------------------------------------------------------------------------------- 1 | #-*- coding:utf-8 -*- 2 | ''' 3 | @name Python console color-output ui (PycUI) 4 | @blog https://ursb.org 5 | @github https://github.com/h01/pycui 6 | @update 2014/10/29 7 | @author Holger 8 | @version 1.0 9 | ''' 10 | from os import name 11 | 12 | class color: 13 | def __init__(self): 14 | if name == "nt": 15 | # Windows 16 | self.RED = 0x04 17 | self.GREY = 0x08 18 | self.BLUE = 0x01 19 | self.CYAN = 0x03 20 | self.BLACK = 0x0 21 | self.GREEN = 0x02 22 | self.WHITE = 0x07 23 | self.PURPLE = 0x05 24 | self.YELLOW = 0x06 25 | from ctypes import windll 26 | def s(c, h = windll.kernel32.GetStdHandle(-11)): 27 | return windll.kernel32.SetConsoleTextAttribute(h, c) 28 | def p(m, c = self.BLACK, e = True): 29 | s(c | c | c) 30 | if e: 31 | print m 32 | else: 33 | print m, 34 | s(self.RED | self.GREEN | self.BLUE) 35 | else: 36 | # Other system(unix) 37 | self.RED = '\033[31m' 38 | self.GREY = '\033[38m' 39 | self.BLUE = '\033[34m' 40 | self.CYAN = '\033[36m' 41 | self.BLACK = '\033[0m' 42 | self.GREEN = '\033[32m' 43 | self.WHITE = '\033[37m' 44 | self.PURPLE = '\033[35m' 45 | self.YELLOW = '\033[33m' 46 | def p(m, c = self.BLACK, e = True): 47 | if e: 48 | print "%s%s%s"%(c, m, self.BLACK) 49 | else: 50 | print "%s%s%s"%(c, m, self.BLACK), 51 | self.p = p 52 | 53 | class pycui: 54 | def __init__(self): 55 | self.c = color() 56 | def warning(self, m): 57 | self.c.p("[-] %s"%m, self.c.PURPLE) 58 | def info(self, m): 59 | self.c.p("[i] %s"%m, self.c.YELLOW) 60 | def error(self, m): 61 | self.c.p("[!] %s"%m, self.c.RED) 62 | def success(self, m): 63 | self.c.p("[*] %s"%m, self.c.GREEN) 64 | # short-func 65 | def w(self, m): 66 | self.warning(m) 67 | def i(self, m): 68 | self.info(m) 69 | def e(self, m): 70 | self.error(m) 71 | def s(self, m): 72 | self.success(m) 73 | -------------------------------------------------------------------------------- /ps.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #-*- coding:utf-8 -*- 3 | ''' 4 | @name ProxyScanner 5 | @modify 2014/11/27 6 | @author Holger 7 | @github https://github.com/h01/ProxyScanner 8 | @myblog http://ursb.org 9 | ''' 10 | from libs.base import base 11 | import getopt, sys 12 | 13 | if __name__ == '__main__': 14 | base = base() 15 | try: 16 | opts, args = getopt.getopt(sys.argv[1:], 'vhi:p:t:s:', ['version', 'help', 'ips=', 'port=', 'thread=', 'save=']) 17 | base.run(opts) 18 | except Exception,e: 19 | base.usage() --------------------------------------------------------------------------------