|
|
# 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
|
|
|
from tqdm import tqdm
|
|
|
import requests
|
|
|
import urllib.parse
|
|
|
|
|
|
# 替换为你的华为云AK/SK
|
|
|
ak = "WAFBGJACKDOQZDH1MKZ1"
|
|
|
sk = "dlWTUbqgCICaYJG3n0Rot4jXaen2HnfFtMVxiPEo"
|
|
|
server = "https://obs.cn-north-1.myhuaweicloud.com"
|
|
|
bucketName = "dsideal"
|
|
|
prefix = "HuangHai/HuiZhiKeJi/"
|
|
|
localPath = "D:/课程备份/"
|
|
|
|
|
|
|
|
|
def getTime():
|
|
|
# 获取当前时间
|
|
|
now = datetime.now()
|
|
|
# 格式化到秒
|
|
|
current_time_to_seconds = now.strftime("%H:%M:%S")
|
|
|
return current_time_to_seconds
|
|
|
|
|
|
|
|
|
# 执行一次
|
|
|
def solve():
|
|
|
# 创建obsClient实例
|
|
|
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
|
|
|
# 使用访问OBS
|
|
|
|
|
|
max_keys = 1000
|
|
|
mark = None
|
|
|
resp = None
|
|
|
|
|
|
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):
|
|
|
print(
|
|
|
getTime() + " 下载文件:" + fileName + ",文件大小:" + str(
|
|
|
"{:.2f}".format(file.size / 1024 / 1024)) + "MB")
|
|
|
|
|
|
# 发送HTTP GET请求
|
|
|
# 对URL进行编码
|
|
|
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
|
|
|
response = requests.get(url, stream=True)
|
|
|
# 获取文件总大小
|
|
|
total_size_in_bytes = int(response.headers.get('content-length', 0))
|
|
|
# 创建一个进度条
|
|
|
progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)
|
|
|
|
|
|
# 定义一个函数来处理数据块
|
|
|
def callback_chunk(chunk):
|
|
|
progress_bar.update(len(chunk))
|
|
|
|
|
|
# 打开一个本地文件用于写入
|
|
|
with open(downloadPath, 'wb') as file:
|
|
|
# 迭代响应内容
|
|
|
for chunk in response.iter_content(chunk_size=1024):
|
|
|
file.write(chunk)
|
|
|
callback_chunk(chunk) # 更新进度条
|
|
|
# 关闭进度条
|
|
|
progress_bar.close()
|
|
|
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()
|
|
|
print(getTime() + " 同步完成")
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
while True:
|
|
|
solve()
|
|
|
time.sleep(3600 * 2) # 每2小时执行一次同步操作
|