PDA

Просмотр полной версии : pyCheckProxy – прокси чекер на Python


H1Z
08.12.2009, 17:12
Версия: 0.1.
Автор: h1z.
WWW: http://www.mr-h1z.com (http://www.mr-h1z.com/coding/python/pycheckproxy-%D0%BF%D1%80%D0%BE%D0%BA%D1%81%D0%B8-%D1%87%D0%B5%D0%BA%D0%B5%D1%80-%D0%BD%D0%B0-python).

Возможности:
Данный скрипт может проверять прокси из файлов и из списков URL’ов.
Скрипт является многопоточным.
Пока только поддерживается проверка HTTP-прокси.
Скрипт сам извлекает прокси из файлов, т.е. файл может содержать мусор.

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

Скачать pyCheckProxy (http://www.mr-h1z.com/uploads/files/check.py.tgz).
Для работы скрипта требуется Python (http://python.org) 2.4-2.6.

Пример запуска:
./check.py --file file.html --count 20 # Проверить прокси из файла file.html, используя 20 потоков
Планы на будущие:
Добавить GUI на PyQt4.
Поддержка SOCKS-прокси и проверка на анонимность.

Исходный код:

#!/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:
./check.py -t 20

razb
08.12.2009, 21:02
Немного трэдом ошибся, тут компилируемые языки )

H1Z
08.12.2009, 21:13
О_о и правда, просьба модераторов перенести в другой раздел.