You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.8 KiB

1 year ago
# pip install esdk-obs-python --trusted-host pypi.org
# pip install tqdm
# python.exe -m pip install --upgrade pip
# 引入模块
import os
from datetime import datetime
from obs import ObsClient
import time
import requests
from subprocess import call
import urllib.parse
# 替换为你的华为云AK/SK
ak = "WAFBGJACKDOQZDH1MKZ1"
sk = "dlWTUbqgCICaYJG3n0Rot4jXaen2HnfFtMVxiPEo"
server = "https://obs.cn-north-1.myhuaweicloud.com"
bucketName = "dsideal"
prefix = "HuangHai/HuiZhiKeJi/"
localPath = "D:/课程备份/"
UrlPrefix = "https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/HuiZhiKeJi/"
def getTime():
# 获取当前时间
now = datetime.now()
# 格式化到秒
current_time_to_seconds = now.strftime("%H:%M:%S")
return current_time_to_seconds
def idmDownloader(task_url, folder_path, file_name):
"""
IDM下载器
:param task_url: 下载任务地址
:param folder_path: 存放文件夹
:param file_name: 文件名
:return:
"""
# IDM安装目录
idm_engine = "D:\\IDM\\IDMan.exe"
# 将任务添加至队列
call([idm_engine, '/d', task_url, '/p', folder_path, '/f', file_name, '/a', '/q'])
# 开始任务队列
call([idm_engine, '/s'])
# 执行一次
def solve():
# 创建obsClient实例
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
# 使用访问OBS
max_keys = 1000
mark = None
resp = None
# 创建一个文件列表
# 检查文件是否存在
idm_url_txt = 'idm_url.txt'
if os.path.exists(idm_url_txt):
# 文件存在,先删除它
os.remove(idm_url_txt)
print(f"已删除文件: {idm_url_txt}")
flag = False
while True:
fileList = obsClient.listObjects(bucketName=bucketName, prefix=prefix, max_keys=max_keys, marker=mark)
for file in fileList.body.contents:
fullName = file.key.replace(prefix, "")
array = fullName.split("/")
fileName = array[-1]
dirStr = ''
for i in range(len(array) - 1):
dirStr += array[i] + "/"
if dirStr == '' or fileName == '':
continue
localDirStr = localPath + dirStr
if not os.path.isdir(localDirStr):
os.makedirs(localDirStr, exist_ok=True)
downloadPath = localDirStr + fileName
# 下载对象
resp = obsClient.getObject(bucketName=bucketName, objectKey=file.key)
# 如果已存在,但是,与云存储中文件大小不一样大,那么删除掉
if os.path.isfile(downloadPath):
localFileSize = os.path.getsize(downloadPath)
if file.size != localFileSize:
os.remove(downloadPath)
print(getTime() + " " + "发现文件大小不一致,删除本地文件:" + downloadPath)
if not os.path.isfile(downloadPath):
flag = True
print(
getTime() + " 下载文件:" + fileName + ",文件大小:" + str(
"{:.2f}".format(file.size / 1024 / 1024)) + "MB")
# 发送HTTP GET请求
url_to_encode = dirStr + fileName
encoded_url = urllib.parse.quote(url_to_encode, safe='')
url = "https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/HuiZhiKeJi/" + encoded_url
# 创建一个下载文件列表
with open(idm_url_txt, 'a', encoding='utf-8') as file:
file.write(url + "\n")
else:
print(
getTime() + " 相同的文件:" + fileName + ",文件大小:" + str(
"{:.2f}".format(file.size / 1024 / 1024)) + "MB跳过...")
# 是否已经完成了所有任务
if resp != None and resp.body.is_truncated is True:
mark = resp.body.next_marker
else:
break
# 关闭obsClient
obsClient.close()
if flag:
result = []
with open(idm_url_txt, encoding='utf-8') as f:
for line in f:
result.append(line.strip('\n').split(',')[0])
for i in range(len(result)):
url = result[i] # 取出每次要下载的链接
url = url.replace(prefix, '')
# 获取文件所在的目录
directory = os.path.dirname(localPath + url)
# 获取文件名(包括后缀)
file_name = os.path.basename(localPath + url)
idmDownloader(url, directory, file_name) # 添加进IDM中下载
print(getTime() + " 同步完成")
if __name__ == '__main__':
while True:
solve()
time.sleep(3600 * 2) # 每2小时执行一次同步操作