Skip to main content

DidupWrapper

PyPI Python License: MIT

Libreria Python, sincrona e asincrona, per accedere ai dati del registro elettronico DiDUP / Argo Famiglia: voti, assenze, registro di classe, bacheca, promemoria e altro, restituiti come modelli tipizzati Pydantic v2.

Indice

Caratteristiche

  • Client asincrono (DiDUPClient) e sincrono (DiDUPClientSync) con la stessa interfaccia.
  • Login completo OAuth2/PKCE, identico a quello dell'app ufficiale.
  • Risposte validate e tipizzate con Pydantic v2, tolleranti a campi mancanti, null e campi aggiunti in futuro dal server.
  • Cache della dashboard: più chiamate consecutive generano una sola richiesta.
  • Eccezioni dedicate per autenticazione, rate limit, risorse non trovate e versione del client superata.
  • DashboardPoller per ricevere callback solo quando compaiono nuovi dati.
  • Pacchetto completamente tipizzato (py.typed).

Requisiti e installazione

Serve Python 3.10 o successivo.

pip install didupwrapper

Guida rapida

Per il login servono il codice scuola (es. SC12345), lo username e la password, gli stessi usati nell'app DiDUP Famiglia.

Client asincrono

import asyncio
import os

from didupwrapper import DiDUPClient

async def main() -> None:
    async with DiDUPClient(
        os.environ["DIDUP_SCUOLA"],
        os.environ["DIDUP_USERNAME"],
        os.environ["DIDUP_PASSWORD"],
    ) as didup:
        print("Media generale:", await didup.get_media_generale())
        for voto in await didup.get_voti():
            print(voto.des_materia, voto.cod_codice)

asyncio.run(main())

Client sincrono

import os

from didupwrapper import DiDUPClientSync

with DiDUPClientSync(
    os.environ["DIDUP_SCUOLA"],
    os.environ["DIDUP_USERNAME"],
    os.environ["DIDUP_PASSWORD"],
) as didup:
    for voto in didup.get_voti():
        print(voto.des_materia, voto.cod_codice)

Versione del client

Per essere accettato dal server, ogni richiesta include l'header argo-client-version, che deve corrispondere a una versione recente dell'app pubblicata sugli store (il default attuale è 1.29.2). Se la versione è troppo vecchia il server risponde 410 e la libreria solleva un DiDUPError che lo spiega.

Ci sono tre modi per gestirla:

# 1. Default della libreria
DiDUPClient("SC12345", "user", "pwd")

# 2. Versione fissata a mano
DiDUPClient("SC12345", "user", "pwd", version="1.29.2")

# 3. Versione letta dall'App Store al momento del login (consigliato)
DiDUPClient("SC12345", "user", "pwd", auto_versione=True)

Per conoscere solo l'ultima versione pubblicata:

from didupwrapper import recupera_versione_app

print(await recupera_versione_app())  # es. "1.29.2", oppure None se non raggiungibile

Account con più figli

Con un account genitore collegato a più figli, Argo restituisce un profilo per ogni figlio. Di default il client usa il primo; per consultare gli altri:

with DiDUPClientSync("SC12345", "mario.rossi", "password") as didup:
    for profilo in didup.get_profili():
        print(profilo.indice, profilo.nome_completo)

    didup.seleziona_profilo("Beatrice")  # oppure l'indice, o un Profilo
    print(didup.get_voti())

seleziona_profilo() accetta il nome, nome e cognome in qualsiasi ordine o una parola del nominativo; se il nome corrisponde a nessuno o a più profili solleva DiDUPError. Cambiando profilo la cache della dashboard viene svuotata, e il profilo scelto resta attivo anche quando il client rifà il login per una sessione scaduta.

Riferimento API

Metodi del client

Disponibili sia su DiDUPClient (con await) sia su DiDUPClientSync.

Metodo Restituisce
get_dashboard(forza_refresh=False) Tutti i dati aggregati (DashboardResponse)
get_voti() Voti (list[Voto])
get_assenze() Assenze, ritardi e uscite (list[EventoAppello])
get_registro() Registro delle lezioni (list[RegistroLezione])
get_bacheca() Comunicazioni in bacheca (list[ComunicazioneBacheca])
get_bacheca_alunno() File della bacheca alunno (list[FileBachecaAlunno])
get_promemoria() Promemoria dei docenti (list[Promemoria])
get_fuori_classe() Attività fuori classe (list[FuoriClasse])
get_note_disciplinari() Note disciplinari (list[NotaDisciplinare])
get_materie() Materie (list[Materia])
get_docenti() Docenti della classe (list[Docente])
get_periodi() Periodi / quadrimestri (list[Periodo])
get_prenotazioni() Colloqui prenotati (list[Prenotazione])
get_media_generale() Media complessiva (float | None)
invalida_cache() Svuota la cache della dashboard
get_profili() Profili dell'account, uno per figlio (list[Profilo])
seleziona_profilo(profilo) Rende attivo un profilo per nome, indice o Profilo

La dashboard viene scaricata una volta e riutilizzata dalle chiamate successive. Per dati aggiornati usa get_dashboard(forza_refresh=True) oppure invalida_cache().

Filtri pronti (solo client asincrono)

await didup.voti.per_materia(pk_materia)        # pk_materia è una stringa, es. voto.pk_materia
await didup.voti.media_per_materia(pk_materia)
await didup.voti.scritti()
await didup.assenze.da_giustificare()
await didup.bacheca.da_leggere()
await didup.registro.compiti()
await didup.fuori_classe.online()

Le chiavi primarie restituite da Argo (pk_materia, pk_periodo, ...) sono stringhe, non numeri.

Gestione degli errori

Tutte le eccezioni derivano da DiDUPError, che espone status_code, payload e request_url.

Eccezione Quando
AuthError Credenziali errate, sessione scaduta (HTTP 401/403)
RateLimitError Troppe richieste (HTTP 429); vedi retry_after
NotFoundError Risorsa inesistente (HTTP 404)
DiDUPError Qualsiasi altro errore, incluso il 410 per versione superata
from didupwrapper import AuthError, DiDUPError

try:
    async with DiDUPClient(scuola, username, password) as didup:
        voti = await didup.get_voti()
except AuthError:
    print("Credenziali non valide")
except DiDUPError as errore:
    print("Errore:", errore)

Notifiche sulle novità

DashboardPoller interroga la dashboard a intervalli regolari e chiama le callback (normali funzioni o coroutine) solo per gli elementi nuovi. Al primo giro registra lo stato iniziale senza notificare nulla, a meno di passare emetti_al_primo_giro=True.

from didupwrapper import DashboardPoller

async def on_nuovi_voti(nuovi):
    for voto in nuovi:
        print("Nuovo voto:", voto.des_materia, voto.cod_codice)

poller = DashboardPoller(didup, intervallo=600, on_nuovi_voti=on_nuovi_voti)
await poller.start()  # blocca finché non viene chiamato poller.stop()

Sono disponibili anche on_nuove_assenze, on_nuove_comunicazioni, on_nuove_note, on_nuovi_promemoria e on_evento (riceve un EventoPoller con tutte le novità del giro).

Usa intervalli ragionevoli (almeno qualche minuto): il servizio è pensato per l'uso da parte di famiglie e studenti, non per interrogazioni continue.

Sviluppo

git clone https://github.com/Rocciadura/didupAPI-wrapper.git
cd didupAPI-wrapper
pip install -e ".[dev]"

pytest            # test (HTTP simulato con respx, nessuna richiesta reale)
ruff check .      # lint
mypy didupwrapper # type checking

Gli stessi controlli girano in automatico con GitHub Actions su Python 3.10–3.13 a ogni push su main e a ogni pull request.

Pubblicare una nuova versione

  1. Aggiorna version in pyproject.toml e __version__ in didupwrapper/__init__.py (un test controlla che coincidano).
  2. Fai il commit e crea un tag con lo stesso numero, es. git tag v0.1.3.
  3. git push --tags: il workflow publish.yml fa la build e la carica su PyPI con il Trusted Publishing (va configurato una volta sola su PyPI, indicando questo repository, il workflow publish.yml e l'environment pypi).

Contributi e segnalazioni sono benvenuti tramite issue e pull request.

Note legali

  • Nessuna affiliazione. Questo progetto non è affiliato, approvato né sostenuto da Argo Software S.r.l. "Argo", "DiDUP" e "Argo Famiglia" sono marchi dei rispettivi titolari e sono citati solo per indicare il servizio con cui la libreria è compatibile.
  • Uso consentito. La libreria è pensata per accedere esclusivamente ai propri dati (o a quelli dei propri figli), con le proprie credenziali. Non usarla per accedere ad account altrui, raccogliere dati di terzi o sovraccaricare i server.
  • Termini del servizio. L'utente è responsabile del rispetto dei termini d'uso di Argo e della normativa sulla protezione dei dati personali (GDPR).
  • Nessuna garanzia. Il software è fornito "così com'è", senza garanzie di alcun tipo, come previsto dalla licenza MIT.

Contatti e richieste di rimozione

Se sei un rappresentante di Argo Software e ritieni che questo progetto non debba essere pubblico, o vuoi che venga modificato, contattami: il repository e il pacchetto su PyPI verranno rimossi o modificati subito, senza bisogno di ulteriori formalità.

Puoi scrivermi:

Lo stesso vale per eventuali problemi di sicurezza: segnalali in privato tramite il primo canale, non con una issue pubblica.

Licenza

Distribuito con licenza MIT. Vedi LICENSE.

Metadata

Release files for didupwrapper 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for didupwrapper 0.2.0
File Size Uploaded Provenance Actions
didupwrapper-0.2.0.tar.gz 29.7 kB With provenance Details for didupwrapper-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for didupwrapper 0.2.0
File Interpreter ABI Platform Actions
didupwrapper-0.2.0-py3-none-any.whl Python 3 none any Details for didupwrapper-0.2.0-py3-none-any.whl

Total release size: 60.0 kB

Release files / didupwrapper-0.2.0.tar.gz

Download URL didupwrapper-0.2.0.tar.gz
Size 29.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a8f1931c9b6755e211d274c2e3cdb2f9b0b65e2735137fbdfc4665946d5cfccd
BLAKE2b-256 checksum
How to use checksums
e26a6ec203aa49982ac481f77254cd01a7d588744184e4e64f288ff80f6d8313
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Release files / didupwrapper-0.2.0-py3-none-any.whl

Download URL didupwrapper-0.2.0-py3-none-any.whl
Size 30.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1dbd60e279113e8f4fbf4c90db64bad6b982d4ee5a4cd17d76dd1997788ebd61
BLAKE2b-256 checksum
How to use checksums
f24376490e75bf63a0e00316a022246c91b75a09766e1741de9960c1b78b0007
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Security for didupwrapper 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for didupwrapper-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page