update: better exception handling

This commit is contained in:
2025-09-09 18:04:08 +08:00
parent 355cdbd2e6
commit eefde34f8c
2 changed files with 30 additions and 21 deletions

View File

@@ -400,12 +400,23 @@ $$$('#subcategory', 'change', (e) => {
}); });
$$$('#chunk_size', 'change', (e) => { $$$('#chunk_size', 'change', (e) => {
let limit = $('#subcategory').disabled ? Limit : Number(subcategory.dataset.limit); let limit = Number($('#subcategory').dataset.limit) || Limit;
let size = Math.floor(limit / e.target.value); let size = Math.floor(limit / e.target.value);
$('#limit').value = size; $('#limit').value = size;
$('#offset').max = size; $('#offset').max = size;
$('#offset').value = 0; $('#offset').value = 0;
$('#offset').dispatchEvent(new Event('change'));
});
$$$('#offset', 'change', (e) => {
let limit = Number($('#subcategory').dataset.limit) || Limit;
let size = Number($('#chunk_size').value) || 0;
if ($('#slice').checked) {
limit = Math.min(size, limit - size * Number(e.target.value));
}
e.target.dataset.limit = limit;
}); });
function main(url, parameters, locales) { function main(url, parameters, locales) {
@@ -523,10 +534,10 @@ function main(url, parameters, locales) {
if (Status === 'RUNNING') { if (Status === 'RUNNING') {
let index = Number($('#progressLabel').dataset.index) || 0; let index = Number($('#progressLabel').dataset.index) || 0;
let limit = Number($('#subcategory').dataset.limit) || Limit; let limit = Number($('#offset').dataset.limit) || 0;
let percentage = parseFloat((index / limit * 100).toFixed(2)); let percentage = parseFloat((index / limit * 100).toFixed(2));
$('#progressLabel').innerText = `${index} / ${limit} (${percentage} %)`; $('#progressLabel').innerText = `${index} / ${limit} (${percentage} %)`;
let uptime = Timer.getTimedelta(); let uptime = Timer.getTimedelta();
$('#uptimeLabel').innerText = uptime.format("HH:mm:ss"); $('#uptimeLabel').innerText = uptime.format("HH:mm:ss");

34
main.py
View File

@@ -10,7 +10,7 @@ import re
import trio import trio
import trio_websocket as ws import trio_websocket as ws
from selenium.common.exceptions import StaleElementReferenceException, TimeoutException from selenium.common.exceptions import StaleElementReferenceException, TimeoutException, InvalidSessionIdException
from selenium.webdriver import Chrome, ChromeOptions from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
@@ -22,7 +22,7 @@ from selenium.webdriver.remote.webdriver import WebDriver
from io import BytesIO from io import BytesIO
from enum import Enum from enum import Enum
from queue import Queue, Empty from queue import Queue, Empty, ShutDown
from wakepy import keep from wakepy import keep
from pathlib import Path from pathlib import Path
from datetime import datetime, timedelta from datetime import datetime, timedelta
@@ -30,18 +30,18 @@ from zoneinfo import ZoneInfo
from threading import Thread from threading import Thread
from nameparser import HumanName from nameparser import HumanName
parser = argparse.ArgumentParser(description="邮件批量发送脚本") parser = argparse.ArgumentParser(description="Bulk Email Sending")
parser.add_argument('url', nargs='?', default='https://id.ionos.fr/identifier') parser.add_argument('url', nargs='?', default='https://id.ionos.fr/identifier')
parser.add_argument('--column-address', type=str, nargs='?', default='邮箱') parser.add_argument('--column-address', type=str, default='邮箱')
parser.add_argument('--column-name', type=str, nargs='?', default='主要联系人') parser.add_argument('--column-name', type=str, default='主要联系人')
parser.add_argument('--column-code', type=str, nargs='?', default='客户编号') parser.add_argument('--column-code', type=str, default='客户编号')
parser.add_argument('--column-pays', type=str, nargs='?', default='国家地区') parser.add_argument('--column-pays', type=str, default='国家地区')
parser.add_argument('--column-sent', type=str, nargs='?', default='已发送') parser.add_argument('--column-sent', type=str, default='已发送')
parser.add_argument('-a', '--address', type=str, nargs='?') parser.add_argument('-a', '--address', type=str)
parser.add_argument('-p', '--password', type=str, nargs='?') parser.add_argument('-p', '--password', type=str)
parser.add_argument('-t', '--timeout', type=int, nargs='?', default=60) parser.add_argument('-t', '--timeout', type=int, default=60)
parser.add_argument('-i', '--interval', type=int, nargs='?', default=10) parser.add_argument('-i', '--interval', type=int, default=10)
parser.add_argument('-r', '--attempts', type=int, nargs='?', default=3) parser.add_argument('-r', '--attempts', type=int, default=3)
args = parser.parse_args() args = parser.parse_args()
inbox, outbox = Queue(), Queue() inbox, outbox = Queue(), Queue()
@@ -333,6 +333,7 @@ def main(driver: WebDriver):
cursor = 0 cursor = 0
status = Status.ACTIVE status = Status.ACTIVE
occurrences = {} occurrences = {}
request = None
sent = 0 sent = 0
errors = 0 errors = 0
warnings = 0 warnings = 0
@@ -475,8 +476,8 @@ def main(driver: WebDriver):
break break
except Faillable as o: except Faillable as o:
request = o.request request = o.request
except KeyboardInterrupt: except (KeyboardInterrupt, ShutDown, InvalidSessionIdException) as e:
tell('程序中断', level=1) tell('程序中断', e, level=1)
status = Status.TERMINATED status = Status.TERMINATED
break break
except Exception as e: except Exception as e:
@@ -572,9 +573,6 @@ if __name__ == '__main__':
opts.add_experimental_option("excludeSwitches", ["enable-logging"]) opts.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = Chrome(opts) driver = Chrome(opts)
status = main(driver) status = main(driver)
except KeyboardInterrupt:
tell('程序中断', level=1)
status = 145
except Exception as e: except Exception as e:
tell('致命错误', e, level=0) tell('致命错误', e, level=0)
status = 1 status = 1