# diwan233/gzvtc-course-grab architecture

> Architecture diagram of the GitHub repository diwan233/gzvtc-course-grab, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/diwan233/gzvtc-course-grab
- Repository: https://github.com/diwan233/gzvtc-course-grab

## Overview

This is a command-line course-registration retry script for Guangzhou Vocational College, not a general platform. The principal workflow loads settings, restores or creates a session, waits for the selection window, fetches courses, builds a keyword-rotated pool, and repeatedly submits selections until the configured success condition is met. The single runtime file also contains HTTP/retry and pool-policy layers. The tree and sampled source expose only main.py as runtime code; capability-level nodes reflect README documentation, so uncertain internal call wiring is omitted.

Main entry points: [`main.py`](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py) (Run loop)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Registration workflow"]
  node_cli["CLI entry<br/>[main.py]"]
  node_run["Run loop<br/>[main.py]"]
  node_settings["Settings<br/>[main.py]"]
  node_window["Window probe<br/>[main.py]"]
  node_selection["Selection attempts<br/>[main.py]"]
  node_progress["Target progress<br/>[main.py]"]
  node_confirmation["Selection check<br/>[main.py]"]
end

subgraph group_client["Portal client"]
  node_session["Session setup<br/>[main.py]"]
  node_cookiefile[("Cookie cache")]
  node_coursefetch["Course loading<br/>[main.py]"]
  node_gate["Welcome gate<br/>[main.py]"]
end

subgraph group_policy["Pool policy"]
  node_pool["Pool builder<br/>[main.py]"]
  node_vacancy["Vacancy ranking<br/>[main.py]"]
  node_verdict["Response policy<br/>[main.py]"]
end

node_student(("Student"))
node_portal{{"Student portal"}}
node_output["CLI output"]

node_student -->|"runs"| node_cli
node_cli -->|"loads"| node_settings
node_cli -->|"starts"| node_run
node_run -->|"ensures session"| node_session
node_session -->|"reads/writes"| node_cookiefile
node_session -->|"logs in"| node_portal
node_run -->|"checks window"| node_window
node_window -->|"probes page"| node_portal
node_run -->|"loads courses"| node_coursefetch
node_coursefetch -->|"requests list"| node_portal
node_coursefetch -->|"detects gate"| node_gate
node_gate -->|"passes gate"| node_portal
node_run -->|"builds pool"| node_pool
node_pool -->|"ranks classes"| node_vacancy
node_run -->|"attempts classes"| node_selection
node_selection -->|"submits selection"| node_portal
node_selection -->|"classifies response"| node_verdict
node_run -->|"updates targets"| node_progress
node_selection -->|"checks success"| node_confirmation
node_confirmation -->|"refreshes list"| node_portal
node_run -->|"reports status"| node_output
node_cli -->|"prints results"| node_output

click node_cli "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_run "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_settings "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_session "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_window "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_coursefetch "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_gate "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_pool "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_vacancy "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_selection "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_verdict "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_progress "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"
click node_confirmation "https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_run,node_settings,node_window,node_selection,node_progress,node_confirmation toneBlue
class node_session,node_cookiefile,node_coursefetch,node_gate toneAmber
class node_pool,node_vacancy,node_verdict toneMint
class node_student,node_portal,node_output toneIndigo
```

## Components

### Registration workflow

- [CLI entry](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Run loop](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Settings](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Window probe](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Selection attempts](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Target progress](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Selection check](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`

### Portal client

- [Session setup](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- **Cookie cache**
- [Course loading](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Welcome gate](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`

### Pool policy

- [Pool builder](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Vacancy ranking](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`
- [Response policy](https://github.com/diwan233/gzvtc-course-grab/blob/main/main.py): `main.py`

### Other components

- **Student**
- **Student portal**
- **CLI output**

## Connections

- Student → CLI entry: runs
- CLI entry → Settings: loads
- CLI entry → Run loop: starts
- Run loop → Session setup: ensures session
- Session setup → Cookie cache: reads/writes
- Session setup → Student portal: logs in
- Run loop → Window probe: checks window
- Window probe → Student portal: probes page
- Run loop → Course loading: loads courses
- Course loading → Student portal: requests list
- Course loading → Welcome gate: detects gate
- Welcome gate → Student portal: passes gate
- Run loop → Pool builder: builds pool
- Pool builder → Vacancy ranking: ranks classes
- Run loop → Selection attempts: attempts classes
- Selection attempts → Student portal: submits selection
- Selection attempts → Response policy: classifies response
- Run loop → Target progress: updates targets
- Selection attempts → Selection check: checks success
- Selection check → Student portal: refreshes list
- Run loop → CLI output: reports status
- CLI entry → CLI output: prints results
