zhitou_trade/iptest.py

189 lines
6.3 KiB
Python
Raw Normal View History

2025-05-22 16:47:45 +08:00
import winreg
import ctypes
import re
import sys
import time
import requests
import logging
# 日志配置:同时输出到文件和控制台
logger = logging.getLogger(__name__)
def get_init_ip():
return requests.get('https://checkip.amazonaws.com').text.strip()
def get_proxy_ip(proxy_ip,proxy_port):
"""测试代理ip并返回代理IP的IP值,由于暂时只能使用http连接不支持https连接"""
while True:
try:
url = 'https://checkip.amazonaws.com'
proxyMeta = 'http://45qac9:n2tc94fc@{}:{}'.format(proxy_ip,proxy_port)
proxies = { 'http':proxyMeta,"https": proxyMeta}
return requests.get(url, proxies=proxies).text
except Exception as e:
logger.info(f'出错了{e}')
time.sleep(2)
def set_global_proxy(proxy_ip, proxy_port, enable=True):
"""设置/关闭全局代理"""
key = None
try:
if ctypes.windll.shell32.IsUserAnAdmin() == 0:
logging.error("需要管理员权限来修改系统代理设置")
return False
key = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
0, winreg.KEY_WRITE | winreg.KEY_READ
)
# 备份当前设置
try:
old_proxy = winreg.QueryValueEx(key, "ProxyServer")[0]
old_enable = winreg.QueryValueEx(key, "ProxyEnable")[0]
old_override = winreg.QueryValueEx(key, "ProxyOverride")[0]
except WindowsError:
old_proxy = ""
old_enable = 0
old_override = "<local>"
if enable:
proxy_string = f"{proxy_ip}:{proxy_port}"
winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, proxy_string)
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 1)
bypass = "<local>;" + ";".join(["/api", "/static"])
winreg.SetValueEx(key, "ProxyOverride", 0, winreg.REG_SZ, bypass)
else:
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 0)
# 刷新系统设置
internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
internet_set_option(0, 37, 0, 0) # INTERNET_OPTION_REFRESH
internet_set_option(0, 39, 0, 0) # INTERNET_OPTION_SETTINGS_CHANGED
logging.info("代理设置已" + ("启用" if enable else "关闭"))
if enable:
logging.info(f"代理服务器: {proxy_ip}:{proxy_port}")
return True
except Exception as e:
logging.error(f"设置代理时发生错误: {str(e)}")
if key is not None:
try:
winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, old_proxy)
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, old_enable)
winreg.SetValueEx(key, "ProxyOverride", 0, winreg.REG_SZ, old_override)
logging.info("已恢复原始代理设置")
except:
logging.warning("警告:无法恢复原始代理设置")
return False
finally:
if key:
winreg.CloseKey(key)
def get_ip_data():
"""从API获取代理IP和端口"""
url = "http://api.tianqiip.com/getip"
params = {
"secret": "d8wqfdf0qhrnxgne", # 替换为你的提取秘钥
"num": 1,
"yys": "电信",
"type": "json",
"lb": "\n",
# "region": "1,2,3",
"port": 1,
"time": 5,
"ts": 1,
"ys": 1,
"cs": 1,
"sign": "386ff88188185bc6070ec011266745b3", # 用户签名
"mr": 1
}
response = requests.get(url,params)
if response.status_code == 200:
data = response.json()
if data.get("code") == 1000:
logging.info("获取代理IP成功")
return data.get("data")[0]
def reset_proxy_to_default():
"""恢复系统代理为默认(关闭)"""
key = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
0, winreg.KEY_WRITE
)
try:
winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, 0)
winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, "")
winreg.SetValueEx(key, "ProxyOverride", 0, winreg.REG_SZ, "<local>")
finally:
winreg.CloseKey(key)
internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
internet_set_option(0, 37, 0, 0)
internet_set_option(0, 39, 0, 0)
def is_admin():
"""检查是否以管理员身份运行"""
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
def fetch_whitelist():
"""
获取当前IP白名单返回IP列表
"""
url = "http://api.tianqiip.com/white/fetch?key=Maxinxin&brand=2&sign=386ff88188185bc6070ec011266745b3"
try:
response = requests.get(url, timeout=10)
data = response.json()
if data.get("code") == 200:
# 返回IP列表
return data.get("data")
else:
print(f"获取白名单失败: {data.get('msg', 'Unknown error')}")
return []
except Exception as e:
print(f"请求异常: {e}")
return []
if __name__ == "__main__":
if not is_admin():
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
sys.exit(0)
ip_fetch_count = 0 # 计数器
while True:
ip_fetch_count += 1
start_time = time.time()
reset_proxy_to_default()
my_ip = get_init_ip()
whitelist = fetch_whitelist()
print(whitelist)
if my_ip in whitelist:
logging.info(f"当前IP {my_ip} 在白名单中")
else:
logging.info(f"当前IP {my_ip} 不在白名单中")
print(1)
item = get_ip_data()
proxy_ip = item['ip']
proxy_port = item['port']
set_global_proxy(proxy_ip, proxy_port, enable=True)
try:
my_ip1 = get_proxy_ip(proxy_ip,proxy_port)
logging.info(f"{ip_fetch_count}次获取IP当前IP: {my_ip1}")
except Exception as e:
logging.error(f"{ip_fetch_count}次获取IP失败: {e}")
logging.info(f"本次代理切换耗时: {time.time() - start_time:.2f}")
time.sleep(300)