markdown下载图片到本地,上次图片到lsky,对图片地址进行更新
This commit is contained in:
		
							
								
								
									
										253
									
								
								dialogue_download_change.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								dialogue_download_change.py
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
				
			||||||
		Reference in New Issue
	
	Block a user