Cnblogs_upload
1°Python脚本cnblogsUpload.py识别md图片路径

import requests import json import os import re from sys import argv from datetime import datetime # --- 配置区 --- UPLOAD_URL = 'https://upload.cnblogs.com/imageuploader/processupload?host=www.cnblogs.com' COOKIE_FILE = 'cnblogs_cookie.txt' # 手动获取cookie信息并本地保存 def log(message): """带完整日期时间戳的日志输出""" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{timestamp}] {message}") # 1. 定义读取本地 Cookie 的函数 def load_cookie(): if not os.path.exists(COOKIE_FILE): log(f"❌ 错误:未找到 Cookie 文件 {COOKIE_FILE}") log("💡 请先在浏览器登录博客园,按 F12 -> Application -> Cookies 复制内容保存到该文件。") log("💡 文件内容应为完整的 Cookie 字符串,例如:'key1=value1; key2=value2'") exit(1) with open(COOKIE_FILE, 'r', encoding='utf-8') as f: cookie_str = f.read().strip() if not cookie_str: log("❌ 错误:Cookie 文件为空!") exit(1) return cookie_str # 2. 使用读取到的 Cookie 构建 Headers headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0", "cookie": load_cookie() # 调用函数获取 Cookie 字符串 } mimeMapping = { ".png": 'image/png', '.gif': 'image/gif', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.webp': 'image/webp' # 增加对 WebP 格式的支持 } def upload_image(imgPath): ext = os.path.splitext(imgPath)[1].lower() if ext not in mimeMapping: log(f"⚠️ 跳过不支持的格式: {imgPath}") return None fileName = os.path.basename(imgPath) if not os.path.exists(imgPath): log(f"❌ 文件不存在: {imgPath}") return None file_obj = [ ("file", (fileName, open(imgPath, "rb"), mimeMapping[ext])) ] try: response = requests.post(UPLOAD_URL, headers=headers, files=file_obj) data = json.loads(response.text) if data.get('success'): log(f"✅ 已上传: {fileName} ({os.path.getsize(imgPath)} 字节)") return data.get('message') else: log(f"❌ 上传失败 {fileName}: {data.get('message')}") return None except Exception as e: log(f"❌ 上传异常 {imgPath}: {e}") return None if len(argv) > 1: mdPath = argv[1] else: log("❌ 请指定 md 文件路径") exit(1) if not os.path.exists(mdPath): log(f"❌ md 文件不存在: {mdPath}") exit(1) mdDir = os.path.dirname(mdPath) or '.' with open(mdPath, 'r', encoding='utf-8') as f: content = f.read() imgPattern = r'!\[([^\]]*)\]\((.+?)\)' matches = re.findall(imgPattern, content) log(f"🔍 找到 {len(matches)} 个图片引用") if matches: log(f"📄 示例匹配: {matches[0]}") localToUrl = {} for i, (alt, imgPath) in enumerate(matches): if imgPath.startswith('http'): continue absPath = os.path.normpath(os.path.join(mdDir, imgPath)) if absPath not in localToUrl: log(f"📤 正在上传第 {i+1:02d} 张图片: {absPath}") url = upload_image(absPath) if url: localToUrl[absPath] = url else: log(f"❌ 上传失败: {absPath}") # 替换 Markdown 中的路径 for localPath, url in localToUrl.items(): for alt, imgPath in matches: absPath = os.path.normpath(os.path.join(mdDir, imgPath)) if absPath == localPath: content = content.replace(f'', f'') with open(mdPath, 'w', encoding='utf-8') as f: f.write(content) log(f"🎉 完成!共上传 {len(localToUrl)} 张图片")
2° 启动Cnblogs.bat脚本调用此Python脚本
@echo off
:: 设置编码为 UTF-8,防止中文乱码
chcp 65001 >nul
:: 开启延迟变量扩展,用于在循环中动态处理变量
setlocal enabledelayedexpansion
title 🚀 博客园图片上传工具V1.0 Author:zh15094034633@hotmail.com 版本号:V1.0
cls
echo ==========================================
echo 博客园图片自动上传工具启动器
echo ==========================================
echo.
:: 1.检查 Python 是否可用
python --version >nul 2>&1
if errorlevel 1 (
echo ? [错误] 未找到 Python 环境,请先安装 Python 并配置环境变量!
pause
exit /b 1
)
:: 2.获取当前脚本所在目录
set "SCRIPT_DIR=%~dp0"
set "DEFAULT_PY=%SCRIPT_DIR%upload.py"
REM 等待用户输入
echo 请输入 py 文件绝对路径 (直接回车默认使用当前目录下的 upload.py):
set /p USER_INPUT_PY=
if "%USER_INPUT_PY%"=="" set "USER_INPUT_PY=%DEFAULT_PY%"
:: 3.检查 Python 文件是否存在
if not exist "%USER_INPUT_PY%" (
echo [错误] 找不到指定的 Python 文件: "%USER_INPUT_PY%"
pause
exit /b 1
)
echo.
:: 4.输入 Markdown 文件路径
set /p USER_INPUT_MD=请输入 md 文件绝对路径并按回车 (支持直接拖拽文件到窗口):
echo ------------------------------------------
echo 正在准备执行...
echo Py 路径:%USER_INPUT_PY%
echo Md 路径:%USER_INPUT_MD%
echo ------------------------------------------
echo.
:: 5.检查 Markdown 文件是否存在
if not exist "%USER_INPUT_MD%" (
echo [错误] 找不到指定的 Markdown 文件: "%USER_INPUT_MD%"
pause
exit /b 1
)
echo ==========================================
echo 开始执行任务...
echo ==========================================
echo.
:: 6. 智能查重逻辑:提取 md 文件中已存在的图片文件名
echo.
echo 🔍 正在扫描文档,检测已上传的图片...
set "SKIP_LIST="
set "MD_CONTENT="
:: 读取 md 文件内容到变量中
for /f "delims=" %%i in ('type "%USER_INPUT_MD%"') do (
set "MD_CONTENT=!MD_CONTENT! %%i"
)
:: 遍历当前目录下的常见图片格式,检查是否已存在于 md 文件中
for %%F in (*.png *.jpg *.jpeg *.gif *.webp *.bmp) do (
set "FILENAME=%%~nxF"
set "FILE_FOUND="
:: 检查文件名是否已经存在于 md 文件的内容中
echo !MD_CONTENT! | findstr /i /c:"!FILENAME!" >nul
if !errorlevel! equ 0 (
echo ⏩ 检测到已上传: !FILENAME! (将跳过)
:: 将已上传的文件名加入跳过列表,用逗号隔开
if defined SKIP_LIST (
set "SKIP_LIST=!SKIP_LIST!,!FILENAME!"
) else (
set "SKIP_LIST=!FILENAME!"
)
)
)
echo.
echo ==========================================
echo ⚡ 开始执行上传任务...
echo ==========================================
echo.
:: 7.执行 Python 脚本,并将跳过列表作为第三个参数传递过去
if defined SKIP_LIST (
echo [提示] 将自动跳过以下图片: %SKIP_LIST%
echo.
python "%USER_INPUT_PY%" "%USER_INPUT_MD%" "%SKIP_LIST%"
) else (
python "%USER_INPUT_PY%" "%USER_INPUT_MD%"
)
REM 判断是否都已输入
if "%USER_INPUT_PY%"=="" (
echo ? 未输入 py 文件路径,脚本结束
pause
exit /b 1
)
if "%USER_INPUT_MD%"=="" (
echo ? 未输入 md 文件路径,脚本结束
pause
exit /b 1
)
:: 8.结果反馈
if errorlevel 1 (
echo.
echo ==========================================
echo [ 错误] 脚本执行过程中发生异常 (Error Level: %errorlevel%)
echo 请检查上方的报错信息。
echo ==========================================
) else (
echo.
echo ==========================================
echo 任务执行成功!所有图片已上传。
echo ==========================================
)
echo.
pause
endlocal

图片上传成功 返回对应的图片URL ```1. ****


浙公网安备 33010602011771号