Skip to content

Commit 07d0df6

Browse files
committed
fix: Handle zombie processes and update docs
- Add 'init: true' to docker-compose and '--init' to README to reap zombie processes. - Refactor 'sgcc_client.py' to ensure driver cleanup via try-finally block. - Update README with detailed 'SLIDER_OFFSET' guidance and schedule info.
1 parent 02b6b45 commit 07d0df6

4 files changed

Lines changed: 79 additions & 67 deletions

File tree

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
```bash
3535
docker run -d \
36+
--init \
3637
--name 95598-mqtt \
3738
--restart unless-stopped \
3839
-v $(pwd)/data:/data \
@@ -96,8 +97,10 @@ python3 startup.py
9697
| `MQTT_PORT` | MQTT 端口 | `1883` |
9798
| `MQTT_USER` | MQTT 用户名 | (空) |
9899
| `MQTT_PASSWORD` | MQTT 密码 | (空) |
99-
| `JOB_START_TIME` | 每天定时运行时间 | `07:00` |
100-
| `SLIDER_OFFSET` | 验证码滑块偏移微调(-2 ~ 20) | `5` |
100+
| `JOB_START_TIME` | 每天定时运行时间(12小时循环) | `07:00` |
101+
| `SLIDER_OFFSET` | 验证码滑块偏移微调(-2 ~ 20) | `8` |
101102
| `IGNORE_USER_ID` | 忽略的户号(逗号分隔) | (空) |
102103

103-
*SLIDER_OFFSET 这个参数非常重要!如果持续登录报错,请观看 errors 文件夹内的失败视频,酌情调整此参数*
104+
*SLIDER_OFFSET 这个参数非常重要!*
105+
*如果持续登录报错,请观看 errors 文件夹内的失败视频,酌情调整此参数*
106+
*此参数在不同设备不同架构不同环境内的值不完全相同,但只要设置合理成功登录后,基本不会发生变化*

docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
services:
22
95598-mqtt:
3+
init: true
34
image: ghcr.io/goxofy/95598-mqtt:main
45
container_name: 95598-mqtt
56
restart: unless-stopped

example.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ DB_NAME=95598.db
2222
DRIVER_IMPLICITY_WAIT_TIME=60
2323
LOGIN_EXPECTED_TIME=10
2424
RETRY_WAIT_TIME_OFFSET_UNIT=10
25-
SLIDER_OFFSET=2
25+
SLIDER_OFFSET=8
2626
CHROME_BINARY_PATH=
2727
CHROMEDRIVER_PATH=
2828
DATA_RETENTION_DAYS=7

sgcc_client.py

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -387,74 +387,82 @@ def perform_login(self, driver):
387387

388388
def run(self):
389389
driver = self.init_driver()
390-
ScreenshotOnFailure.set_driver(driver)
391-
392-
# Force window size for headless mode
393-
driver.set_window_size(1920, 1080)
394-
size = driver.get_window_size()
395-
pixel_ratio = driver.execute_script("return window.devicePixelRatio;")
396-
logging.info(f"Driver initialized. Window size: {size}, DevicePixelRatio: {pixel_ratio}")
397-
398-
# Start Screen Recording
399-
from recorder import ScreenRecorder
400-
timestamp = time.strftime("%Y%m%d_%H%M%S")
401-
video_path = f"./errors/record_{timestamp}.avi"
402-
recorder = ScreenRecorder(driver, video_path, fps=3.0)
403-
recorder.start()
404-
405-
publisher = MQTTPublisher()
406-
407390
try:
408-
if self.perform_login(driver):
409-
logging.info("Login successful!")
410-
# Stop recording immediately after success
391+
ScreenshotOnFailure.set_driver(driver)
392+
393+
# Force window size for headless mode
394+
driver.set_window_size(1920, 1080)
395+
size = driver.get_window_size()
396+
pixel_ratio = driver.execute_script("return window.devicePixelRatio;")
397+
logging.info(f"Driver initialized. Window size: {size}, DevicePixelRatio: {pixel_ratio}")
398+
399+
# Start Screen Recording
400+
from recorder import ScreenRecorder
401+
timestamp = time.strftime("%Y%m%d_%H%M%S")
402+
video_path = f"./errors/record_{timestamp}.avi"
403+
recorder = ScreenRecorder(driver, video_path, fps=3.0)
404+
recorder.start()
405+
406+
publisher = MQTTPublisher()
407+
408+
try:
409+
if self.perform_login(driver):
410+
logging.info("Login successful!")
411+
# Stop recording immediately after success
412+
recorder.stop()
413+
414+
# Delete video if successful (User request)
415+
try:
416+
if os.path.exists(video_path):
417+
os.remove(video_path)
418+
logging.info(f"Login successful, deleted recording: {video_path}")
419+
except Exception as e:
420+
logging.warning(f"Failed to delete recording: {e}")
421+
else:
422+
logging.error("Login failed!")
423+
recorder.stop()
424+
return
425+
except Exception as e:
426+
logging.error(f"Login exception: {e}")
411427
recorder.stop()
412-
413-
# Delete video if successful (User request)
428+
return
429+
430+
time.sleep(self.retry_delay)
431+
user_ids = self.get_user_ids(driver)
432+
logging.info(f"Found users: {user_ids}")
433+
434+
for index, user_id in enumerate(user_ids):
435+
if user_id in self.ignored_users:
436+
logging.info(f"Skipping ignored user: {user_id}")
437+
continue
438+
414439
try:
415-
if os.path.exists(video_path):
416-
os.remove(video_path)
417-
logging.info(f"Login successful, deleted recording: {video_path}")
440+
driver.get(URL_BALANCE)
441+
time.sleep(self.retry_delay)
442+
self.select_user(driver, index)
443+
time.sleep(self.retry_delay)
444+
445+
data = self.collect_data(driver, user_id, index)
446+
publisher.publish_user_data(user_id, *data)
447+
448+
time.sleep(self.retry_delay)
418449
except Exception as e:
419-
logging.warning(f"Failed to delete recording: {e}")
420-
else:
421-
logging.error("Login failed!")
422-
recorder.stop()
423-
driver.quit()
424-
return
425-
except Exception as e:
426-
logging.error(f"Login exception: {e}")
450+
logging.error(f"Failed to process user {user_id}: {e}")
451+
continue
452+
453+
logging.info("All tasks completed successfully.")
454+
self.cleanup_debug_images()
427455
recorder.stop()
428-
driver.quit()
429-
return
430-
431-
time.sleep(self.retry_delay)
432-
user_ids = self.get_user_ids(driver)
433-
logging.info(f"Found users: {user_ids}")
434-
435-
for index, user_id in enumerate(user_ids):
436-
if user_id in self.ignored_users:
437-
logging.info(f"Skipping ignored user: {user_id}")
438-
continue
439-
440-
try:
441-
driver.get(URL_BALANCE)
442-
time.sleep(self.retry_delay)
443-
self.select_user(driver, index)
444-
time.sleep(self.retry_delay)
445-
446-
data = self.collect_data(driver, user_id, index)
447-
publisher.publish_user_data(user_id, *data)
448-
449-
time.sleep(self.retry_delay)
450-
except Exception as e:
451-
logging.error(f"Failed to process user {user_id}: {e}")
452-
continue
453-
454-
logging.info("All tasks completed successfully.")
455-
self.cleanup_debug_images()
456-
recorder.stop()
457-
driver.quit()
456+
457+
except Exception as e:
458+
logging.error(f"Unexpected error in run: {e}")
459+
finally:
460+
if driver:
461+
logging.info("Quitting driver...")
462+
try:
463+
driver.quit()
464+
except Exception as e:
465+
logging.error(f"Error quitting driver: {e}")
458466

459467
def cleanup_debug_images(self):
460468
try:

0 commit comments

Comments
 (0)