Cnblogs_upload

# **Python脚本上传博客园**

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

cnblogsUpload.py
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'![{alt}]({imgPath})', f'![{alt}]({url})')

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. ****
posted @ 2026-05-19 11:48  ZH_Cnblogs  阅读(10)  评论(0)    收藏  举报