大儿子参加了今年的暑假军事夏令营,照片直播服务使用的是拍立享。但拍立享本身对于图片的识别不足,无法精确的识别大儿子的照片。
我希望能通过谷歌相册的识别来精准的判断哪些是我大儿子的照片,于是有了下面的相关代码

一、获取相册所有的照片数据
curl -o a.log 'https://www.pailixiang.com/Portal/Services/AlbumDetail.ashx?t=2&rid=req33mip594yecb' \
-H 'authority: www.pailixiang.com' \
-H 'accept: application/json, text/javascript, */*; q=0.01' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'cookie: COOKIE_012=1787ba89-d4a1-4400-a22b-7c5bb89a2d8d; Plx_OA6K05m8=m0zk4q2p1hyjb1qczvs2xtye; SERVERID=3cb4a6b6e759b320e9e7834796a8c5b0|1691152725|1691151948' \
-H 'origin: https://www.pailixiang.com' \
-H 'referer: https://www.pailixiang.com/album_ia4423717371.html' \
-H 'sec-ch-ua: "Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' \
-H 'x-requested-with: XMLHttpRequest' \
--data-raw 'albumId=adf4416e-3147-476e-9b23-c4671caf5247&groupId=&len=11000&from=&order=0&accessType=1&nw=' \
--compressed
二、基于Json数据获取对应的图片数据
cat a.log| grep pbig | awk -F '"' '{print $4}' > file.log
三、多线程Python下载照片
import requests
import hashlib
import os
from concurrent.futures import ThreadPoolExecutor
url = "https://img.pailixiang.com/album/a343717371/133517343.jpg@!pbig"
# 下载并保存图片
def download_image(url):
response = requests.get(url)
image_data = response.content
hash_value = hashlib.sha256(url.encode('utf-8')).hexdigest()
prefix = hash_value[:2]
directory_num = int(prefix, 16) % 10
directory = os.path.join(os.getcwd(), str(directory_num))
os.makedirs(directory, exist_ok=True)
filename = hash_value + ".jpg"
filepath = os.path.join(directory, filename)
with open(filepath, "wb") as f:
f.write(image_data)
print(f"Image downloaded successfully: {url}")
def pool_down_images(image_urls):
with ThreadPoolExecutor(max_workers=32) as executor:
executor.map(download_image, image_urls)
def read_file(filename):
with open(filename, 'r') as file:
data = file.readlines()
data = [line.strip() for line in data]
return data
# 指定文件名并读取数据
filename = "file.log" # 替换为你的文件名
data = read_file(filename)
# 调用函数上传图片
pool_down_images(data)%
四、Python服务上传谷歌相册
import requests
from google_auth_oauthlib.flow import InstalledAppFlow
def get_access_token():
# 客户端凭证信息
client_id = ""
client_secret = ""
# 定义 OAuth 2.0 授权范围(API 的访问权限)
scopes = ["https://www.googleapis.com/auth/photoslibrary"]
# 创建授权流程对象
flow = InstalledAppFlow.from_client_secrets_file(
"credentials.json", # 替换为你的客户端凭证文件路径
scopes=scopes
)
# 进行授权
credentials = flow.run_local_server()
# 返回访问令牌
return credentials.token
# 下载并上传图片到谷歌相册
def upload_images(image_urls):
access_token = get_access_token()
headers = {
"Authorization": f"Bearer {access_token}"
}
for url in image_urls:
# 下载图片
response = requests.get(url)
if response.status_code == 200:
image_data = response.content
# 上传图片
upload_url = "https://photoslibrary.googleapis.com/v1/uploads"
upload_response = requests.post(upload_url, data=image_data, headers=headers)
if upload_response.status_code == 200:
upload_token = upload_response.text.rstrip("\n")
create_media_item(upload_token, headers)
print(f"Image uploaded successfully: {url}")
else:
print(f"Image upload failed: {url} ({upload_response.text})")
else:
print(f"Image download failed: {url} ({response.status_code})")
# 创建相册项
def create_media_item(upload_token, headers):
create_url = "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate"
body = {
"newMediaItems": [{
"description": "Uploaded from Python",
"simpleMediaItem": {
"uploadToken": upload_token
}
}]
}
response = requests.post(create_url, json=body, headers=headers)
if response.status_code != 200:
print(f"Failed to create media item: {response.text}")
def read_file(filename):
with open(filename, 'r') as file:
data = file.readlines()
data = [line.strip() for line in data]
return data
# 指定文件名并读取数据
filename = "file.log" # 替换为你的文件名
data = read_file(filename)
# 调用函数上传图片
upload_images(data)