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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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小时执行一次同步操作