diff --git a/cleansocks.py b/cleansocks.py
index 28aff33..e95a2cb 100644
--- a/cleansocks.py
+++ b/cleansocks.py
@@ -1,80 +1,133 @@
#!/usr/bin/env python
# CleanSocks - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
-'''
-
-This script will clean a list of proxies by removing duplicates, checking for valid formats (IP:PORT), & testing if the proxies are working
-
-'''
+# This script will clean a list of proxies by removing duplicates, checking for valid formats (IP:PORT), & testing if the proxies are working
+# If a proxy is found working on multiple ports, we will only store the first working port to avoid ip duplication in the clean results.
import argparse
import asyncio
import os
import re
-# Globals
-all = list()
-good = list()
-print_bad = True
+try:
+ import aiosocks
+except ImportError:
+ raise SystemExit('missing pysocks module (https://pypi.org/project/aiosocks/)')
-async def check(semaphore, proxy):
+try:
+ import aiohttp
+except ImportError:
+ raise SystemExit('missing pysocks module (https://pypi.org/project/aiosocks/)')
+
+# Globals
+all = list()
+good = list()
+
+async def check_http_proxy(semaphore: asyncio.Semaphore, proxy: str):
+ '''
+ Checks if a HTTP proxy is working.
+
+ :param semaphore: The semaphore to use.
+ :param proxy: The proxy to check.
+ '''
async with semaphore:
- ip, port = proxy.split(':')
+ proxy_ip = proxy.split(':')[0]
+ async with aiohttp.ClientSession() as session:
+ try:
+ async with session.get('https://google.com', proxy=f'http://{proxy}', timeout=args.timeout) as response:
+ if response.status == 200:
+ print('\033[1;32mGOOD\033[0m \033[30m|\033[0m ' + proxy)
+ if proxy_ip not in all:
+ all.append(proxy_ip)
+ good.append(proxy)
+ else:
+ if args.bad:
+ print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
+ except:
+ if args.bad:
+ print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
+
+async def check_socks_proxy(semaphore: asyncio.Semaphore, proxy: str):
+ '''
+ Checks if a SOCKS proxy is working.
+
+ :param semaphore: The semaphore to use.
+ :param proxy: The proxy to check.
+ '''
+ async with semaphore:
+ proxy_ip, proxy_port = proxy.split(':')
options = {
- 'proxy' : aiosocks.Socks5Addr(proxy.split(':')[0], int(proxy.split(':')[1])),
+ 'proxy' : aiosocks.Socks5Addr(proxy_ip, proxy_port),
'proxy_auth' : None,
- 'dst' : ('www.google.com',80),
+ 'dst' : ('www.google.com', 80),
'limit' : 1024,
'ssl' : None,
'family' : 2
}
try:
- await asyncio.wait_for(aiosocks.open_connection(**options), 15)
+ await asyncio.wait_for(aiosocks.open_connection(**options), args.timeout)
except:
- if print_bad:
+ if args.bad:
print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
else:
print('\033[1;32mGOOD\033[0m \033[30m|\033[0m ' + proxy)
- if ip not in all:
- all.append(ip)
+ if proxy_ip not in all:
+ all.append(proxy_ip)
good.append(proxy)
async def main(targets):
- sema = asyncio.BoundedSemaphore(500)
+ '''
+ Starts the main event loop.
+
+ :param targets: The proxies to check.
+ '''
+ sema = asyncio.BoundedSemaphore(args.threads)
jobs = list()
for target in targets:
- jobs.append(asyncio.ensure_future(check(sema, target)))
+ if args.socks:
+ jobs.append(asyncio.ensure_future(check_socks_proxy(sema, target)))
+ else:
+ jobs.append(asyncio.ensure_future(check_http_proxy(sema, target)))
await asyncio.gather(*jobs)
-# Main
-print('#'*56)
-print('#{0}#'.format(''.center(54)))
-print('#{0}#'.format('CleanSOCKS Proxy Cleaner'.center(54)))
-print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
-print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
-print('#{0}#'.format(''.center(54)))
-print('#'*56)
-parser = argparse.ArgumentParser(usage='%(prog)s