|
@@ -99,6 +99,7 @@ class BaseProxyPool(BaseServer):
|
|
'end_time': int(items['end_time']),
|
|
'end_time': int(items['end_time']),
|
|
'last_time': int(items['last_time']),
|
|
'last_time': int(items['last_time']),
|
|
'usage': int(items['usage']),
|
|
'usage': int(items['usage']),
|
|
|
|
+ 'pk': int(items.get('pk', 1))
|
|
}
|
|
}
|
|
return proxy
|
|
return proxy
|
|
|
|
|
|
@@ -146,12 +147,18 @@ class BaseProxyPool(BaseServer):
|
|
|
|
|
|
class ProxyPoolServer(BaseProxyPool, threading.Thread):
|
|
class ProxyPoolServer(BaseProxyPool, threading.Thread):
|
|
|
|
|
|
- def __init__(self, name, redis_label, scheme: str):
|
|
|
|
|
|
+ def __init__(self, name, redis_label, scheme):
|
|
|
|
+ """
|
|
|
|
+ 代理池生产管理
|
|
|
|
+
|
|
|
|
+ @param str name: 服务名称
|
|
|
|
+ @param str redis_label: redis 标识前缀
|
|
|
|
+ @param str scheme: 协议类型
|
|
|
|
+ """
|
|
threading.Thread.__init__(self)
|
|
threading.Thread.__init__(self)
|
|
super(ProxyPoolServer, self).__init__(name, redis_label, scheme)
|
|
super(ProxyPoolServer, self).__init__(name, redis_label, scheme)
|
|
-
|
|
|
|
self.label = f'{self.proxy_name}_{self.getName()}'
|
|
self.label = f'{self.proxy_name}_{self.getName()}'
|
|
- self.ports = ['8862', '8863'] if self.scheme == "http" else ['8860', '8861']
|
|
|
|
|
|
+ self.ports = ['8862', '8863'] if self.scheme == 'http' else ['8860', '8861']
|
|
self.load_interval = 60 # 轮询访问vps代理服务的时间间隔
|
|
self.load_interval = 60 # 轮询访问vps代理服务的时间间隔
|
|
|
|
|
|
def remove_failure_proxy(self, proxy_lst):
|
|
def remove_failure_proxy(self, proxy_lst):
|
|
@@ -166,34 +173,35 @@ class ProxyPoolServer(BaseProxyPool, threading.Thread):
|
|
def request_proxy(self):
|
|
def request_proxy(self):
|
|
logger.info(f"[{self.label}]请求vps服务")
|
|
logger.info(f"[{self.label}]请求vps服务")
|
|
proxy_lst = []
|
|
proxy_lst = []
|
|
- try:
|
|
|
|
- url = settings.jy_proxy['socks5']['url']
|
|
|
|
- response = requests.get(url, timeout=10)
|
|
|
|
- for item in response.json():
|
|
|
|
- ports = list(filter(lambda p: p in self.ports, item['ports']))
|
|
|
|
- if not ports:
|
|
|
|
- continue
|
|
|
|
|
|
+ for idx, url in enumerate(settings.jy_proxy['socks5']['url']):
|
|
|
|
+ try:
|
|
|
|
+ response = requests.get(url, timeout=10)
|
|
|
|
+ for item in response.json():
|
|
|
|
+ ports = list(filter(lambda p: p in self.ports, item['ports']))
|
|
|
|
+ if not ports:
|
|
|
|
+ continue
|
|
|
|
+
|
|
|
|
+ ip = decrypt(item['ip'])
|
|
|
|
+ port = int(ports[random.randint(0, len(ports) - 1)])
|
|
|
|
+ start_time = tools.now_ts()
|
|
|
|
+ end_time = item['lifetime']
|
|
|
|
+ if end_time - start_time > 0:
|
|
|
|
+ proxy = {
|
|
|
|
+ 'proxies': {
|
|
|
|
+ 'http': '{}://{}:{}'.format(self.scheme, ip, port),
|
|
|
|
+ 'https': '{}://{}:{}'.format(self.scheme, ip, port)
|
|
|
|
+ },
|
|
|
|
+ 'fingerprint': self.fingerprint(ip=ip, port=port),
|
|
|
|
+ 'start_time': start_time,
|
|
|
|
+ 'end_time': end_time,
|
|
|
|
+ 'last_time': 0,
|
|
|
|
+ 'usage': 0,
|
|
|
|
+ 'pk': idx + 1
|
|
|
|
+ }
|
|
|
|
+ proxy_lst.append(proxy)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ logger.error(f'[{self.label}]vps服务访问异常[{url}],原因:{e.args}')
|
|
|
|
|
|
- ip = decrypt(item['ip'])
|
|
|
|
- port = int(ports[random.randint(0, len(ports) - 1)])
|
|
|
|
- start_time = tools.now_ts()
|
|
|
|
- end_time = item['lifetime']
|
|
|
|
- if end_time - start_time > 0:
|
|
|
|
- proxy = {
|
|
|
|
- 'proxies': {
|
|
|
|
- 'http': '{}://{}:{}'.format(self.scheme, ip, port),
|
|
|
|
- 'https': '{}://{}:{}'.format(self.scheme, ip, port)
|
|
|
|
- },
|
|
|
|
- 'fingerprint': self.fingerprint(ip=ip, port=port),
|
|
|
|
- 'start_time': start_time,
|
|
|
|
- 'end_time': end_time,
|
|
|
|
- 'last_time': 0,
|
|
|
|
- 'usage': 0,
|
|
|
|
- }
|
|
|
|
- proxy_lst.append(proxy)
|
|
|
|
-
|
|
|
|
- except Exception as e:
|
|
|
|
- logger.error(f"[{self.label}]vps服务访问异常,原因:{e.args}")
|
|
|
|
return proxy_lst
|
|
return proxy_lst
|
|
|
|
|
|
def manage_proxy(self, proxy_lst: list, workers=1):
|
|
def manage_proxy(self, proxy_lst: list, workers=1):
|
|
@@ -225,16 +233,19 @@ class ProxyPoolServer(BaseProxyPool, threading.Thread):
|
|
class ProxyPoolClient(BaseProxyPool):
|
|
class ProxyPoolClient(BaseProxyPool):
|
|
|
|
|
|
def __init__(self, name: str, redis_label: str, scheme: str):
|
|
def __init__(self, name: str, redis_label: str, scheme: str):
|
|
|
|
+ """
|
|
|
|
+ 调用代理池
|
|
|
|
+ """
|
|
super(ProxyPoolClient, self).__init__(name, redis_label, scheme)
|
|
super(ProxyPoolClient, self).__init__(name, redis_label, scheme)
|
|
current_process = multiprocessing.current_process()
|
|
current_process = multiprocessing.current_process()
|
|
- sub_label = f'{tools.get_localhost_ip()}:{current_process.pid}'
|
|
|
|
- self.lock_label = f'{redis_label}:{sub_label}'
|
|
|
|
|
|
+ sub_name = f'{tools.get_localhost_ip()}:{current_process.pid}'
|
|
|
|
+ self.lock_label = f'{redis_label}:{sub_name}'
|
|
|
|
|
|
@property
|
|
@property
|
|
def proxy_total(self):
|
|
def proxy_total(self):
|
|
return len(self.get_redis_name_lst())
|
|
return len(self.get_redis_name_lst())
|
|
|
|
|
|
- def get_all_proxy(self):
|
|
|
|
|
|
+ def get_all_proxy(self, pk=None):
|
|
proxy_lst = deque([])
|
|
proxy_lst = deque([])
|
|
for redis_name in self.get_redis_name_lst():
|
|
for redis_name in self.get_redis_name_lst():
|
|
proxy = self.get_proxy(redis_name)
|
|
proxy = self.get_proxy(redis_name)
|
|
@@ -242,40 +253,50 @@ class ProxyPoolClient(BaseProxyPool):
|
|
proxy_lst.append(proxy)
|
|
proxy_lst.append(proxy)
|
|
|
|
|
|
if len(proxy_lst) > 0:
|
|
if len(proxy_lst) > 0:
|
|
- '''按照使用次数大小从低到高(左小右大)排序'''
|
|
|
|
- proxy_lst = deque(sorted(proxy_lst, key=itemgetter('usage')))
|
|
|
|
|
|
+ if pk is not None:
|
|
|
|
+ '''先按照代理类型(pk)过滤,再按照使用次数进行升序排列'''
|
|
|
|
+ special = deque(filter(lambda x: x['pk'] == int(pk), proxy_lst))
|
|
|
|
+ proxy_lst = deque(sorted(special, key=itemgetter('usage')))
|
|
|
|
+ else:
|
|
|
|
+ '''按照使用次数进行升序排列(左小右大)'''
|
|
|
|
+ proxy_lst = deque(sorted(proxy_lst, key=itemgetter('usage')))
|
|
|
|
|
|
return proxy_lst
|
|
return proxy_lst
|
|
|
|
|
|
- def get_proxy_pool(self):
|
|
|
|
- _pool_proxy = []
|
|
|
|
- for proxy in self.get_all_proxy():
|
|
|
|
|
|
+ def get_proxy_pool(self, **kwargs):
|
|
|
|
+ proxy_lst = []
|
|
|
|
+ for proxy in self.get_all_proxy(**kwargs):
|
|
last_time = proxy['last_time']
|
|
last_time = proxy['last_time']
|
|
end_time = proxy['end_time']
|
|
end_time = proxy['end_time']
|
|
expire = end_time - tools.now_ts()
|
|
expire = end_time - tools.now_ts()
|
|
- _pool_proxy.append({
|
|
|
|
|
|
+ proxy_lst.append({
|
|
'proxies': proxy['proxies'],
|
|
'proxies': proxy['proxies'],
|
|
'start_time': tools.ts2dt(proxy['start_time']),
|
|
'start_time': tools.ts2dt(proxy['start_time']),
|
|
'end_time': tools.ts2dt(end_time),
|
|
'end_time': tools.ts2dt(end_time),
|
|
'last_time': tools.ts2dt(last_time) if last_time != 0 else '',
|
|
'last_time': tools.ts2dt(last_time) if last_time != 0 else '',
|
|
'expire': expire,
|
|
'expire': expire,
|
|
'usage': proxy['usage'],
|
|
'usage': proxy['usage'],
|
|
|
|
+ 'pk': proxy.get('pk', 1),
|
|
})
|
|
})
|
|
# 展示时按照过期时间从大到小排列
|
|
# 展示时按照过期时间从大到小排列
|
|
- return list(sorted(_pool_proxy, key=lambda x: x['expire'], reverse=True))
|
|
|
|
|
|
+ return list(sorted(proxy_lst, key=lambda x: x['expire'], reverse=True))
|
|
|
|
|
|
- def get_all_proxy_ip(self, protocol):
|
|
|
|
- return [proxy['proxies']['http'].replace(f'{protocol}://', '') for proxy in self.get_all_proxy()]
|
|
|
|
|
|
+ def get_all_proxy_ip(self, protocol, **kwargs):
|
|
|
|
+ return [
|
|
|
|
+ proxy['proxies']['http'].replace(f'{protocol}://', '')
|
|
|
|
+ for proxy in self.get_all_proxy(**kwargs)
|
|
|
|
+ ]
|
|
|
|
|
|
- def proxies(self):
|
|
|
|
|
|
+ def proxies(self, **kwargs):
|
|
lock = acquire_lock_with_timeout(self.redis_db, self.lock_label)
|
|
lock = acquire_lock_with_timeout(self.redis_db, self.lock_label)
|
|
if lock:
|
|
if lock:
|
|
proxy = {}
|
|
proxy = {}
|
|
if self.proxy_total > 0:
|
|
if self.proxy_total > 0:
|
|
- proxy_lst = self.get_all_proxy()
|
|
|
|
|
|
+ proxy_lst = self.get_all_proxy(**kwargs)
|
|
proxy = proxy_lst.popleft()
|
|
proxy = proxy_lst.popleft()
|
|
name = self.get_redis_name(proxy)
|
|
name = self.get_redis_name(proxy)
|
|
self.redis_db.hset(name, 'usage', proxy['usage'] + 1)
|
|
self.redis_db.hset(name, 'usage', proxy['usage'] + 1)
|
|
self.redis_db.hset(name, 'last_time', tools.now_ts())
|
|
self.redis_db.hset(name, 'last_time', tools.now_ts())
|
|
|
|
+
|
|
release_lock(self.redis_db, self.lock_label, lock)
|
|
release_lock(self.redis_db, self.lock_label, lock)
|
|
return proxy.get('proxies')
|
|
return proxy.get('proxies')
|