背景说明:
每次把教学照片上传csdn,都需要打开相册,一张张截图,然后ctrl+V黏贴到CSDN内,我觉得太烦了。
改进思路:
是否可以先把所有照片都上传到csdn,然后再一张张的截图(去掉幼儿部分,打码等,放大学具部分)
以上传蝴蝶图为例
1.手机导出照片都放在00原图里
一张图5MB,直接上传csdn,太大了
需要把图片的高宽和图片大小(MB)都缩小。
2、缩小图片的高宽和大小
'''
相册导出幼儿照片需要上传csdn——缩小图片
deepseek,阿夏
20250515
'''
from PIL import Image
import os
# 输入和输出文件夹
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20250508GIF测试'
input_folder = path+r"\00原图" # 原图文件夹
output_folder = path+r"\01小图" # 缩小后的图片保存文件夹
# 如果输出文件夹不存在,则创建
os.makedirs(output_folder, exist_ok=True)
# 遍历输入文件夹中的所有图片
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
try:
# 打开图片
with Image.open(input_path) as img:
# 缩小尺寸到 50%
new_width = int(img.width * 0.5)
new_height = int(img.height * 0.5)
resized_img = img.resize((new_width, new_height), Image.LANCZOS)
# 保存图片,质量降低 50%(仅适用于 JPEG)
if filename.lower().endswith(('.jpg', '.jpeg')):
resized_img.save(output_path, quality=50, optimize=True)
else:
resized_img.save(output_path)
print(f"已处理: {filename} → 新尺寸: {new_width}x{new_height}")
except Exception as e:
print(f"处理 {filename} 时出错: {e}")
print("所有图片处理完成!")
高宽和大小都缩小一半
3、Python模拟鼠标自动上传。
全部批量复制上传图片会出现第一张到最后位置,或者系统检测一次性上传大量图片,会封号。
所以我采用一张张上传的方式(随机间隔秒数)
'''
相册导出幼儿照片需要上传-模拟上传csdn-随机停顿秒数(防止检测)
deepseek,阿夏
20250515
'''
import os, time
import random # 补充导入 random 模块
import pyautogui
import pyperclip
import re
import win32api
import win32con
# 初始暂停(用于最小化Python窗口)
time.sleep(5)
# 读取文件名称和路径
paths = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250508GIF测试'
path = paths + r"\01小图" # 缩小后的图片保存文件夹
os.makedirs(path, exist_ok=True)
# 读取图片路径列表
img_path = [os.path.join(path, img) for img in os.listdir(path) if img.endswith(".png")]
print(img_path)
print(len(img_path))
# 随机秒数函数
def a():
t = random.randint(1, 3) # 生成 1~3 秒的随机数
return t
# 遍历所有图片并模拟上传
for i in range(len(img_path)):
# 随机停顿(每次调用 a() 生成新的随机值)
t = a() # 保存返回值到变量 t
# 点击图像按钮
pyautogui.moveTo(1090, 183)
pyautogui.click()
time.sleep(t) # 使用随机停顿
# 点击选择图片按钮
pyautogui.moveTo(1574, 524)
pyautogui.click()
time.sleep(t + 3) # 基础随机秒数 + 额外固定秒数
# 输入图片名称(从剪贴板粘贴)
name = img_path[i]
pyperclip.copy(name)
pyautogui.hotkey('ctrl', 'v')
time.sleep(t + 1)
# 确认上传(两次回车,每次间隔随机)
pyautogui.press('enter')
time.sleep(t + 5)
pyautogui.press('enter')
time.sleep(t + 5)
用了随机间隔秒数,防止被检测出自动化风险
上传过程视频
20250515随机秒数自动上传CSDN照片
虽然时间很长,但是确保了能够不同间隔时长。
再处理真实照片时,我发现,虽然我把一些照片左转或右转了,但是缩小后,它还是原图没有旋转的样子
问了deepseek,
一、清除exif信息,缩小图片,手动旋转
'''
相册导出幼儿照片需要上传csdn——清除图片中的exif+缩小图片—+手动旋转照片
deepseek,阿夏
20250515
'''
import os
from PIL import Image
def remove_exif_and_resize(input_folder, output_folder_exif, output_folder_resized):
"""
批量清除 EXIF 并缩小图片尺寸至 50%
:param input_folder: 原始图片文件夹路径
:param output_folder_exif: 清除 EXIF 后的图片保存路径
:param output_folder_resized: 缩小后的图片保存路径
"""
# Step 1: 清除 EXIF
if not os.path.exists(output_folder_exif):
os.makedirs(output_folder_exif)
print("=" * 50)
print("🚀 开始清除 EXIF 数据...")
print("=" * 50)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.tiff', '.bmp', '.gif')):
input_path = os.path.join(input_folder, filename)
output_path_exif = os.path.join(output_folder_exif, filename)
try:
with Image.open(input_path) as img:
img_copy = img.copy()
img_copy.info = {} # 清除 EXIF
img_copy.save(output_path_exif)
print(f"✅ EXIF 已清除: {filename}")
except Exception as e:
print(f"❌ 处理 {filename} 时出错 (EXIF): {e}")
# Step 2: 缩小图片尺寸至 50%
if not os.path.exists(output_folder_resized):
os.makedirs(output_folder_resized)
print("\n" + "=" * 50)
print("🖼️ 开始缩小图片尺寸...")
print("=" * 50)
for filename in os.listdir(output_folder_exif):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
input_path = os.path.join(output_folder_exif, filename)
output_path_resized = os.path.join(output_folder_resized, filename)
try:
with Image.open(input_path) as img:
# 缩小至 50%
new_width = int(img.width * 0.5)
new_height = int(img.height * 0.5)
resized_img = img.resize((new_width, new_height), Image.LANCZOS)
# 如果是 JPEG,降低质量至 50%
if filename.lower().endswith(('.jpg', '.jpeg')):
resized_img.save(output_path_resized, quality=50, optimize=True)
else:
resized_img.save(output_path_resized)
print(f"✅ 已缩小: {filename} → {new_width}x{new_height}")
except Exception as e:
print(f"❌ 处理 {filename} 时出错 (缩放): {e}")
print("\n" + "=" * 50)
print("🎉 所有图片处理完成!")
print("=" * 50)
if __name__ == "__main__":
# 设置路径
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250515门牌号'
input_folder = os.path.join(path, "00原图") # 原始图片
output_folder_exif = os.path.join(path, "01exif") # 清除 EXIF 后的图片
output_folder_resized = os.path.join(path, "02小图") # 缩小后的图片
# 执行处理
remove_exif_and_resize(input_folder, output_folder_exif, output_folder_resized)
小图照片(需要左转)
手动全选,向左转
自动上传
'''
相册导出幼儿照片需要上传-模拟上传csdn-随机停顿秒数(防止检测)
deepseek,阿夏
20250515
'''
import os, time
import random # 补充导入 random 模块
import pyautogui
import pyperclip
import re
import win32api
import win32con
# 初始暂停(用于最小化Python窗口)
time.sleep(5)
# 读取文件名称和路径
paths = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250515门牌号'
path = paths + r"\01小图" # 缩小后的图片保存文件夹
os.makedirs(path, exist_ok=True)
# 读取图片路径列表
img_path = [os.path.join(path, img) for img in os.listdir(path) if img.endswith(".jpg")]
print(img_path)
print(len(img_path))
# 随机秒数函数
def a():
t = random.randint(1, 3) # 生成 1~3 秒的随机数
return t
# 遍历所有图片并模拟上传
for i in range(len(img_path)):
# 随机停顿(每次调用 a() 生成新的随机值)
t = a() # 保存返回值到变量 t
# 点击图像按钮
pyautogui.moveTo(1090, 183)
pyautogui.click()
time.sleep(t) # 使用随机停顿
# 点击选择图片按钮
pyautogui.moveTo(1574, 524)
pyautogui.click()
time.sleep(t + 3) # 基础随机秒数 + 额外固定秒数
# 输入图片名称(从剪贴板粘贴)
name = img_path[i]
pyperclip.copy(name)
pyautogui.hotkey('ctrl', 'v')
time.sleep(t + 1)
# 确认上传(两次回车,每次间隔随机)
pyautogui.press('enter')
time.sleep(t + 5)
pyautogui.press('enter')
time.sleep(t + 5)
这下可以旋转图片后,上传后的图片也默认我需要的方向(拍的时候变成竖版的照片也变成横板进行显示),
我觉得代码可以再优化,现在CSDN界面一直开着,我也不知道VS程序是否结束。
所以最开始,最小化VS界面,生成到最后,最大化VS界面,这样就知道程序结束了,
'''
相册导出幼儿照片需要上传-模拟上传csdn-随机停顿秒数(防止检测),最大化、最小化界面
deepseek,阿夏
20250515
'''
import os, time
import random # 补充导入 random 模块
import pyautogui
import pyperclip
import re
import win32api
import win32con
# 初始暂停(用于最小化Python窗口)
import sys
import ctypes
def minimize_vscode():
try:
# Windows 系统
if sys.platform == 'win32':
hwnd = ctypes.windll.user32.GetForegroundWindow()
ctypes.windll.user32.ShowWindow(hwnd, 6) # SW_MINIMIZE = 6
# 其他系统可能需要不同的方法
except:
pass # 忽略错误
# time.sleep(1)
# 你的主程序代码
print("程序运行中...")
print("最小化 VS Code 窗口...")
minimize_vscode()
time.sleep(1) # 等待 3 秒
# 读取文件名称和路径
paths = r'C:\Users\jg2yXRZ\OneDrive\桌面\拼图'
path = paths + r"\02小图2" # 缩小后的图片保存文件夹
os.makedirs(path, exist_ok=True)
# 读取图片路径列表
img_path = [os.path.join(path, img) for img in os.listdir(path) if img.endswith(".jpg")]
print(img_path)
print(len(img_path))
# 随机秒数函数
def a():
t = random.randint(1, 2) # 生成 1~3 秒的随机数
return t
# 遍历所有图片并模拟上传
for i in range(len(img_path)):
# 随机停顿(每次调用 a() 生成新的随机值)
t = a() # 保存返回值到变量 t
# 点击图像按钮
pyautogui.moveTo(1090, 183)
pyautogui.click()
time.sleep(t) # 使用随机停顿
# 点击选择图片按钮
pyautogui.moveTo(1574, 524)
pyautogui.click()
time.sleep(t + 3) # 基础随机秒数 + 额外固定秒数
# 输入图片名称(从剪贴板粘贴)
name = img_path[i]
pyperclip.copy(name)
pyautogui.hotkey('ctrl', 'v')
time.sleep(t + 1)
# 确认上传(两次回车,每次间隔随机)
pyautogui.press('enter')
time.sleep(t)
pyautogui.press('enter')
time.sleep(t + 5)
# 最大化界面(把CSDN界面缩小)
def maximize_vscode():
"""最大化当前 VS Code 窗口"""
try:
if sys.platform == 'win32': # Windows 系统
hwnd = ctypes.windll.user32.GetForegroundWindow()
ctypes.windll.user32.ShowWindow(hwnd, 6) # SW_MAXIMIZE = 3
except:
pass # 忽略错误
# 你的主程序代码
print("程序运行中...")
print("最小化 VS Code 窗口...")
# minimize_vscode()
maximize_vscode()
# time.sleep(2)
time.sleep(1)