majorchik-api 0.0.4__tar.gz → 0.0.4.2__tar.gz
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.
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/PKG-INFO +1 -1
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/pyproject.toml +1 -1
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/base_api.py +46 -3
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/google_ai_studio_api.py +11 -3
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/PKG-INFO +1 -1
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/README.md +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/setup.cfg +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/__init__.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/cli.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/deepseek_api.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/exceptions.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/factory.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/SOURCES.txt +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/dependency_links.txt +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/entry_points.txt +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/requires.txt +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/top_level.txt +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/tests/test_setup_profile.py +0 -0
- {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/tests/test_upload.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: majorchik-api
|
|
3
|
-
Version: 0.0.4
|
|
3
|
+
Version: 0.0.4.2
|
|
4
4
|
Summary: Пакет для взаимодействия с современными нейросетями (Gemini, DeepSeek) через автоматизацию браузера
|
|
5
5
|
Author-email: GO Software <gosoftware2025@gmail.com>
|
|
6
6
|
Requires-Python: >=3.8
|
|
@@ -54,6 +54,7 @@ class BaseWebAPI(ABC):
|
|
|
54
54
|
raise Exception("Не удалось найти Google Chrome в системе. Установите его для авторизации.")
|
|
55
55
|
|
|
56
56
|
os.makedirs(self.profile_dir, exist_ok=True)
|
|
57
|
+
self._clean_exit_state()
|
|
57
58
|
self.process = subprocess.Popen([
|
|
58
59
|
chrome_path,
|
|
59
60
|
f"--user-data-dir={self.profile_dir}",
|
|
@@ -81,6 +82,8 @@ class BaseWebAPI(ABC):
|
|
|
81
82
|
if self.disable_images:
|
|
82
83
|
args.append("--blink-settings=imagesEnabled=false")
|
|
83
84
|
|
|
85
|
+
self._clean_exit_state()
|
|
86
|
+
|
|
84
87
|
try:
|
|
85
88
|
self.browser = self.playwright.chromium.launch_persistent_context(
|
|
86
89
|
user_data_dir=self.profile_dir,
|
|
@@ -133,12 +136,22 @@ class BaseWebAPI(ABC):
|
|
|
133
136
|
if hasattr(self, 'process') and self.process:
|
|
134
137
|
try:
|
|
135
138
|
import sys
|
|
139
|
+
import subprocess
|
|
136
140
|
if sys.platform == "win32":
|
|
137
|
-
|
|
138
|
-
subprocess.call(["taskkill", "/
|
|
141
|
+
# Мягкое закрытие окна
|
|
142
|
+
subprocess.call(["taskkill", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
139
143
|
else:
|
|
140
144
|
self.process.terminate()
|
|
141
|
-
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
# Ждем до 5 секунд, пока браузер корректно сохранит данные и закроется
|
|
148
|
+
self.process.wait(timeout=5)
|
|
149
|
+
except subprocess.TimeoutExpired:
|
|
150
|
+
# Если завис, убиваем принудительно
|
|
151
|
+
if sys.platform == "win32":
|
|
152
|
+
subprocess.call(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
153
|
+
else:
|
|
154
|
+
self.process.kill()
|
|
142
155
|
except:
|
|
143
156
|
pass
|
|
144
157
|
self.process = None
|
|
@@ -151,3 +164,33 @@ class BaseWebAPI(ABC):
|
|
|
151
164
|
try: self.playwright.stop()
|
|
152
165
|
except: pass
|
|
153
166
|
self.playwright = None
|
|
167
|
+
|
|
168
|
+
def _clean_exit_state(self):
|
|
169
|
+
"""Сбрасывает статус краша в файле Preferences профиля, чтобы избежать окна 'Восстановить страницы?'."""
|
|
170
|
+
import json
|
|
171
|
+
|
|
172
|
+
pref_paths = [
|
|
173
|
+
os.path.join(self.profile_dir, "Default", "Preferences"),
|
|
174
|
+
os.path.join(self.profile_dir, "Preferences")
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
for pref_path in pref_paths:
|
|
178
|
+
if os.path.exists(pref_path):
|
|
179
|
+
try:
|
|
180
|
+
with open(pref_path, 'r', encoding='utf-8') as f:
|
|
181
|
+
data = json.load(f)
|
|
182
|
+
|
|
183
|
+
changed = False
|
|
184
|
+
if "profile" in data:
|
|
185
|
+
if data["profile"].get("exit_type") != "Normal":
|
|
186
|
+
data["profile"]["exit_type"] = "Normal"
|
|
187
|
+
changed = True
|
|
188
|
+
if not data["profile"].get("exited_cleanly", True):
|
|
189
|
+
data["profile"]["exited_cleanly"] = True
|
|
190
|
+
changed = True
|
|
191
|
+
|
|
192
|
+
if changed:
|
|
193
|
+
with open(pref_path, 'w', encoding='utf-8') as f:
|
|
194
|
+
json.dump(data, f)
|
|
195
|
+
except Exception:
|
|
196
|
+
pass
|
|
@@ -53,6 +53,7 @@ class GoogleAIStudioAPI(BaseWebAPI):
|
|
|
53
53
|
raise Exception("Не удалось найти Google Chrome в системе. Установите его для авторизации.")
|
|
54
54
|
|
|
55
55
|
os.makedirs(self.profile_dir, exist_ok=True)
|
|
56
|
+
self._clean_exit_state()
|
|
56
57
|
self.process = subprocess.Popen([
|
|
57
58
|
chrome_path,
|
|
58
59
|
f"--user-data-dir={self.profile_dir}",
|
|
@@ -71,12 +72,19 @@ class GoogleAIStudioAPI(BaseWebAPI):
|
|
|
71
72
|
if hasattr(self, 'process') and self.process:
|
|
72
73
|
try:
|
|
73
74
|
import sys
|
|
75
|
+
import subprocess
|
|
74
76
|
if sys.platform == "win32":
|
|
75
|
-
|
|
76
|
-
subprocess.call(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
77
|
+
subprocess.call(["taskkill", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
77
78
|
else:
|
|
78
79
|
self.process.terminate()
|
|
79
|
-
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
self.process.wait(timeout=5)
|
|
83
|
+
except subprocess.TimeoutExpired:
|
|
84
|
+
if sys.platform == "win32":
|
|
85
|
+
subprocess.call(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
86
|
+
else:
|
|
87
|
+
self.process.kill()
|
|
80
88
|
except:
|
|
81
89
|
pass
|
|
82
90
|
self.process = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: majorchik-api
|
|
3
|
-
Version: 0.0.4
|
|
3
|
+
Version: 0.0.4.2
|
|
4
4
|
Summary: Пакет для взаимодействия с современными нейросетями (Gemini, DeepSeek) через автоматизацию браузера
|
|
5
5
|
Author-email: GO Software <gosoftware2025@gmail.com>
|
|
6
6
|
Requires-Python: >=3.8
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|