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.
Files changed (19) hide show
  1. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/PKG-INFO +1 -1
  2. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/pyproject.toml +1 -1
  3. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/base_api.py +46 -3
  4. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/google_ai_studio_api.py +11 -3
  5. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/PKG-INFO +1 -1
  6. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/README.md +0 -0
  7. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/setup.cfg +0 -0
  8. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/__init__.py +0 -0
  9. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/cli.py +0 -0
  10. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/deepseek_api.py +0 -0
  11. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/exceptions.py +0 -0
  12. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/browser_ai/factory.py +0 -0
  13. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/SOURCES.txt +0 -0
  14. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/dependency_links.txt +0 -0
  15. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/entry_points.txt +0 -0
  16. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/requires.txt +0 -0
  17. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/src/majorchik_api.egg-info/top_level.txt +0 -0
  18. {majorchik_api-0.0.4 → majorchik_api-0.0.4.2}/tests/test_setup_profile.py +0 -0
  19. {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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "majorchik-api"
7
- version = "0.0.4"
7
+ version = "0.0.4.2"
8
8
  authors = [
9
9
  {name = "GO Software", email = "gosoftware2025@gmail.com"},
10
10
  ]
@@ -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
- import subprocess
138
- subprocess.call(["taskkill", "/F", "/T", "/PID", str(self.process.pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
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
- self.process.wait(timeout=3)
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
- import subprocess
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
- self.process.wait(timeout=3)
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