当前位置:首页 > python代码 > 正文内容

vivo云服务照片视频批量下载代码~

王铁锹5个月前 (12-18)python代码600

起因,想要从vivo云服务中下载历史上传四五千张照片,结果点击全选之后,

居然要我一张一张下载,需要我不停的点保存,这就很抽象了,难道我想要的批量下载不应该是打包成压缩包或者直接批量下载到文件夹中嘛?

这点厂商做的甚至不如云盘,细节一点也没打磨!!!

第一步

打开vivo云服务官网,进入主页,打开控制台进行调试分析,进入相册,我们先刷新看看.

如图

图片1

图片1

图片二

如上图二所示
我们在左侧找到list列表在看发送的载荷信息想必里面必然储存着照片信息。

我们点进去看响应

{
                "userId": "",
                "metaId": "照片唯一ID",
                "folderId": "",
                "fileName": "照片名称",
                "clientPath": "照片目录地址",
                "clientPathAlias": "相机",
                "clientPathMode": 1,
                "clientBucketId": -1739773001,
                "clientBucketDisplayName": "Camera",
                "status": 2,
                "mediaFormat": "image/jpeg",
                "mediaType": 1,
                "groupId": "0",
                "groupType": 0,
                "indexInGroup": 0,
                "createTime": 时间,
                "modifiedTime": 时间,
                "duration": 0,
                "width": 4032,
                "height": 3024,
                "clientCreateTime": 时间,
                "totalSize": 3701187,
                "orientation": 0,
                "longitude": 126.545845,
                "latitude": 45.855967,
                "geoHash": "yb1uzegf",
                "version": "172586734601588131",
                "domain": "https://cloudalbum-cn09.vivo.com.cn",
                "favorite": 0,
                "clientSource": "0",
                "extAttrMap": {
                    "clientDateAddTime": "时间",
                    "clientModifiedTime": "时间",
                    "mediaSpecialType": "0",
                    "imageHdrValue": "0"
}

第二步

复制响应请求我们丢到python中,构造所需要的信息。一次性获取所有的返回数据然后筛选出所有的下载。

图片3

import http.client
import json

conn = http.client.HTTPSConnection("yun.vivo.com.cn")
payload = json.dumps({
   "preCreateTime": None,
   "preMetaId": None,
   "pageSize": 10000,
   "paths": [
      "相机",
      "视频"
   ],
   "clientPathMode": 1
})
headers = {
   'accept': 'application/json, text/plain, */*',
   'accept-language': 'zh-CN,zh;q=0.9',
   'cache-control': 'no-cache',
   'origin': 'https://yun.vivo.com.cn',
   'pragma': 'no-cache',
   'priority': 'u=1, i',
   'referer': 'https://yun.vivo.com.cn/',
   'sec-ch-ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Windows"',
   'sec-fetch-dest': 'empty',
   'sec-fetch-mode': 'cors',
   'sec-fetch-site': 'same-origin',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
   'x-yun-csrftoken': '自己去标头补全',
   'Cookie': '自己去标头补全',
   'content-type': 'application/json'
}
conn.request("POST", "/api/web/meta/list.do", payload, headers)
res = conn.getresponse()
data = res.read()

# 解析 JSON 数据
response_data = json.loads(data.decode("utf-8"))

# 提取并打印所有的 downloadUrl
if 'data' in response_data and 'fileList' in response_data['data']:
    file_list = response_data['data']['fileList']
    for file_info in file_list:
        if 'downloadUrl' in file_info:
            download_url = file_info['downloadUrl']
            if not download_url.startswith('https://'):
                download_url = 'https://' + download_url
            print(download_url)
else:
    print("未找到 fileList")

补全信息后运行后输出如下

//cloudalbum-cn09.vivo.com.cn/api/file/download.do?metaId=xxxx
//cloudalbum-cn09.vivo.com.cn/api/file/download.do?metaId=xxxx
//cloudalbum-cn09.vivo.com.cn/api/file/download.do?metaId=xxxx
//cloudalbum-cn09.vivo.com.cn/api/file/download.do?metaId=xxx

将输出的所有内容保存到当前python目录3.txt中,为后续做准备~

第三步

此时,我们去网页下载单个照片看看网页是如何构造的!

如图

图片4

请求url为
https://cloudalbum-cn09.vivo.com.cn/api/file/download.do?stsToken=xxxxxx&mode=0&metaId=xxxxx
stsToken: 个人token
mode: 0
metaId: xxxx图片唯一ID(第一个代码输出的)
观察到这些我们就可以批量下载了!


第四步


将刚才保存的3.txt移到python目录下,然后我们构建批量下载代码

代码如下

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import os

# 读取 3.txt 文件中的 URL
with open('3.txt', 'r') as file:
    urls = file.readlines()

# 参数
sts_token = "第三步请求载荷中的下载中的stsToken,一定是下载单个图片请求载荷中的stsToken"

# 创建 tupian 文件夹(如果不存在)
output_dir = 'tupian'
os.makedirs(output_dir, exist_ok=True)

# 自定义 headers
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Referer': 'https://yun.vivo.com.cn/',
    'Sec-Fetch-Dest': 'iframe',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'Cookie': '自己去标头补全'
}

def download_file(url):
    url = url.strip()  # 去除行末的换行符
    if url:  # 确保 URL 不为空
        # 提取 metaId
        meta_id = url.split('=')[-1]

        # 拼接 stsToken 参数
        full_url = f"https://cloudalbum-cn09.vivo.com.cn/api/file/download.do?metaId={meta_id}&stsToken={sts_token}"

        try:
            # 构建完整的文件路径
            file_name = f"{meta_id}.jpg"  # 统一为 .jpg 格式
            file_path = os.path.join(output_dir, file_name)

            # 检查文件是否已经存在
            if os.path.exists(file_path):
                print(f"文件已存在: {file_path}, 跳过下载")
                return

            # 发送 GET 请求下载文件
            response = requests.get(full_url, headers=headers)
            response.raise_for_status()  # 检查请求是否成功

            # 保存文件到本地
            with open(file_path, 'wb') as f:
                f.write(response.content)

            print(f"下载完成: {file_path}")
        except requests.exceptions.RequestException as e:
            print(f"下载失败: {full_url}, 错误: {e}")


# 使用多线程下载文件
with ThreadPoolExecutor(max_workers=10) as executor:
    future_to_url = {executor.submit(download_file, url): url for url in urls}
    for future in as_completed(future_to_url):
        url = future_to_url[future]
        try:
            future.result()
        except Exception as exc:
            print(f"{url} 生成异常: {exc}")

然后点击运行

效果图如下

展示图

1.如果第一次出现下载失败的请检查你的第三步下载单个图片中的请求载荷stsToken,一定是下载单个图片请求载荷中的stsToken填写对在进行尝试!!!!

2.如果是下载到一半失败了的话,请重新下载单个照片,然后再在浏览器控制台单个下载照片请求载荷中找到stsToken重新填写!!!

文章版权归王秋风公众号所有!

未经许可 不得转载、抄袭!

扫描二维码推送至手机访问。

微信搜索关注王铁锹公众号或者搜索王秋风。

版权声明:本文由王铁锹个人发布,如需转载请注明出处。

本文链接:https://www.3ban.cn/?id=65

“vivo云服务照片视频批量下载代码~” 的相关文章

利用python代码一秒完成指定IP端口扫描

利用python代码一秒完成指定IP端口扫描

引言”学习如何使用Python编写高效的端口扫描脚本,实现对指定IP地址的快速端口扫描。本教程提供详细的代码示例和解释,教你利用Python的强大功能在短短一秒钟内检测出目标主机上所有开放的端口。无论是网络安全测试、服务器管理还是渗透测试准备,这个Python端口扫描器都是不可或缺的工具。获取代码,...

巧用python代码生成网站sitemap地图

巧用python代码生成网站sitemap地图

引言如下:在互联网的世界里,拥有一个清晰、易于导航的网站地图(sitemap)对于网站的成功至关重要。网站地图不仅有助于用户更好地了解网站结构,还能极大地提升搜索引擎优化(SEO)因为它为搜索引擎爬虫提供了发现和索引页面的有效途径。通过提供一个全面且更新及时的网站地图,我们可以确保搜索引擎能够快速找...

利用python导入flv文本链接随机构造一组网页播放

利用python导入flv文本链接随机构造一组网页播放

引言如下通过导入本地文件夹内的文本,引入链接调用python代码开放5000端口进行网页的flv随机播放,这个代码常用于随机测试flv的直播播放设置,亦或者监控等领域....软件规划如下FLV Video Player 是一个基于Web的简易视频播放器应用,使用Python的Flask框架构建。为用...

巧妙调用接口来判断ip地址

巧用一个使用 Python 发起 HTTPS 请求的例子,旨在获取指定 IP 地址的相关信息!请勿用于生产测试环境!import urllib.request import ssl # 定义请求的URL、方法、应用代码(API密钥)以及查询参数 host&nb...

Python脚本实现自动检测并重命名非正常图片文件

Python脚本实现自动检测并重命名非正常图片文件

概述在日常的文件管理和数据处理中,我们可能会遇到一些文件名虽然以特定扩展名结尾,但实际内容并不符合该格式的情况。例如,某些文件可能被错误地标记为 .jpg 文件,但实际上它们可能是其他类型的文件,如视频文件。这种情况下,如果我们依赖文件扩展名来处理文件,就可能导致程序出现错误或无法正确处理文件。本文...

PHP脚本获取客户端IP地址和解析设备信息

PHP脚本获取客户端IP地址和解析设备信息

在互联网应用中,了解访问者的信息对于网站分析、用户行为跟踪以及安全控制等方面非常重要。PHP是一种广泛使用的服务器端脚本语言,它提供了多种方法来收集和处理来自客户端的数据。下面的代码片段展示了两个PHP函数,它们分别用于获取客户端的IP地址和解析用户的设备信息(包括操作系统和浏览器)。获取客户端IP...