fix: crash

This commit is contained in:
2026-04-01 15:12:22 +08:00
parent 714818bb15
commit 6e46b8faf5
2 changed files with 38 additions and 9 deletions

View File

@@ -1,5 +1,5 @@
<link rel="icon" href="https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/files/python-logo-only.svg" type="image/svg+xml"> <link rel="icon" href="https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/files/python-logo-only.svg" type="image/svg+xml">
<title>Opportunity Exporter</title> <title>Opportunity Export</title>
<textarea id="messages" name="messages" rows="45" cols="100" readonly> <textarea id="messages" name="messages" rows="45" cols="100" readonly>
</textarea> </textarea>
@@ -9,6 +9,12 @@ function main(url, parameters) {
let ws = new WebSocket(url); let ws = new WebSocket(url);
let messages = document.querySelector("#messages"); let messages = document.querySelector("#messages");
let account = new String(parameters['account']);
let name = account.split('@', 1).pop() ?? 'unknown';
name = name.charAt(0).toLocaleUpperCase() + name.slice(1);
document.title = `${name} (${account})`;
ws.addEventListener('message', (e) => { ws.addEventListener('message', (e) => {
object = JSON.parse(e.data); object = JSON.parse(e.data);
lines = Array.from(object.result); lines = Array.from(object.result);

39
main.py
View File

@@ -81,9 +81,28 @@ class History(logging.Handler):
self.records.clear() self.records.clear()
return copy return copy
class ConnectionContext:
def __enter__(self):
self.healthcheck()
return self
def __exit__(self, exc_type, exc, tb):
self.healthcheck()
return True
class Error(Exception):
pass
@classmethod
def healthcheck(cls):
if connection.closed is not None:
raise cls.Error()
def main(driver: WebDriver, logger = logging.getLogger('main')): def main(driver: WebDriver, logger = logging.getLogger('main')):
try: try:
http = PoolManager() http = PoolManager()
context = ConnectionContext()
driver.get(str(Path('index.html').resolve())) driver.get(str(Path('index.html').resolve()))
endpoint = server.listeners[0] endpoint = server.listeners[0]
parameters = vars(args) parameters = vars(args)
@@ -109,9 +128,10 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
return True return True
def sleep(seconds: float): def sleep(seconds: float):
try: WebDriverWait(driver, seconds, seconds).until(lambda _: False) with context:
except: pass try: WebDriverWait(driver, seconds, seconds).until(lambda _: False)
return True except: pass
return True
def locate(selector, wait=True, condition=EC.visibility_of_element_located) -> WebElement: def locate(selector, wait=True, condition=EC.visibility_of_element_located) -> WebElement:
while True: while True:
@@ -154,8 +174,12 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
try: try:
until(lambda x: 'loginProgress' in x.find_element(By.TAG_NAME, "body").get_attribute('class'), watch=False) until(lambda x: 'loginProgress' in x.find_element(By.TAG_NAME, "body").get_attribute('class'), watch=False)
locate("input.account").send_keys(parameters.get('account')) account = str(parameters.get('account'))
locate("input#password").send_keys(parameters.get('password')) password = str(parameters.get('password'))
logger.info('Logging in as %s (%s)', account.split('@', 1).pop(0).capitalize(), account)
locate("input.account").send_keys(account)
locate("input#password").send_keys(password)
click("input.agree-checkbox") click("input.agree-checkbox")
click("button.login-btn") click("button.login-btn")
except Exception as e: except Exception as e:
@@ -165,14 +189,14 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
logger.info('Waiting for authentication to complete...') logger.info('Waiting for authentication to complete...')
while True: while True:
try: try:
locate("#container", False) locate("#container", wait=False)
logger.info('Done') logger.info('Done')
break break
except: except:
sleep(3) sleep(3)
ready = False ready = False
sidebar = locate(".new-layout-left", False) sidebar = locate(".new-layout-left")
driver.execute_script("arguments[0].remove();", sidebar) driver.execute_script("arguments[0].remove();", sidebar)
def handle(request: NetworkRequest): def handle(request: NetworkRequest):
@@ -288,7 +312,6 @@ async def handler(request: ws.WebSocketRequest, logger = logging.getLogger('webs
if connection is None: if connection is None:
connection = websocket connection = websocket
logger.info('Connection established')
else: else:
await websocket.aclose(code=1000, reason="Non-singular connection prohibited") await websocket.aclose(code=1000, reason="Non-singular connection prohibited")
return return