qrpa 1.0.34__py3-none-any.whl → 1.1.50__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
qrpa/fun_win.py CHANGED
@@ -1,198 +1,198 @@
1
- import os
2
- import win32com.client
3
- import winreg
4
-
5
- import requests, subprocess, time
6
- from contextlib import contextmanager
7
-
8
- from .fun_base import log, create_file_path
9
-
10
- default_chrome_user_data = 'D:\chrome_user_data'
11
-
12
- def set_chrome_system_path():
13
- path = os.path.dirname(find_software_install_path('chrome'))
14
- add_to_system_path(path)
15
-
16
- def add_to_system_path(path: str, scope: str = "user"):
17
- """
18
- 将指定路径添加到系统环境变量 Path 中
19
- :param path: 要添加的路径(应为绝对路径)
20
- :param scope: 'user' 表示用户变量,'system' 表示系统变量(需要管理员权限)
21
- """
22
- if not os.path.isabs(path):
23
- raise ValueError("必须提供绝对路径")
24
-
25
- path = os.path.normpath(path)
26
-
27
- if scope == "user":
28
- root = winreg.HKEY_CURRENT_USER
29
- subkey = r"Environment"
30
- elif scope == "system":
31
- root = winreg.HKEY_LOCAL_MACHINE
32
- subkey = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
33
- else:
34
- raise ValueError("scope 参数必须是 'user' 或 'system'")
35
-
36
- try:
37
- with winreg.OpenKey(root, subkey, 0, winreg.KEY_READ | winreg.KEY_WRITE) as key:
38
- current_path, _ = winreg.QueryValueEx(key, "Path")
39
- paths = current_path.split(";")
40
-
41
- if path in paths:
42
- print("路径已存在于 Path 中,无需添加: ", path)
43
- return False
44
-
45
- new_path = current_path + ";" + path
46
- winreg.SetValueEx(key, "Path", 0, winreg.REG_EXPAND_SZ, new_path)
47
- print("✅ 路径已成功添加到Path中: ", new_path)
48
- return True
49
-
50
- except PermissionError:
51
- print("❌ 权限不足,系统变量修改需要管理员权限")
52
- return False
53
- except Exception as e:
54
- print(f"❌ 添加失败: {e}")
55
- return False
56
-
57
- def find_software_install_path(app_keyword: str):
58
- """从开始菜单或桌面查找指定软件的安装路径"""
59
- possible_dirs = [
60
- os.environ.get('PROGRAMDATA', '') + r'\Microsoft\Windows\Start Menu\Programs',
61
- os.environ.get('APPDATA', '') + r'\Microsoft\Windows\Start Menu\Programs',
62
- os.environ.get('USERPROFILE', '') + r'\Desktop',
63
- os.environ.get('PUBLIC', '') + r'\Desktop'
64
- ]
65
-
66
- shell = win32com.client.Dispatch("WScript.Shell")
67
-
68
- for base_dir in possible_dirs:
69
- for root, _, files in os.walk(base_dir):
70
- for file in files:
71
- if file.lower().endswith('.lnk') and app_keyword.lower() in file.lower():
72
- lnk_path = os.path.join(root, file)
73
- try:
74
- shortcut = shell.CreateShortcut(lnk_path)
75
- target_path = shortcut.Targetpath
76
- if os.path.exists(target_path):
77
- return target_path
78
- except Exception as e:
79
- continue
80
-
81
- log(f'未能查找到{str}安装位置')
82
- return None
83
-
84
- def init_chrome_env(account_list):
85
- target = find_software_install_path('chrome')
86
- for account in account_list:
87
- store_key, port, *rest = account
88
- user_data = rest[0] if rest and rest[0] else fr'{default_chrome_user_data}\{port}'
89
- create_file_path(user_data)
90
- args = fr'--remote-debugging-port={port} --user-data-dir="{user_data}"'
91
- shortcut_name = f'{port}_{store_key}.lnk'
92
- create_shortcut_on_desktop(target_path=target, arguments=args, shortcut_name=shortcut_name)
93
-
94
- def create_shortcut_on_desktop(target_path, arguments='', shortcut_name='MyShortcut.lnk', icon_path=None):
95
- """
96
- 在桌面上创建快捷方式,若已存在指向相同 target + arguments 的快捷方式,则跳过创建。
97
- """
98
- # 获取当前用户桌面路径
99
- desktop_path = os.path.join(os.environ['USERPROFILE'], 'Desktop')
100
-
101
- shell = win32com.client.Dispatch('WScript.Shell')
102
-
103
- # 检查是否已有相同目标的快捷方式
104
- for file in os.listdir(desktop_path):
105
- if file.lower().endswith('.lnk'):
106
- shortcut_file = os.path.join(desktop_path, file)
107
- shortcut = shell.CreateShortCut(shortcut_file)
108
- if (os.path.normpath(shortcut.Targetpath) == os.path.normpath(target_path)
109
- and shortcut.Arguments.strip() == arguments.strip()):
110
- log("已存在指向该 target + args 的快捷方式,跳过创建")
111
- return
112
-
113
- # 创建新的快捷方式
114
- shortcut_path = os.path.join(desktop_path, shortcut_name)
115
- shortcut = shell.CreateShortCut(shortcut_path)
116
- shortcut.Targetpath = target_path
117
- shortcut.Arguments = arguments
118
- shortcut.WorkingDirectory = os.path.dirname(target_path)
119
- if icon_path:
120
- shortcut.IconLocation = icon_path
121
- shortcut.save()
122
- log(f"已创建快捷方式:{shortcut_path}")
123
-
124
- def check_chrome_dev(port=3000):
125
- try:
126
- url = f"http://127.0.0.1:{port}/json"
127
- response = requests.get(url, timeout=5) # 设置超时,避免长时间等待
128
- if response.status_code == 200:
129
- try:
130
- data = response.json()
131
- if data:
132
- # print("接口返回了数据:", data)
133
- print("接口返回了数据:")
134
- return True
135
- else:
136
- print("接口返回了空数据")
137
- return False
138
- except ValueError:
139
- print("返回的不是有效的 JSON")
140
- return False
141
- else:
142
- print(f"接口返回了错误状态码: {response.status_code}")
143
- return False
144
- except requests.RequestException as e:
145
- print(f"请求接口时发生错误: {e}")
146
- return False
147
-
148
- def is_chrome_running():
149
- try:
150
- output = subprocess.check_output('tasklist', shell=True, text=True)
151
- return 'chrome.exe' in output.lower()
152
- except subprocess.CalledProcessError:
153
- return False
154
-
155
- @contextmanager
156
- def get_chrome_page_v3(p, port=3000, user_data=None):
157
- browser = context = page = None
158
- is_custom_chrome_opened = False # 标记是否是程序自己开的浏览器
159
-
160
- try:
161
- if not check_chrome_dev(port):
162
- set_chrome_system_path()
163
- chrome_path = r'"chrome.exe"'
164
- debugging_port = fr"--remote-debugging-port={port}"
165
- if user_data is not None:
166
- chrome_user_data = fr'--user-data-dir="{user_data}"'
167
- else:
168
- chrome_user_data = fr'--user-data-dir="{create_file_path(default_chrome_user_data)}\{port}"'
169
-
170
- disable_webrtc = "--disable-features=WebRTC"
171
- disable_webrtc_hw_encoder = "--disable-features=WebRTC-HW-ENCODER"
172
- disable_webrtc_alt = "--disable-webrtc"
173
- start_maximized = "--start-maximized"
174
-
175
- command = f"{chrome_path} {debugging_port} {chrome_user_data} {disable_webrtc} {disable_webrtc_hw_encoder} {disable_webrtc_alt}"
176
- subprocess.Popen(command, shell=True)
177
- is_custom_chrome_opened = True
178
- time.sleep(1)
179
-
180
- browser = p.chromium.connect_over_cdp(f"http://127.0.0.1:{port}")
181
- context = browser.contexts[0] if browser.contexts else browser.new_context()
182
- page = context.pages[0] if context.pages else context.new_page()
183
-
184
- yield browser, context, page
185
-
186
- except Exception as e:
187
- # 向上抛出错误,否则主函数感知不到错误
188
- raise
189
-
190
- finally:
191
- for obj in [("page", page), ("context", context), ("browser", browser)]:
192
- name, target = obj
193
- try:
194
- if target and is_custom_chrome_opened:
195
- log(f'关闭: {name}')
196
- target.close()
197
- except Exception:
198
- pass # 你可以在这里加日志记录关闭失败
1
+ import os
2
+ import win32com.client
3
+ import winreg
4
+
5
+ import requests, subprocess, time
6
+ from contextlib import contextmanager
7
+
8
+ from .fun_base import log, create_file_path
9
+
10
+ default_chrome_user_data = 'D:\chrome_user_data'
11
+
12
+ def set_chrome_system_path():
13
+ path = os.path.dirname(find_software_install_path('chrome'))
14
+ add_to_system_path(path)
15
+
16
+ def add_to_system_path(path: str, scope: str = "user"):
17
+ """
18
+ 将指定路径添加到系统环境变量 Path 中
19
+ :param path: 要添加的路径(应为绝对路径)
20
+ :param scope: 'user' 表示用户变量,'system' 表示系统变量(需要管理员权限)
21
+ """
22
+ if not os.path.isabs(path):
23
+ raise ValueError("必须提供绝对路径")
24
+
25
+ path = os.path.normpath(path)
26
+
27
+ if scope == "user":
28
+ root = winreg.HKEY_CURRENT_USER
29
+ subkey = r"Environment"
30
+ elif scope == "system":
31
+ root = winreg.HKEY_LOCAL_MACHINE
32
+ subkey = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
33
+ else:
34
+ raise ValueError("scope 参数必须是 'user' 或 'system'")
35
+
36
+ try:
37
+ with winreg.OpenKey(root, subkey, 0, winreg.KEY_READ | winreg.KEY_WRITE) as key:
38
+ current_path, _ = winreg.QueryValueEx(key, "Path")
39
+ paths = current_path.split(";")
40
+
41
+ if path in paths:
42
+ print("路径已存在于 Path 中,无需添加: ", path)
43
+ return False
44
+
45
+ new_path = current_path + ";" + path
46
+ winreg.SetValueEx(key, "Path", 0, winreg.REG_EXPAND_SZ, new_path)
47
+ print("✅ 路径已成功添加到Path中: ", new_path)
48
+ return True
49
+
50
+ except PermissionError:
51
+ print("❌ 权限不足,系统变量修改需要管理员权限")
52
+ return False
53
+ except Exception as e:
54
+ print(f"❌ 添加失败: {e}")
55
+ return False
56
+
57
+ def find_software_install_path(app_keyword: str):
58
+ """从开始菜单或桌面查找指定软件的安装路径"""
59
+ possible_dirs = [
60
+ os.environ.get('PROGRAMDATA', '') + r'\Microsoft\Windows\Start Menu\Programs',
61
+ os.environ.get('APPDATA', '') + r'\Microsoft\Windows\Start Menu\Programs',
62
+ os.environ.get('USERPROFILE', '') + r'\Desktop',
63
+ os.environ.get('PUBLIC', '') + r'\Desktop'
64
+ ]
65
+
66
+ shell = win32com.client.Dispatch("WScript.Shell")
67
+
68
+ for base_dir in possible_dirs:
69
+ for root, _, files in os.walk(base_dir):
70
+ for file in files:
71
+ if file.lower().endswith('.lnk') and app_keyword.lower() in file.lower():
72
+ lnk_path = os.path.join(root, file)
73
+ try:
74
+ shortcut = shell.CreateShortcut(lnk_path)
75
+ target_path = shortcut.Targetpath
76
+ if os.path.exists(target_path):
77
+ return target_path
78
+ except Exception as e:
79
+ continue
80
+
81
+ log(f'未能查找到{str}安装位置')
82
+ return None
83
+
84
+ def init_chrome_env(account_list):
85
+ target = find_software_install_path('chrome')
86
+ for account in account_list:
87
+ store_key, port, *rest = account
88
+ user_data = rest[0] if rest and rest[0] else fr'{default_chrome_user_data}\{port}'
89
+ create_file_path(user_data)
90
+ args = fr'--remote-debugging-port={port} --user-data-dir="{user_data}"'
91
+ shortcut_name = f'{port}_{store_key}.lnk'
92
+ create_shortcut_on_desktop(target_path=target, arguments=args, shortcut_name=shortcut_name)
93
+
94
+ def create_shortcut_on_desktop(target_path, arguments='', shortcut_name='MyShortcut.lnk', icon_path=None):
95
+ """
96
+ 在桌面上创建快捷方式,若已存在指向相同 target + arguments 的快捷方式,则跳过创建。
97
+ """
98
+ # 获取当前用户桌面路径
99
+ desktop_path = os.path.join(os.environ['USERPROFILE'], 'Desktop')
100
+
101
+ shell = win32com.client.Dispatch('WScript.Shell')
102
+
103
+ # 检查是否已有相同目标的快捷方式
104
+ for file in os.listdir(desktop_path):
105
+ if file.lower().endswith('.lnk'):
106
+ shortcut_file = os.path.join(desktop_path, file)
107
+ shortcut = shell.CreateShortCut(shortcut_file)
108
+ if (os.path.normpath(shortcut.Targetpath) == os.path.normpath(target_path)
109
+ and shortcut.Arguments.strip() == arguments.strip()):
110
+ log("已存在指向该 target + args 的快捷方式,跳过创建")
111
+ return
112
+
113
+ # 创建新的快捷方式
114
+ shortcut_path = os.path.join(desktop_path, shortcut_name)
115
+ shortcut = shell.CreateShortCut(shortcut_path)
116
+ shortcut.Targetpath = target_path
117
+ shortcut.Arguments = arguments
118
+ shortcut.WorkingDirectory = os.path.dirname(target_path)
119
+ if icon_path:
120
+ shortcut.IconLocation = icon_path
121
+ shortcut.save()
122
+ log(f"已创建快捷方式:{shortcut_path}")
123
+
124
+ def check_chrome_dev(port=3000):
125
+ try:
126
+ url = f"http://127.0.0.1:{port}/json"
127
+ response = requests.get(url, timeout=5) # 设置超时,避免长时间等待
128
+ if response.status_code == 200:
129
+ try:
130
+ data = response.json()
131
+ if data:
132
+ # print("接口返回了数据:", data)
133
+ print("接口返回了数据:")
134
+ return True
135
+ else:
136
+ print("接口返回了空数据")
137
+ return False
138
+ except ValueError:
139
+ print("返回的不是有效的 JSON")
140
+ return False
141
+ else:
142
+ print(f"接口返回了错误状态码: {response.status_code}")
143
+ return False
144
+ except requests.RequestException as e:
145
+ print(f"请求接口时发生错误: {e}")
146
+ return False
147
+
148
+ def is_chrome_running():
149
+ try:
150
+ output = subprocess.check_output('tasklist', shell=True, text=True)
151
+ return 'chrome.exe' in output.lower()
152
+ except subprocess.CalledProcessError:
153
+ return False
154
+
155
+ @contextmanager
156
+ def get_chrome_page_v3(p, port=3000, user_data=None):
157
+ browser = context = page = None
158
+ is_custom_chrome_opened = False # 标记是否是程序自己开的浏览器
159
+
160
+ try:
161
+ if not check_chrome_dev(port):
162
+ set_chrome_system_path()
163
+ chrome_path = r'"chrome.exe"'
164
+ debugging_port = fr"--remote-debugging-port={port}"
165
+ if user_data is not None:
166
+ chrome_user_data = fr'--user-data-dir="{user_data}"'
167
+ else:
168
+ chrome_user_data = fr'--user-data-dir="{create_file_path(default_chrome_user_data)}\{port}"'
169
+
170
+ disable_webrtc = "--disable-features=WebRTC"
171
+ disable_webrtc_hw_encoder = "--disable-features=WebRTC-HW-ENCODER"
172
+ disable_webrtc_alt = "--disable-webrtc"
173
+ start_maximized = "--start-maximized"
174
+
175
+ command = f"{chrome_path} {debugging_port} {chrome_user_data} {disable_webrtc} {disable_webrtc_hw_encoder} {disable_webrtc_alt}"
176
+ subprocess.Popen(command, shell=True)
177
+ is_custom_chrome_opened = True
178
+ time.sleep(1)
179
+
180
+ browser = p.chromium.connect_over_cdp(f"http://127.0.0.1:{port}")
181
+ context = browser.contexts[0] if browser.contexts else browser.new_context()
182
+ page = context.pages[0] if context.pages else context.new_page()
183
+
184
+ yield browser, context, page
185
+
186
+ except Exception as e:
187
+ # 向上抛出错误,否则主函数感知不到错误
188
+ raise
189
+
190
+ finally:
191
+ for obj in [("page", page), ("context", context), ("browser", browser)]:
192
+ name, target = obj
193
+ try:
194
+ if target and is_custom_chrome_opened:
195
+ log(f'关闭: {name}')
196
+ target.close()
197
+ except Exception:
198
+ pass # 你可以在这里加日志记录关闭失败
File without changes