diff --git a/index.html b/index.html
index 2d84311..5706a2c 100644
--- a/index.html
+++ b/index.html
@@ -400,12 +400,23 @@ $$$('#subcategory', '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);
$('#limit').value = size;
$('#offset').max = size;
$('#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) {
@@ -523,10 +534,10 @@ function main(url, parameters, locales) {
if (Status === 'RUNNING') {
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));
$('#progressLabel').innerText = `${index} / ${limit} (${percentage} %)`;
-
let uptime = Timer.getTimedelta();
$('#uptimeLabel').innerText = uptime.format("HH:mm:ss");
diff --git a/main.py b/main.py
index 74a5f12..77e1dd8 100644
--- a/main.py
+++ b/main.py
@@ -10,7 +10,7 @@ import re
import trio
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.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
@@ -22,7 +22,7 @@ from selenium.webdriver.remote.webdriver import WebDriver
from io import BytesIO
from enum import Enum
-from queue import Queue, Empty
+from queue import Queue, Empty, ShutDown
from wakepy import keep
from pathlib import Path
from datetime import datetime, timedelta
@@ -30,18 +30,18 @@ from zoneinfo import ZoneInfo
from threading import Thread
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('--column-address', type=str, nargs='?', default='邮箱')
-parser.add_argument('--column-name', type=str, nargs='?', default='主要联系人')
-parser.add_argument('--column-code', type=str, nargs='?', default='客户编号')
-parser.add_argument('--column-pays', type=str, nargs='?', default='国家地区')
-parser.add_argument('--column-sent', type=str, nargs='?', default='已发送')
-parser.add_argument('-a', '--address', type=str, nargs='?')
-parser.add_argument('-p', '--password', type=str, nargs='?')
-parser.add_argument('-t', '--timeout', type=int, nargs='?', default=60)
-parser.add_argument('-i', '--interval', type=int, nargs='?', default=10)
-parser.add_argument('-r', '--attempts', type=int, nargs='?', default=3)
+parser.add_argument('--column-address', type=str, default='邮箱')
+parser.add_argument('--column-name', type=str, default='主要联系人')
+parser.add_argument('--column-code', type=str, default='客户编号')
+parser.add_argument('--column-pays', type=str, default='国家地区')
+parser.add_argument('--column-sent', type=str, default='已发送')
+parser.add_argument('-a', '--address', type=str)
+parser.add_argument('-p', '--password', type=str)
+parser.add_argument('-t', '--timeout', type=int, default=60)
+parser.add_argument('-i', '--interval', type=int, default=10)
+parser.add_argument('-r', '--attempts', type=int, default=3)
args = parser.parse_args()
inbox, outbox = Queue(), Queue()
@@ -333,6 +333,7 @@ def main(driver: WebDriver):
cursor = 0
status = Status.ACTIVE
occurrences = {}
+ request = None
sent = 0
errors = 0
warnings = 0
@@ -475,8 +476,8 @@ def main(driver: WebDriver):
break
except Faillable as o:
request = o.request
- except KeyboardInterrupt:
- tell('程序中断', level=1)
+ except (KeyboardInterrupt, ShutDown, InvalidSessionIdException) as e:
+ tell('程序中断', e, level=1)
status = Status.TERMINATED
break
except Exception as e:
@@ -572,9 +573,6 @@ if __name__ == '__main__':
opts.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = Chrome(opts)
status = main(driver)
- except KeyboardInterrupt:
- tell('程序中断', level=1)
- status = 145
except Exception as e:
tell('致命错误', e, level=0)
status = 1