import requests
|
import random
|
import asyncio
|
import aiohttp
|
from bs4 import BeautifulSoup
|
from auto_media_publisher.config.conf_base import PUBLIC_IP_CITY_URL,DEFAULT_USER_AGENT
|
|
|
def check_proxy_valid(proxy=None):
|
if proxy:
|
ip, city = get_public_ip_info(proxy)
|
else:
|
ip, city = get_public_ip_info()
|
return ip is not None,ip,city
|
|
def get_public_ip_info(proxy=None):
|
if isinstance(proxy, str) and proxy.strip().lower().startswith(('http://', 'https://')):
|
proxies = {"http": proxy, "https": proxy}
|
else:
|
proxies = None
|
print(f"checking proxy... {proxy}")
|
try:
|
url = random.choice(PUBLIC_IP_CITY_URL)
|
response = requests.get(url, proxies=proxies, timeout=5)
|
response.raise_for_status()
|
data = response.json()
|
|
# 不同服务字段不同
|
ip=None
|
city=None
|
if "query" in data: # ip-api 风格
|
ip = data["query"]
|
elif "ip" in data: # ip-api 风格
|
ip = data["ip"]
|
if "city" in data:
|
city = data["city"]
|
|
return ip, city
|
|
except Exception as e:
|
print("[get_public_ip_info] 请求失败:", e)
|
return None,None
|
|
async def get_free_valid_proxies(protocol='http',count = 50):
|
tasks = [
|
_get_free_valid_proxies_scdn(protocol,count),
|
_get_free_valid_proxies_proxyhub(),
|
_get_free_valid_proxies_proxy5(),
|
_get_free_valid_proxies_proxy_list(),
|
_get_free_valid_proxies_proxy_kuaidaili_intr(),
|
_get_free_valid_proxies_proxy_kuaidaili_inha(),
|
_get_free_valid_proxies_proxy_kuaidaili_dps(),
|
_get_free_valid_proxies_proxy_kuaidaili_89ip()
|
]
|
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
all_proxies = []
|
for result in results:
|
if isinstance(result, Exception):
|
print("一个源出错:", result)
|
continue
|
if result is not None:
|
all_proxies.extend(result)
|
|
return all_proxies
|
|
|
async def _test_proxy(session, proxy_raw):
|
proxy = f"http://{proxy_raw}"
|
|
test_url = random.choice(PUBLIC_IP_CITY_URL)
|
|
try:
|
async with session.get(test_url, proxy=proxy, timeout=5) as response:
|
if response.status != 200:
|
return None
|
data = await response.json()
|
city = data.get("city")
|
return proxy_raw
|
except Exception as e:
|
print(f"❌ {proxy_raw} 无效: {e}")
|
return None
|
|
async def _get_free_valid_proxies_scdn(protocol='http',count = 50):
|
try:
|
url = 'https://proxy.scdn.io/api/get_proxy.php'
|
params = {
|
'protocol': protocol,
|
'count': count
|
}
|
response = requests.get(url, params=params)
|
response.raise_for_status()
|
data = response.json()
|
valid_proxies = []
|
if data and data['code']==200:
|
proxies_raw = data['data']['proxies']
|
async with aiohttp.ClientSession() as session:
|
tasks = [_test_proxy(session, p) for p in proxies_raw]
|
results = await asyncio.gather(*tasks)
|
# 筛选有效结果
|
valid_proxies = [r for r in results if r is not None]
|
return valid_proxies
|
return ["14.29.47.90:3128"]
|
except:
|
return ["14.29.47.90:3128"]
|
|
async def _get_free_valid_proxies_proxyhub():
|
return await _get_free_valid_proxies_("https://proxyhub.me/zh/cn-http-proxy-list.html")
|
|
async def _get_free_valid_proxies_proxy5():
|
return await _get_free_valid_proxies_("https://proxy5.net/cn/free-proxy/china")
|
|
async def _get_free_valid_proxies_proxy_list():
|
return await _get_free_valid_proxies_("https://free-proxy-list.net/zh-cn/")
|
|
async def _get_free_valid_proxies_proxy_kuaidaili_intr():
|
return await _get_free_valid_proxies_("https://www.kuaidaili.com/free/intr/")
|
|
async def _get_free_valid_proxies_proxy_kuaidaili_inha():
|
return await _get_free_valid_proxies_("https://www.kuaidaili.com/free/inha/")
|
|
async def _get_free_valid_proxies_proxy_kuaidaili_dps():
|
return await _get_free_valid_proxies_("https://www.kuaidaili.com/free/dps/")
|
|
async def _get_free_valid_proxies_proxy_kuaidaili_89ip():
|
return await _get_free_valid_proxies_("https://www.89ip.cn/")
|
|
|
async def _get_free_valid_proxies_(url):
|
try:
|
headers = {"User-Agent": DEFAULT_USER_AGENT}
|
response = requests.get(url, headers=headers)
|
response.raise_for_status()
|
soup = BeautifulSoup(response.text, "html.parser")
|
proxy_list = []
|
tbody = soup.find("tbody")
|
if tbody:
|
rows = tbody.find_all("tr")
|
for tr in rows:
|
tds = tr.find_all("td")
|
if len(tds) >= 2:
|
ip = tds[0].get_text(strip=True)
|
port = tds[1].get_text(strip=True)
|
proxy = f"{ip}:{port}"
|
proxy_list.append(proxy)
|
if len(proxy_list) > 0:
|
async with aiohttp.ClientSession() as session:
|
tasks = [_test_proxy(session, p) for p in proxy_list]
|
results = await asyncio.gather(*tasks)
|
valid_proxies = [r for r in results if r is not None]
|
return valid_proxies
|
return None
|
except:
|
return None
|