OfficeHelperTransfer.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # download_and_open.py
  2. import os
  3. import sys
  4. import requests
  5. import json
  6. import urllib.parse
  7. from tkinter import messagebox, Tk
  8. # 服务地址
  9. SERVICE_URL = "http://127.0.0.1:58890/download_and_open_file"
  10. dl_code = os.path.realpath(sys.argv[0])[:1]
  11. local_path = os.path.dirname(os.path.realpath(sys.argv[0]))
  12. if not os.path.exists(os.path.join(local_path, 'config.json')):
  13. server_port = 25855
  14. else:
  15. with open(os.path.join(local_path, 'config.json'), 'r') as f:
  16. config_data = json.load(f)
  17. server_port = config_data.get('port')
  18. if not server_port:
  19. server_port = 25855
  20. def parse_args():
  21. """解析命令行参数,支持两种格式:
  22. 1. URL 格式: myapp://action?file_id=xxx&is_template=1
  23. 2. 直接参数: --file_id=xxx --is_template=1
  24. """
  25. args = {}
  26. if len(sys.argv) < 2:
  27. return args
  28. # 获取完整命令行
  29. cmd = ' '.join(sys.argv[1:])
  30. # 方式一:URL 格式解析
  31. if '?' in cmd:
  32. # 提取查询参数部分
  33. query_part = cmd.split('?')[-1]
  34. for pair in query_part.split('&'):
  35. if '=' in pair:
  36. key, value = pair.split('=', 1)
  37. args[key] = urllib.parse.unquote(value)
  38. else:
  39. # 方式二:命令行参数格式解析
  40. for arg in sys.argv[1:]:
  41. if arg.startswith('--') and '=' in arg:
  42. key, value = arg[2:].split('=', 1)
  43. args[key] = value
  44. return args
  45. def is_service_running(server_port):
  46. """检查本地服务是否可用"""
  47. try:
  48. # 尝试连接服务,设置3秒超时
  49. resp = requests.get(f"http://127.0.0.1:{server_port}/health", timeout=3)
  50. return resp.status_code == 200
  51. except requests.exceptions.RequestException:
  52. return False
  53. def show_error(message):
  54. """显示错误弹窗(使用 tkinter,Python 自带)"""
  55. root = Tk()
  56. root.withdraw() # 隐藏主窗口
  57. root.attributes('-topmost', True)
  58. messagebox.showerror("错误", message)
  59. root.destroy()
  60. def show_info(message):
  61. """显示信息弹窗"""
  62. root = Tk()
  63. root.withdraw()
  64. root.attributes('-topmost', True)
  65. messagebox.showinfo("提示", message)
  66. root.destroy()
  67. def send_request(file_id, is_template, server_port):
  68. """发送 POST 请求到本地服务"""
  69. payload = {
  70. "file_id": file_id,
  71. "is_template": is_template
  72. }
  73. try:
  74. resp = requests.post(
  75. f'http://127.0.0.1:{server_port}/download_and_open_file',
  76. json=payload,
  77. timeout=10
  78. )
  79. if resp.status_code == 200:
  80. return True, resp.text
  81. else:
  82. return False, f"服务返回错误码: {resp.status_code}"
  83. except requests.exceptions.ConnectionError:
  84. return False, "无法连接到服务"
  85. except requests.exceptions.Timeout:
  86. return False, "请求超时"
  87. except Exception as e:
  88. return False, f"请求异常: {str(e)}"
  89. def main():
  90. # 1. 解析参数
  91. args = parse_args()
  92. file_id = args.get('file_id')
  93. is_template = args.get('is_template')
  94. # 参数验证
  95. if not file_id:
  96. show_error("缺少必要参数: file_id")
  97. return 1
  98. if is_template is None:
  99. show_error("缺少必要参数: is_template")
  100. return 1
  101. # 尝试转换 is_template 为数字(如果传入的是字符串)
  102. try:
  103. is_template_val = int(is_template) if is_template else 0
  104. except ValueError:
  105. is_template_val = 1 if is_template.lower() in ('true', '1', 'yes') else 0
  106. # 2. 检查服务是否运行
  107. if not is_service_running(server_port):
  108. show_error(
  109. "本地服务未启动!\n\n"
  110. "请确保服务已运行后重试。\n\n"
  111. "如需帮助,请联系技术支持。"
  112. )
  113. return 1
  114. # 3. 发送请求
  115. success, result = send_request(file_id, is_template_val, server_port)
  116. if success:
  117. # 请求成功,静默退出(不弹窗,避免打扰用户)
  118. return 0
  119. else:
  120. show_error(f"请求失败!\n\n{result}\n\n请检查服务状态后重试。")
  121. return 1
  122. if __name__ == "__main__":
  123. sys.exit(main())