diff --git a/dialogue_download_change.py b/dialogue_download_change.py new file mode 100644 index 0000000..e3ab39e --- /dev/null +++ b/dialogue_download_change.py @@ -0,0 +1,253 @@ +import os +import re +import requests +from requests.auth import HTTPBasicAuth +import tkinter as tk +from tkinter import filedialog, messagebox +import time +import tempfile +import uuid +import shutil + +# 配置信息 +local_image_folder = 'downloaded_images' +lsky_pro_url = 'http://192.168.107.248:18089/api/v1' +upload_endpoint = '/upload' +token = '1|QJP2YEr9GIN52VBgmm5hCqV5DwBSvJLUKjnwcKB8' + +# 确保本地图片文件夹存在 +#os.makedirs(local_image_folder, exist_ok=True) +def get_image_folder(markdown_path): + # 获取markdown文件所在目录 + markdown_dir = os.path.dirname(markdown_path) + # 在markdown文件同目录下创建images文件夹 + image_folder = os.path.join(markdown_dir, 'images') + return image_folder +def choose_input_file(): + file_path = filedialog.askopenfilename( + title="选择Markdown文件", + filetypes=(("Markdown files", "*.md"), ("All files", "*.*")) + ) + if file_path: + input_file_entry.delete(0, tk.END) + input_file_entry.insert(0, file_path) + +def clean_filename(url): + try: + # 提取fdId参数 + fd_id = re.search(r'fdId=([0-9a-f]+)', url) + if fd_id: + return f"{fd_id.group(1)}.jpg" + + # 如果没有fdId,使用时间戳 + return f"image_{int(time.time())}.jpg" + except: + return f"image_{int(time.time())}.jpg" + +def download_images(): + markdown_file_path = input_file_entry.get() + if not markdown_file_path or not os.path.isfile(markdown_file_path): + messagebox.showwarning("警告", "请选择有效的Markdown文件。") + return + # 根据markdown文件位置设置图片文件夹 + global local_image_folder + local_image_folder = get_image_folder(markdown_file_path) + os.makedirs(local_image_folder, exist_ok=True) + with open(markdown_file_path, 'r', encoding='utf-8') as file: + markdown_content = file.read() + + image_urls = re.findall(r'!\[.*?\]\((.*?)\)', markdown_content) + + success_count = 0 + url_mapping = {} # 存储URL到本地路径的映射 + + for url in image_urls: + try: + response = requests.get(url) + if response.status_code == 200: + image_name = clean_filename(url) + image_path = os.path.join(local_image_folder, image_name) + + # 保存图片 + with open(image_path, 'wb') as img_file: + img_file.write(response.content) + + # 使用相对路径 + relative_path = os.path.join('.', local_image_folder, image_name) + relative_path = relative_path.replace('\\', '/') # 统一使用正斜杠 + + url_mapping[url] = relative_path + success_count += 1 + + except Exception as e: + print(f"下载失败 {url}: {str(e)}") + continue + + # 更新Markdown内容 + if url_mapping: + new_content = markdown_content + for old_url, new_path in url_mapping.items(): + new_content = new_content.replace(old_url, new_path) + + # 保存更新后的Markdown文件 + with open(markdown_file_path, 'w', encoding='utf-8') as file: + file.write(new_content) + + messagebox.showinfo("完成", f"成功下载 {success_count} 张图片并更新Markdown文件") + else: + messagebox.showwarning("警告", "没有图片被下载") + +def upload_image_to_lsky_pro(image_path): + """上传图片到Lsky Pro图床""" + with open(image_path, 'rb') as img_file: + files = {'file': img_file} + headers = { + 'Authorization': f'Bearer {token}', + 'Accept': 'application/json' + } + response = requests.post(f'{lsky_pro_url}{upload_endpoint}', files=files, headers=headers) + if response.status_code == 200: + try: + data = response.json() + if data['status']: + return data['data']['links']['url'] + except: + pass + return None + +def upload_images(): + markdown_file_path = input_file_entry.get() + if not markdown_file_path or not os.path.isfile(markdown_file_path): + messagebox.showwarning("警告", "请选择有效的Markdown文件。") + return + + with open(markdown_file_path, 'r', encoding='utf-8') as file: + markdown_content = file.read() + + # 提取所有图片URL + image_urls = re.findall(r'!\[.*?\]\((.*?)\)', markdown_content) + url_mapping = {} # 存储原始URL到新URL的映射 + + for url in image_urls: + try: + # 下载图片 + + + # 上传到图床 + new_url = upload_image_to_lsky_pro(url) + if new_url: + url_mapping[url] = new_url + print(f"处理成功: {url} -> {new_url}") + else: + print(f"上传失败: {url}") + + except Exception as e: + print(f"处理出错 {url}: {str(e)}") + continue + + # 更新Markdown内容 + if url_mapping: + new_content = markdown_content + for old_url, new_url in url_mapping.items(): + new_content = new_content.replace(old_url, new_url) + + # 保存更新后的文件 + with open(markdown_file_path, 'w', encoding='utf-8') as file: + file.write(new_content) + + messagebox.showinfo("完成", f"成功处理 {len(url_mapping)} 张图片") + else: + messagebox.showwarning("警告", "没有图片被处理") +def download_and_upload_images(): + markdown_file_path = input_file_entry.get() + if not markdown_file_path: + messagebox.showerror("错误", "请选择Markdown文件") + return + + try: + # 读取Markdown文件 + with open(markdown_file_path, 'r', encoding='utf-8') as file: + markdown_content = file.read() + + # 提取所有图片URL + image_urls = re.findall(r'!\[.*?\]\((.*?)\)', markdown_content) + if not image_urls: + messagebox.showinfo("提示", "文件中未找到图片链接") + return + + url_mapping = {} + temp_dir = tempfile.mkdtemp() + + for img_url in image_urls: + try: + # 下载图片 + response = requests.get(img_url, timeout=10) + if response.status_code == 200: + # 生成临时文件名 + file_extension = os.path.splitext(img_url.split('/')[-1])[-1] + if not file_extension: + file_extension = '.png' + temp_file = os.path.join(temp_dir, f"temp_{uuid.uuid4()}{file_extension}") + + # 保存图片 + with open(temp_file, 'wb') as f: + f.write(response.content) + + # 使用现有函数上传到lsky + new_url = upload_image_to_lsky_pro(temp_file) + if new_url: + url_mapping[img_url] = new_url + print(f"成功上传: {img_url} -> {new_url}") + else: + print(f"上传失败: {img_url}") + + except Exception as e: + print(f"处理图片失败: {img_url}, 错误: {str(e)}") + + # 更新Markdown内容 + if url_mapping: + new_content = markdown_content + for old_url, new_url in url_mapping.items(): + new_content = new_content.replace(old_url, new_url) + + # 保存更新后的文件 + with open(markdown_file_path, 'w', encoding='utf-8') as file: + file.write(new_content) + + messagebox.showinfo("完成", f"成功处理 {len(url_mapping)} 张图片") + else: + messagebox.showwarning("警告", "没有图片被处理") + + # 清理临时目录 + shutil.rmtree(temp_dir, ignore_errors=True) + + except Exception as e: + messagebox.showerror("错误", f"处理过程中出错: {str(e)}") + + + + +# 创建主窗口 +root = tk.Tk() +root.title("Markdown图片处理工具") + +# 文件路径显示 +tk.Label(root, text="Input File:").grid(row=0, column=0, padx=10, pady=10) +input_file_entry = tk.Entry(root, width=50) +input_file_entry.grid(row=0, column=1, padx=10, pady=10) +tk.Button(root, text="Browse", command=choose_input_file).grid(row=0, column=2, padx=10, pady=10) + +# 下载图片按钮 +download_button = tk.Button(root, text="下载图片", command=download_images) +download_button.grid(row=1, column=0, columnspan=3, pady=5) + +# 上传图片按钮 +upload_button = tk.Button(root, text="上传图片", command=upload_images) +upload_button.grid(row=2, column=0, columnspan=3, pady=5) + +# 下载并上传图片按钮 +download_upload_button = tk.Button(root, text="下载并上传图片", command=download_and_upload_images) +download_upload_button.grid(row=3, column=0, columnspan=3, pady=5) + +# 运行主循环 +root.mainloop() \ No newline at end of file