update: better exception handling
This commit is contained in:
17
index.html
17
index.html
@@ -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
34
main.py
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user