I wanted to use Google Photos' recognition to precisely determine which photos featured my eldest son. As a result, I developed the following code for this purpose:
一、获取相册所有的照片数据
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)














AI周刊:大模型、智能体与产业动态追踪
程序员数学扫盲课
冲浪推荐:AI工具与技术精选导航
Claude Code 全体系指南:AI 编程智能体实战
最新评论
Flash版本的响应速度确实提升明显,但我在使用中发现对中文的理解偶尔会出现一些奇怪的错误,不知道是不是普遍现象?
遇到过类似问题,最后发现是网络环境的问题。建议加一个超时重试机制的示例代码。
谢谢分享,我是通过ChatGPT的索引找到这里来的。
十年打磨一个游戏确实罕见,这种专注度在快节奏的游戏行业很难得。从Braid到The Witness,每作都是精品。
快捷键冲突是个很实际的问题,我自己也被这个问题困扰过。最后通过自定义快捷键组合解决了。
会议摘要这个功能很实用,特别是对经常需要参加长会议的人。不过三次免费使用确实有点少了。
硕士背景转AI基础设施,这个路径其实挺常见的。建议多关注底层系统知识,而不只是模型应用层面。
配置虽然简单,但建议补充一下认证和加密的注意事项,避免被中间人攻击。