From 4788d1ae9765cfb17da78d395fb25c93c3d3e343 Mon Sep 17 00:00:00 2001 From: eneller Date: Sun, 13 Apr 2025 18:48:54 +0200 Subject: [PATCH] better selection --- main.py | 101 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 43 deletions(-) diff --git a/main.py b/main.py index 451ca07..7e3cb81 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +from enum import Enum import asyncclick as click import questionary from playwright.async_api import async_playwright, Playwright @@ -6,62 +7,76 @@ import re import asyncio from time import sleep + +Selection = Enum('Selection', ['TREE_WALK', 'TREE_LEAF', 'ITEM_SELECTED']) + async def selection_or_walk(options): - options = list(map(str.strip, options)) walkstr = 'Walk the Tree from here' - options.append(walkstr) + options = [questionary.Choice(title=walkstr, checked=True)] + [questionary.Choice(opt.strip()) for opt in options] selection = await questionary.select(choices=options, message='Select one of the following options').ask_async() - if selection == walkstr: return None - return selection + if selection == walkstr: return Selection.TREE_WALK , None + return Selection.ITEM_SELECTED, selection +@click.group() +@click.option('--username','-u') +@click.option('--password','-p') +@click.option('--headful', is_flag=True) +@click.pass_context +async def cli(ctx, username, password, headful): + ctx.ensure_object(dict) + ctx.obj['USERNAME'] = username + ctx.obj['PASSWORD'] = password + ctx.obj['HEADLESS'] = not headful -async def run( - playwright: Playwright, - username, - password, - headless:bool, - ) -> None: - if not username: username = await questionary.text('Enter your kiz username:').ask_async() - if not password: password = await questionary.password('Enter your kiz password:').ask_async() - browser = await playwright.chromium.launch(headless=headless) - context = await browser.new_context() - page = await context.new_page() + 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("dkp11") - await page.get_by_role("textbox", name="Passwort").fill("zy7Av5rickeyyy") + 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(20) - exit(0) - await page.get_by_text("Modulbeschreibungen Bitte wä").click() - await page.get_by_role("link", name="Module für Abschluss: Master of Science").click() - await page.get_by_text("Modulbeschreibungen Sie").click() - await page.get_by_role("link", name="Studiengang: Informatik").click() - await page.get_by_role("link", name="Studium gemäß Prüfungsordnung: 2022").click() - await page.get_by_role("link", name="Wahlpflichtbereich").click() - await page.get_by_role("link", name="Kernbereich Informatik").click() - await page.get_by_role("link", name="Kernbereich Praktische").click() - await page.get_by_role("link", name="Data Mining").click() - await page.get_by_role("link", name="Beschreibung anzeigen").click() - sleep(20) - await page.close() + sleep(2) + click.echo("Finished campusonline.") - # --------------------- - await context.close() - await browser.close() - -@click.command() -@click.option('--username','-u') -@click.option('--password','-p') -@click.option('--headful', is_flag=True) -async def main(username, password, headful): - async with async_playwright() as playwright: - await run(playwright, username, password, headless=not headful) +@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.") if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(cli.main()) \ No newline at end of file