|
|
|
@ -1,45 +1,21 @@
|
|
|
|
|
import requests
|
|
|
|
|
import re
|
|
|
|
|
import os
|
|
|
|
|
import time
|
|
|
|
|
import shutil
|
|
|
|
|
from requests.auth import HTTPProxyAuth
|
|
|
|
|
import socks
|
|
|
|
|
import socket
|
|
|
|
|
import time
|
|
|
|
|
from requests.adapters import HTTPAdapter
|
|
|
|
|
from urllib3.util.retry import Retry
|
|
|
|
|
|
|
|
|
|
# 配置
|
|
|
|
|
url = "https://unpkg.com/"
|
|
|
|
|
headers = {'Accept-Language': 'zh-CN,zh;q=0.8',
|
|
|
|
|
url = "https://unpkg.ovofish.com/"
|
|
|
|
|
headers = {
|
|
|
|
|
'Accept-Language': 'zh-CN,zh;q=0.8',
|
|
|
|
|
'Content-Type': 'text/html; Charset=utf-8',
|
|
|
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 如果没有额外参数则输入
|
|
|
|
|
if not 'mod' in locals().keys():
|
|
|
|
|
# 输入模块名
|
|
|
|
|
mod = input("请输入模块名:")
|
|
|
|
|
if not 'version' in locals().keys():
|
|
|
|
|
version = input("请输入版本号:")
|
|
|
|
|
|
|
|
|
|
use_proxy = input("是否使用代理?(输入 'y' 或 'n'): ").lower()
|
|
|
|
|
proxies = None # 初始化代理
|
|
|
|
|
|
|
|
|
|
if use_proxy == 'y':
|
|
|
|
|
# 获取代理设置
|
|
|
|
|
default_proxy_host = "10.10.50.114" # 设置默认代理主机
|
|
|
|
|
default_proxy_port = 65115 # 设置默认代理端口
|
|
|
|
|
|
|
|
|
|
proxy_host = input(f"请输入代理主机 (默认为 {default_proxy_host}): ") or default_proxy_host
|
|
|
|
|
proxy_port = int(input(f"请输入代理端口 (默认为 {default_proxy_port}): ") or default_proxy_port)
|
|
|
|
|
proxy_username = input("请输入代理用户名(如果不需要身份验证,直接回车): ")
|
|
|
|
|
proxy_password = input("请输入代理密码(如果不需要身份验证,直接回车): ")
|
|
|
|
|
|
|
|
|
|
# 设置 SOCKS5 代理
|
|
|
|
|
socks.set_default_proxy(socks.SOCKS5, proxy_host, proxy_port, True, proxy_username, proxy_password)
|
|
|
|
|
socket.socket = socks.socksocket
|
|
|
|
|
|
|
|
|
|
proxies = {'http': 'socks5://{}:{}'.format(proxy_host, proxy_port), 'https': 'socks5://{}:{}'.format(proxy_host, proxy_port)}
|
|
|
|
|
|
|
|
|
|
# 设置重试机制
|
|
|
|
|
def requests_retry_session(
|
|
|
|
@ -47,6 +23,7 @@ def requests_retry_session(
|
|
|
|
|
backoff_factor=0.3,
|
|
|
|
|
status_forcelist=(500, 502, 504),
|
|
|
|
|
session=None,
|
|
|
|
|
proxies=None
|
|
|
|
|
):
|
|
|
|
|
session = session or requests.Session()
|
|
|
|
|
retry = Retry(
|
|
|
|
@ -59,12 +36,14 @@ def requests_retry_session(
|
|
|
|
|
adapter = HTTPAdapter(max_retries=retry)
|
|
|
|
|
session.mount('http://', adapter)
|
|
|
|
|
session.mount('https://', adapter)
|
|
|
|
|
if proxies:
|
|
|
|
|
session.proxies.update(proxies)
|
|
|
|
|
return session
|
|
|
|
|
|
|
|
|
|
# 获取HTML
|
|
|
|
|
def getHTML(url, encoding='utf-8'):
|
|
|
|
|
def getHTML(url, encoding='utf-8', proxies=None):
|
|
|
|
|
try:
|
|
|
|
|
with requests_retry_session().get(url, params=None, headers=headers, proxies=proxies) as rd:
|
|
|
|
|
with requests_retry_session(proxies=proxies).get(url, headers=headers) as rd:
|
|
|
|
|
rd.encoding = encoding
|
|
|
|
|
rd.raise_for_status()
|
|
|
|
|
return rd.text
|
|
|
|
@ -73,16 +52,16 @@ def getHTML(url, encoding='utf-8'):
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
# 获取版本
|
|
|
|
|
def getVsions(m):
|
|
|
|
|
h = getHTML(url + m + '/')
|
|
|
|
|
def getVsions(m, proxies=None):
|
|
|
|
|
h = getHTML(url + m + '/', proxies=proxies)
|
|
|
|
|
j = re.findall(r'<select name="version"(.*?)</select>', h, re.S)[0]
|
|
|
|
|
patt = re.compile(r'<option.+?>(.+?)</option>')
|
|
|
|
|
option = patt.findall(j)
|
|
|
|
|
return option
|
|
|
|
|
|
|
|
|
|
# 扫描目录
|
|
|
|
|
def getPaths(v, p='/', files=[], folders=[]):
|
|
|
|
|
h = getHTML(url + v + p)
|
|
|
|
|
def getPaths(v, p='/', files=[], folders=[], proxies=None):
|
|
|
|
|
h = getHTML(url + v + p, proxies=proxies)
|
|
|
|
|
t = re.findall(r'<table(.*?)</table>', h, re.S)[0]
|
|
|
|
|
href = re.findall('href="(.*?)"', t)
|
|
|
|
|
for name in href:
|
|
|
|
@ -93,7 +72,7 @@ def getPaths(v, p='/', files=[], folders=[]):
|
|
|
|
|
print(path)
|
|
|
|
|
if name[-1] == '/':
|
|
|
|
|
folders.append(path)
|
|
|
|
|
getPaths(v, path, files, folders)
|
|
|
|
|
getPaths(v, path, files, folders, proxies)
|
|
|
|
|
else:
|
|
|
|
|
files.append(path)
|
|
|
|
|
return {"files": files, "folders": folders}
|
|
|
|
@ -109,31 +88,58 @@ def makeDirs(dirs, p):
|
|
|
|
|
os.makedirs(path)
|
|
|
|
|
|
|
|
|
|
# 下载文件
|
|
|
|
|
def download(url, path=None):
|
|
|
|
|
def download(url, path=None, proxies=None):
|
|
|
|
|
try:
|
|
|
|
|
with requests_retry_session().get(url, proxies=proxies) as r:
|
|
|
|
|
with requests_retry_session(proxies=proxies).get(url, proxies=proxies) as r:
|
|
|
|
|
r.raise_for_status()
|
|
|
|
|
if not os.path.exists(path):
|
|
|
|
|
print("下载:", url)
|
|
|
|
|
t = str(time.time()) + '.' + str(os.getpid()) + '.tmp'
|
|
|
|
|
open(t, 'wb').write(r.content)
|
|
|
|
|
shutil.move(t, path)
|
|
|
|
|
with open(t, 'wb') as tmp_file:
|
|
|
|
|
tmp_file.write(r.content)
|
|
|
|
|
os.rename(t, path)
|
|
|
|
|
else:
|
|
|
|
|
print("文件已存在")
|
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
|
|
print(f"下载文件时发生错误: {e}")
|
|
|
|
|
|
|
|
|
|
# 其余的代码(getVsions, getPaths, makeDirs, 等等)
|
|
|
|
|
|
|
|
|
|
pid = os.getpid()
|
|
|
|
|
print(url + mod + '/')
|
|
|
|
|
# 获取所有版本并展示
|
|
|
|
|
versions = getVsions(mod)
|
|
|
|
|
print("所有版本:", versions)
|
|
|
|
|
version = mod + '@' + versions[-1]
|
|
|
|
|
print("默认版本:", version)
|
|
|
|
|
paths = getPaths(version)
|
|
|
|
|
makeDirs(paths["folders"], version)
|
|
|
|
|
|
|
|
|
|
# 选择版本
|
|
|
|
|
version = input("请输入版本号(留空使用最新版):") or versions[-1]
|
|
|
|
|
print("选择的版本:", version)
|
|
|
|
|
|
|
|
|
|
# 构建版本路径
|
|
|
|
|
version_path = mod + '@' + version
|
|
|
|
|
|
|
|
|
|
# 检查当前目录是否存在该版本
|
|
|
|
|
if os.path.exists(version_path):
|
|
|
|
|
print(f"版本 {version_path} 已存在,不再下载。")
|
|
|
|
|
else:
|
|
|
|
|
# 使用代理
|
|
|
|
|
proxies = None
|
|
|
|
|
use_proxy = input("是否使用代理?(输入 'y' 或 'n'): ").lower()
|
|
|
|
|
if use_proxy == 'y':
|
|
|
|
|
# 获取代理设置
|
|
|
|
|
default_proxy_host = "10.10.50.210" # 设置默认代理主机
|
|
|
|
|
default_proxy_port = 65115 # 设置默认代理端口
|
|
|
|
|
|
|
|
|
|
proxy_host = input(f"请输入代理主机 (默认为 {default_proxy_host}): ") or default_proxy_host
|
|
|
|
|
proxy_port = int(input(f"请输入代理端口 (默认为 {default_proxy_port}): ") or default_proxy_port)
|
|
|
|
|
proxy_username = input("请输入代理用户名(如果不需要身份验证,直接回车): ")
|
|
|
|
|
proxy_password = input("请输入代理密码(如果不需要身份验证,直接回车): ")
|
|
|
|
|
|
|
|
|
|
# 设置代理
|
|
|
|
|
proxies = {
|
|
|
|
|
'http': f'socks5://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}' if proxy_username else f'socks5://{proxy_host}:{proxy_port}',
|
|
|
|
|
'https': f'socks5://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}' if proxy_username else f'socks5://{proxy_host}:{proxy_port}'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
paths = getPaths(version_path, proxies=proxies)
|
|
|
|
|
makeDirs(paths["folders"], version_path)
|
|
|
|
|
for i in paths["files"]:
|
|
|
|
|
u = url + version + i
|
|
|
|
|
download(u, version + '/' + i)
|
|
|
|
|
print("完成")
|
|
|
|
|
u = url + version_path + i
|
|
|
|
|
download(u, version_path + '/' + i, proxies)
|
|
|
|
|
print("下载完成")
|