# download_and_open.py import os import sys import requests import json import urllib.parse from tkinter import messagebox, Tk # 服务地址 SERVICE_URL = "http://127.0.0.1:58890/download_and_open_file" dl_code = os.path.realpath(sys.argv[0])[:1] local_path = os.path.dirname(os.path.realpath(sys.argv[0])) if not os.path.exists(os.path.join(local_path, 'config.json')): server_port = 25855 else: with open(os.path.join(local_path, 'config.json'), 'r') as f: config_data = json.load(f) server_port = config_data.get('port') if not server_port: server_port = 25855 def parse_args(): """解析命令行参数,支持两种格式: 1. URL 格式: myapp://action?file_id=xxx&is_template=1 2. 直接参数: --file_id=xxx --is_template=1 """ args = {} if len(sys.argv) < 2: return args # 获取完整命令行 cmd = ' '.join(sys.argv[1:]) # 方式一:URL 格式解析 if '?' in cmd: # 提取查询参数部分 query_part = cmd.split('?')[-1] for pair in query_part.split('&'): if '=' in pair: key, value = pair.split('=', 1) args[key] = urllib.parse.unquote(value) else: # 方式二:命令行参数格式解析 for arg in sys.argv[1:]: if arg.startswith('--') and '=' in arg: key, value = arg[2:].split('=', 1) args[key] = value return args def is_service_running(server_port): """检查本地服务是否可用""" try: # 尝试连接服务,设置3秒超时 resp = requests.get(f"http://127.0.0.1:{server_port}/health", timeout=3) return resp.status_code == 200 except requests.exceptions.RequestException: return False def show_error(message): """显示错误弹窗(使用 tkinter,Python 自带)""" root = Tk() root.withdraw() # 隐藏主窗口 root.attributes('-topmost', True) messagebox.showerror("错误", message) root.destroy() def show_info(message): """显示信息弹窗""" root = Tk() root.withdraw() root.attributes('-topmost', True) messagebox.showinfo("提示", message) root.destroy() def send_request(file_id, is_template, server_port): """发送 POST 请求到本地服务""" payload = { "file_id": file_id, "is_template": is_template } try: resp = requests.post( f'http://127.0.0.1:{server_port}/download_and_open_file', json=payload, timeout=10 ) if resp.status_code == 200: return True, resp.text else: return False, f"服务返回错误码: {resp.status_code}" except requests.exceptions.ConnectionError: return False, "无法连接到服务" except requests.exceptions.Timeout: return False, "请求超时" except Exception as e: return False, f"请求异常: {str(e)}" def main(): # 1. 解析参数 args = parse_args() file_id = args.get('file_id') is_template = args.get('is_template') # 参数验证 if not file_id: show_error("缺少必要参数: file_id") return 1 if is_template is None: show_error("缺少必要参数: is_template") return 1 # 尝试转换 is_template 为数字(如果传入的是字符串) try: is_template_val = int(is_template) if is_template else 0 except ValueError: is_template_val = 1 if is_template.lower() in ('true', '1', 'yes') else 0 # 2. 检查服务是否运行 if not is_service_running(server_port): show_error( "本地服务未启动!\n\n" "请确保服务已运行后重试。\n\n" "如需帮助,请联系技术支持。" ) return 1 # 3. 发送请求 success, result = send_request(file_id, is_template_val, server_port) if success: # 请求成功,静默退出(不弹窗,避免打扰用户) return 0 else: show_error(f"请求失败!\n\n{result}\n\n请检查服务状态后重试。") return 1 if __name__ == "__main__": sys.exit(main())