Merge remote-tracking branch 'origin/master' into master

This commit is contained in:
JrD
2020-08-17 15:31:56 +08:00
2 changed files with 51 additions and 44 deletions
+40 -38
View File
@@ -13,11 +13,13 @@ from config import settings
def get_limit_conn(): def get_limit_conn():
limit_open_conn = settings.limit_open_conn count = settings.limit_open_conn
if isinstance(limit_open_conn, int): if isinstance(count, int):
return max(32, limit_open_conn) count = max(16, count)
else: else:
return utils.get_coroutine_num() count = utils.get_coroutine_count()
logger.log('DEBUG', f'Request coroutine {count}')
return count
def get_ports(port): def get_ports(port):
@@ -79,7 +81,7 @@ async def fetch(session, method, url):
:return: 响应对象和响应文本 :return: 响应对象和响应文本
""" """
timeout = aiohttp.ClientTimeout(total=None, timeout = aiohttp.ClientTimeout(total=None,
connect=None, connect=5.0,
sock_read=settings.sockread_timeout, sock_read=settings.sockread_timeout,
sock_connect=settings.sockconn_timeout) sock_connect=settings.sockconn_timeout)
try: try:
@@ -180,10 +182,10 @@ def request_callback(future, index, datas):
def get_connector(): def get_connector():
limit_open_conn = get_limit_conn() count = get_limit_conn()
return aiohttp.TCPConnector(ttl_dns_cache=300, return aiohttp.TCPConnector(ttl_dns_cache=300,
ssl=settings.verify_ssl, ssl=settings.verify_ssl,
limit=limit_open_conn, limit=count,
limit_per_host=settings.limit_per_host) limit_per_host=settings.limit_per_host)
@@ -191,19 +193,20 @@ async def async_request(urls):
results = list() results = list()
connector = get_connector() connector = get_connector()
headers = utils.get_random_header() headers = utils.get_random_header()
async with ClientSession(connector=connector, headers=headers) as session: session = ClientSession(connector=connector, headers=headers)
tasks = [] tasks = []
for i, url in enumerate(urls): for i, url in enumerate(urls):
task = asyncio.ensure_future(fetch(session, 'GET', url)) task = asyncio.ensure_future(fetch(session, 'GET', url))
tasks.append(task) tasks.append(task)
if tasks: if tasks:
futures = asyncio.as_completed(tasks) futures = asyncio.as_completed(tasks)
for future in tqdm.tqdm(futures, for future in tqdm.tqdm(futures,
total=len(tasks), total=len(tasks),
desc='Request Progress', desc='Request Progress',
ncols=80): ncols=80):
result = await future result = await future
results.append(result) results.append(result)
await session.close()
return results return results
@@ -216,24 +219,23 @@ async def bulk_request(data, port):
logger.log('INFOR', 'Async subdomains request in progress') logger.log('INFOR', 'Async subdomains request in progress')
connector = get_connector() connector = get_connector()
headers = utils.get_random_header() headers = utils.get_random_header()
async with ClientSession(connector=connector, headers=headers) as session: session = ClientSession(connector=connector, headers=headers)
tasks = [] tasks = []
for num, data in enumerate(to_req_data): for num, data in enumerate(to_req_data):
url = data.get('url') url = data.get('url')
task = asyncio.create_task(fetch(session, method, url)) task = asyncio.ensure_future(fetch(session, method, url))
task.set_name(f'RequestTask-{num}') task.add_done_callback(functools.partial(request_callback,
# logger.log('TRACE', f'RequestTask-{num} {url}') index=num,
task.add_done_callback(functools.partial(request_callback, datas=to_req_data))
index=num, tasks.append(task)
datas=to_req_data)) if tasks:
tasks.append(task) futures = asyncio.as_completed(tasks, timeout=1*60)
if tasks: for future in tqdm.tqdm(futures,
futures = asyncio.as_completed(tasks) total=len(tasks),
for future in tqdm.tqdm(futures, desc='Request Progress',
total=len(tasks), ncols=80):
desc='Request Progress', await future
ncols=80): await session.close()
await future
return to_req_data + no_req_data return to_req_data + no_req_data
+11 -6
View File
@@ -488,19 +488,24 @@ def get_process_num():
return 1 return 1
def get_coroutine_num(): def get_coroutine_count():
"""
根据内存大小获取并发数量
"""
mem = psutil.virtual_memory() mem = psutil.virtual_memory()
total_mem = mem.total total_mem = mem.total
g_size = 1024 * 1024 * 1024 g_size = 1024 * 1024 * 1024
if total_mem <= 1 * g_size: if total_mem < 1 * g_size:
return 16
elif total_mem < 2 * g_size:
return 32 return 32
elif total_mem <= 2 * g_size: elif total_mem < 4 * g_size:
return 64 return 64
elif total_mem <= 4 * g_size: elif total_mem < 8 * g_size:
return 128 return 128
elif total_mem <= 8 * g_size: elif total_mem < 16 * g_size:
return 256 return 256
elif total_mem <= 16 * g_size: elif total_mem < 32 * g_size:
return 512 return 512
else: else:
return 1024 return 1024