From e3b61b0742f8adb1de3b905373ff79e84af73f79 Mon Sep 17 00:00:00 2001 From: eneller Date: Sun, 13 Apr 2025 22:13:25 +0200 Subject: [PATCH] feat: subcommands --- main.py | 83 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/main.py b/main.py index 7e3cb81..283789f 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,6 @@ import asyncclick as click import questionary from playwright.async_api import async_playwright, Playwright -import re import asyncio from time import sleep @@ -17,6 +16,16 @@ async def selection_or_walk(options): if selection == walkstr: return Selection.TREE_WALK , None return Selection.ITEM_SELECTED, selection +async def run_playwright(headless: bool): + async with async_playwright() as playwright: + browser = await playwright.chromium.launch(headless=headless) + context = await browser.new_context() + page = await context.new_page() + yield page, browser, context + await page.close() + await context.close() + await browser.close() + @click.group() @click.option('--username','-u') @click.option('--password','-p') @@ -24,59 +33,51 @@ async def selection_or_walk(options): @click.pass_context async def cli(ctx, username, password, headful): ctx.ensure_object(dict) - ctx.obj['USERNAME'] = username - ctx.obj['PASSWORD'] = password + ctx.obj['USERNAME'] = username or await questionary.text('Enter your kiz username:').ask_async() + ctx.obj['PASSWORD'] = password or await questionary.password('Enter your kiz password:').ask_async() ctx.obj['HEADLESS'] = not headful - async with async_playwright() as playwright: - browser = await playwright.chromium.launch(headless=headful) - context = await browser.new_context() - page = await context.new_page() - ctx.obj['PAGE'] = page - yield # Subcommands run here - await page.close() - await context.close() - await browser.close() - @cli.command() @click.pass_context async def campusonline(ctx): username = ctx.obj['USERNAME'] password = ctx.obj['PASSWORD'] - page = ctx.obj['PAGE'] - click.echo("Running campusonline...") - await page.goto("https://campusonline.uni-ulm.de") - await page.get_by_role("textbox", name="Benutzerkennung").click() - await page.get_by_role("textbox", name="Benutzerkennung").fill(username) - await page.get_by_role("textbox", name="Passwort").fill(password) - await page.get_by_role("button", name="Anmelden").click() - await page.get_by_role("link", name="Studium").click() - await page.get_by_role("link", name="Modulbeschreibungen ansehen").click() - options = await page.locator('css=li.treelist').all_inner_texts() - selection = await selection_or_walk(options) - print(selection) - sleep(2) - click.echo("Finished campusonline.") + headless = ctx.obj['HEADLESS'] + async for page, browser, context in run_playwright(headless): + click.echo("Running campusonline...") + await page.goto("https://campusonline.uni-ulm.de") + await page.get_by_role("textbox", name="Benutzerkennung").click() + await page.get_by_role("textbox", name="Benutzerkennung").fill(username) + await page.get_by_role("textbox", name="Passwort").fill(password) + await page.get_by_role("button", name="Anmelden").click() + await page.get_by_role("link", name="Studium").click() + await page.get_by_role("link", name="Modulbeschreibungen ansehen").click() + options = await page.locator('css=li.treelist').all_inner_texts() + selection = await selection_or_walk(options) + print(selection) + sleep(2) + click.echo("Finished campusonline.") @cli.command() @click.pass_context async def coronang(ctx): username = ctx.obj['USERNAME'] password = ctx.obj['PASSWORD'] - page = ctx.obj['PAGE'] - click.echo("Running coronang...") - await page.goto("https://campusonline.uni-ulm.de/CoronaNG/user/mycorona.html") - await page.locator("input[name=\"uid\"]").click() - await page.locator("input[name=\"uid\"]").fill(username) - await page.locator("input[name=\"password\"]").click() - await page.locator("input[name=\"password\"]").fill(password) - await page.get_by_role("button", name="Anmelden").click() - await page.get_by_role("link", name="Beobachtungen & Teilnahmen").click() - await page.get_by_role("table", name="Ihre Beobachtungen. Sie kö").get_by_role("button").click() - await page.get_by_role("table", name="Ihre Beobachtungen. Sie kö").get_by_role("combobox").select_option("5") - await page.get_by_role("cell", name="An Markierten teilnehmen Ausf").get_by_role("button").click() - await page.reload() - click.echo("Finished coronang.") + headless = ctx.obj['HEADLESS'] + async for page, browser, context in run_playwright(headless): + click.echo("Running coronang...") + await page.goto("https://campusonline.uni-ulm.de/CoronaNG/user/mycorona.html") + await page.locator("input[name=\"uid\"]").click() + await page.locator("input[name=\"uid\"]").fill(username) + await page.locator("input[name=\"password\"]").click() + await page.locator("input[name=\"password\"]").fill(password) + await page.get_by_role("button", name="Anmelden").click() + await page.get_by_role("link", name="Beobachtungen & Teilnahmen").click() + await page.get_by_role("table", name="Ihre Beobachtungen. Sie kö").get_by_role("button").click() + await page.get_by_role("table", name="Ihre Beobachtungen. Sie kö").get_by_role("combobox").select_option("5") + await page.get_by_role("cell", name="An Markierten teilnehmen Ausf").get_by_role("button").click() + await page.reload() + click.echo("Finished coronang.") if __name__ == "__main__": asyncio.run(cli.main()) \ No newline at end of file