| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- # 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())
|