pyCheckProxy – прокси чекер на Python

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by H1Z, 8 Dec 2009.

  1. H1Z

    H1Z Elder - Старейшина

    Joined:
    23 Mar 2007
    Messages:
    103
    Likes Received:
    61
    Reputations:
    6
    Версия: 0.1.
    Автор: h1z.
    WWW: http://www.mr-h1z.com.

    Возможности:
    • Данный скрипт может проверять прокси из файлов и из списков URL’ов.
    • Скрипт является многопоточным.
    • Пока только поддерживается проверка HTTP-прокси.
    • Скрипт сам извлекает прокси из файлов, т.е. файл может содержать мусор.
    Описание опций:
    • -f или --file – задаёт расположение файла со списком прокси или списком URL’ов. По умолчанию, если не задать данную опцию скрипт попытается обратится к файлу ./proxy.txt в данной директории.
    • -t или --timeout – задаёт тайм аут для сокета. По умолчанию, равен 80.
    • -c или --count – количество потоков. По умолчанию, количество равно 10.
    • -u или --urls – опция которая указывает скрипту что в файле содержатся URL’ы. По умолчанию, опция выключена
    • -o или --out – задаёт расположение файла, куда будет выводится список рабочих прокси. По умолчанию, результат выводится на экран.
    Скачать pyCheckProxy.
    Для работы скрипта требуется Python 2.4-2.6.

    Пример запуска:
    Планы на будущие:
    • Добавить GUI на PyQt4.
    • Поддержка SOCKS-прокси и проверка на анонимность.
    Исходный код:
    Code:
    #!/usr/bin/env python
    #pyCheckProxy by h1z
    #version: 0.1
    
    import urllib2, socket, re, threading, sys, getopt
    
    _file="proxy.txt"
    _threads=10
    _urls=False
    _out=""
    _file_out=0
    _timeout=80
    proxyList=[]
    
    class Proxy:
        def __init__(self, time_out=80, check_url="http://www.google.com", inside_text="<title>Google</title>"):
            self._sock=socket
            self._sock.setdefaulttimeout(time_out)
            self._check_url=check_url
            self._inside_text=inside_text
            self._proxy_buf=[]
            self._proxy_list=[]
            self._thread_count=0
    
        def check(self, proxy):
            try:
                proxy_handler = urllib2.ProxyHandler({'http': proxy})
                opener = urllib2.build_opener(proxy_handler)
    
                opener.addheaders = [('User-agent', 'Mozilla/5.0')]
                urllib2.install_opener(opener)
                req=urllib2.Request(self._check_url)
                self._sock=urllib2.urlopen(req)
                if (self._sock.read().index(self._inside_text))>=0:
                    return True
            except:
                return False
            return True
    
        def check_all(self, proxy_list=[], thread_count=10):
            if type([])==type(proxy_list) and len(proxy_list)>0:
                self._proxy_list=[]
                self._proxy_buf=proxy_list
                self._thread_count=thread_count
                for i in range(thread_count):
                    thr=threading.Thread(target=self._thread_check, name=str(i))
                    thr.start();
                while (self._thread_count>0):
                    pass
                return self._proxy_list
    
        def _thread_check(self):
            while (len(self._proxy_buf)>0):
                try:
                    item=self._proxy_buf.pop()
                    if self.check(item):
                        self._proxy_list.append(item)
                except:
                    pass
            self._thread_count-=1
    
    def _usage():
        print """(c) h1z, http://www.mr-h1z.com
    Usage:
     ./check.py [options]
    Options:
     --file - path to file[default: proxy.txt]
     --count - count of threads[default: 10]
     --urls - file inside urls[default: false]
     --out - file to output[default: stdout]
     --timeout - set timeout[default: 80]"""
        sys.exit(1)
    
    def _add_to_list(text):
        global proxyList
        for _tmp in text:
            try:
                while True:
                    buf=re.search("([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5})", _tmp)
                    try:
                        proxyList.index(proxyList)
                    except ValueError:
                        proxyList.append(buf.group(0))
                    _tmp=_tmp[len(buf.group(0)):]
            except:
                pass
    
    try:
        opts, args=getopt.getopt(sys.argv[1:], "uf:c:o:t:", ["urls","file=","count=","out=","timeout="])
    except getopt.GetoptError:
        _usage()
    for opt, arg in opts:
        if opt in ("-f","--file"):
            _file=arg
        elif opt in ("-u","--urls"):
            _urls=True
        elif opt in ("-c","--count"):
            _threads=int(arg)
        elif opt in ("-o","--out"):
            _out=arg
        elif opt in ("-t","--timeout"):
            _timeout=int(arg)
    try:
        f=open(_file,'r')
    except IOError:
        print "Error. File './%s' not found!" % (_file)
        sys.exit(1)
    pr_list=f.readlines()
    f.close()
    if _urls==False:
        _add_to_list(pr_list)
    else:
        for url in pr_list:
            try:
                _sock=socket
                _sock=urllib2.urlopen(urllib2.Request(url))
                _add_to_list(_sock.read().split('\n'))
            except:
                pass
    p_check=Proxy(time_out=_timeout)
    if len(_out)>1:
        _file_out=open(_out,'w')
    if _threads>len(proxyList):
        _threads=len(proxyList)
    for i in p_check.check_all(proxyList,_threads):
        if len(_out)>1:
            _file_out.write(i)
        else:
            print i
    if len(_out)>1:
        _file_out.close()
    
    Если скрипт чекает очень медленно, то попробуйте задать таймаут 20-40:
     
    1 person likes this.
  2. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Немного трэдом ошибся, тут компилируемые языки )
     
  3. H1Z

    H1Z Elder - Старейшина

    Joined:
    23 Mar 2007
    Messages:
    103
    Likes Received:
    61
    Reputations:
    6
    О_о и правда, просьба модераторов перенести в другой раздел.