dukuisong 5 napja
szülő
commit
aa3633c82e
7 módosított fájl, 72 hozzáadás és 81 törlés
  1. 8 0
      .idea/.gitignore
  2. 3 42
      api/api_app.py
  3. 11 10
      config.py
  4. 6 6
      office_helper.py
  5. 0 4
      requirements.txt
  6. 1 19
      tools/check.py
  7. 43 0
      tools/load_yozo.py

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 3 - 42
api/api_app.py

@@ -1,27 +1,20 @@
 import datetime
-import gc
 import logging
 import os
-import shutil
 import socket
+import subprocess
 
-import pythoncom
-import pywintypes
 import requests
-import win32com.client
+
 from flask import Flask, jsonify, request, current_app, send_from_directory, Response
 from flask_cors import CORS
 from requests_toolbelt import MultipartEncoder
-from win10toast import ToastNotifier
-
 
 from config import file_type_map, TARGET_URL
-from tools.check import is_file_open_in_wps
 from tools.file_manager import get_file_md5
 from tools.logger_handle import logger
 
 socket.getfqdn = lambda name=None: 'localhost'
-toaster = ToastNotifier()
 
 app = Flask(__name__, static_folder='../static')
 
@@ -128,30 +121,13 @@ def proxy(path):
 @logger.catch()
 def open_file_by_wps(file_path):
     ext = file_path.split(".")[-1]
-    shutil.rmtree(win32com.client.gencache.GetGeneratePath())
     if ext not in file_type_map:
         return jsonify({'code': 3001, 'msg': '不支持该类型的文件'})
 
     if not os.path.exists(file_path):
         return jsonify({'code': 3006, 'msg': '文件不存在'})
 
-    pythoncom.CoInitialize()
-    try:
-        wps = win32com.client.DispatchEx(file_type_map[ext][0])
-        wps.Visible = True
-        if ext in ['csv', 'xlsx', 'xls']:
-            getattr(wps, file_type_map[ext][1]).Open(os.path.abspath(file_path))
-        else:
-            getattr(wps, file_type_map[ext][1]).open(os.path.abspath(file_path))
-
-    except pywintypes.com_error as e:
-        logger.exception(e)
-        pass
-
-    finally:
-        del wps
-        gc.collect()
-        pythoncom.CoUninitialize()
+    subprocess.run([file_type_map[ext], file_path])
 
     return jsonify({'code': 1000, 'msg': '操作完成'})
 
@@ -195,10 +171,6 @@ def download_and_open_with_wps():
 
         return open_file_by_wps(local_file)
 
-    # 判断本地文件是否被打开
-    if is_file_open_in_wps(local_file):
-        return jsonify({'code': 1000, 'msg': '检测到文件已被打开'})
-
     # 判断本地文件和线上文件是否一致
     local_file_metadata = current_app.config['serve_client'].load_metadata(local_file)
     if local_file_metadata['update_time'] == file_info['updateTime']:
@@ -216,8 +188,6 @@ def download_and_open_with_wps():
 @app.route('/upload_local_file', methods=['POST'])
 def upload_local_file():
     file_name = request.get_json()['file_name']
-    if is_file_open_in_wps(os.path.join(current_app.config['work_path'], file_name)):
-        return jsonify({'code': 3004, 'msg': '操作失败,文件已被打开无法操作'})
 
     metadata = app.config['serve_client'].load_metadata(os.path.join(current_app.config['work_path'], file_name))
     code = app.config['serve_client'].upload_file(os.path.join(current_app.config['work_path'], file_name))
@@ -244,8 +214,6 @@ def upload_local_file():
 @app.route('/update_local_file', methods=['POST'])
 def update_local_file():
     file_name = request.get_json()['file_name']
-    if is_file_open_in_wps(os.path.join(current_app.config['work_path'], file_name)):
-        return jsonify({'code': 3004, 'msg': '操作失败,文件已被打开无法操作'})
 
     try:
         metadata = current_app.config['serve_client'].load_metadata(os.path.join(current_app.config['work_path'], file_name))
@@ -355,9 +323,6 @@ def open_file():
     if not os.path.exists(file_path):
         return jsonify({'code': '3006', 'msg': '文件不存在'})
 
-    if is_file_open_in_wps(file_path):
-        return jsonify({'code': 1000, 'msg': '检测到文件已被打开'})
-
     return open_file_by_wps(file_path)
 
 
@@ -432,10 +397,6 @@ def download_cloud_file():
 
         return jsonify({'code': 1000, 'msg': '操作成功', 'file_path': local_file})
 
-    # 判断本地文件是否被打开
-    if is_file_open_in_wps(local_file):
-        return jsonify({'code': 2001, 'msg': '检测到文档正在被编辑,无法下载'})
-
     # 判断本地文件和线上文件是否一致
     local_file_metadata = current_app.config['serve_client'].load_metadata(local_file)
     if local_file_metadata['update_time'] == file_info['updateTime']:

+ 11 - 10
config.py

@@ -1,6 +1,8 @@
 import os
 import sys
 
+from tools.load_yozo import search_yozosoft
+
 CONFIG = {'oss': {
     # 'endpoint': '172.10.3.36:9000',
     'endpoint': '10.18.5.29:9000',
@@ -18,21 +20,20 @@ def get_config(config_name):
 def is_frozen():
     return getattr(sys, 'frozen', False)
 
-
+yozoc, yozoi, yozow = search_yozosoft()
 file_type_map = {
-    'docx': ['kwps.Application', 'Documents'],
-    'doc': ['kwps.Application', 'Documents'],
-    'txt': ['kwps.Application', 'Documents'],
-    'ppt': ['kwpp.Application', 'Presentations'],
-    'pptx': ['kwpp.Application', 'Presentations'],
-    'csv': ['ket.Application', 'Workbooks'],
-    'xlsx': ['ket.Application', 'Workbooks'],
-    'xls': ['ket.Application', 'Workbooks'],
+    'docx': yozow,
+    'doc': yozow,
+    'txt': yozow,
+    'ppt': yozoi,
+    'pptx': yozoi,
+    'csv': yozoc,
+    'xlsx': yozoc,
+    'xls': yozoc,
 }
 
 headers = {
     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
     'content-type': 'text/plain;charset=UTF-8'
 }
-dl_code = os.path.realpath(sys.argv[0])[:1]
 base_path = os.path.dirname(os.path.dirname(sys.executable if getattr(sys, 'frozen', False) else __file__))

+ 6 - 6
office_helper.py

@@ -51,12 +51,12 @@ def start_all_services(serve_client, work_path):
 
 if __name__ == "__main__":
 
-    if not os.path.exists(f'{dl_code}:\\ProgramData\\OfficeAssistant\\config.json'):
-        logger.error('"config.json" is not find')
-        sys.exit(0)
-
-    with open(f'{dl_code}:\\ProgramData\\OfficeAssistant\\config.json', 'r', encoding='utf-8') as f:
-    # with open(f'config.json', 'r', encoding='utf-8') as f:
+    # if not os.path.exists(f'{dl_code}:\\ProgramData\\OfficeAssistant\\config.json'):
+    #     logger.error('"config.json" is not find')
+    #     sys.exit(0)
+    #
+    # with open(f'{dl_code}:\\ProgramData\\OfficeAssistant\\config.json', 'r', encoding='utf-8') as f:
+    with open(f'config.json', 'r', encoding='utf-8') as f:
         args = json.load(f)
     args['worker_path'] = args['worker_path'].replace('\\\\', '\\')
     if not (args.get('username') and args.get('password')):

+ 0 - 4
requirements.txt

@@ -51,8 +51,6 @@ PySocks==1.7.1
 python-dateutil==2.9.0.post0
 pytweening==1.2.0
 pytz==2025.2
-pywin32==310
-pywin32-ctypes==0.2.3
 requests==2.32.3
 requests-toolbelt==1.0.0
 selenium==4.27.1
@@ -69,8 +67,6 @@ tzdata==2025.2
 urllib3==2.2.3
 watchdog==4.0.2
 Werkzeug==3.0.6
-win10toast==0.9
-win32_setctime==1.2.0
 wsproto==1.2.0
 zipp==3.20.2
 zope.event==5.0

+ 1 - 19
tools/check.py

@@ -3,8 +3,7 @@ import os
 import ipaddress
 from urllib.parse import urlparse
 
-import pythoncom
-import win32com
+
 
 from config import base_path, file_type_map
 from tools.oss_client import MinioClient
@@ -53,20 +52,3 @@ def detect_local_file_changes(file_path):
 
     current_file_md5 = MinioClient.get_file_md5(file_path)
     return metadata['md5'] == current_file_md5
-
-
-def is_file_open_in_wps(file_path: str) -> bool:
-    abs_path = os.path.abspath(file_path).lower()
-    suffix = file_path.split('.')[-1]
-    try:
-        pythoncom.CoInitialize()
-        app = win32com.client.GetActiveObject(file_type_map[suffix][0])
-
-        for wb in getattr(app, file_type_map[suffix][1]):
-            if wb.FullName.lower() == abs_path:
-                return True
-    except Exception:
-        return False
-    finally:
-        pythoncom.CoUninitialize()
-    return False

+ 43 - 0
tools/load_yozo.py

@@ -0,0 +1,43 @@
+import shutil
+import subprocess
+import os
+import sys
+
+
+def run_by_root():
+    if os.geteuid() == 0:
+        return True
+
+    try:
+        subprocess.check_call(['sudo', 'python', sys.argv[0] + sys.argv[1:]])
+        return False
+    except subprocess.CalledProcessError:
+        print('failed')
+        return False
+
+
+def search_yozosoft():
+    if not run_by_root():
+        print('Failed to elevate permissions, retrieving with low privileges')
+
+    yozow = shutil.which('yozow')
+    if yozow:
+        base_path = os.path.dirname(yozow)
+        yozoi = os.path.join(base_path, 'yozoi')
+        yozoc = os.path.join(base_path, 'yozoc')
+        return yozoc, yozoi, yozow
+
+
+    res = subprocess.run(['sudo', 'find', '/', '-name', 'yozow'], capture_output=True, text=True)
+    if res.stdout:
+        yozow = res.stdout.strip()
+        base_path = os.path.dirname(yozow)
+        yozoi = os.path.join(base_path, 'yozoi')
+        yozoc = os.path.join(base_path, 'yozoc')
+        return yozoc, yozoi, yozow  # excel,ppt,word
+
+    else:
+        return None, None, None
+
+# yozoc, yozoi, yozow = search_yozosoft()
+# subprocess.run(['/opt/apps/com.yozosoft.yozo-office/files/bin/yozow', '/home/jxkj/桌面/test.pptx'])