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