Preise

Architektur im Überblick

Quelldateien

Diese Seite wurde aus den folgenden Quelldateien erstellt:

Das Projekt res-downloader ist eine plattformübergreifende Desktop-Anwendung, die Netzwerk-Ressourcen abfängt (Sniffing) und herunterlädt. Die Architektur basiert auf einem hybriden Ansatz aus Go-Backend und Web-Frontend, gebündelt durch das Wails v2 Framework. Das System nutzt einen lokalen HTTP/HTTPS-Proxy mit Man-in-the-Middle (MITM) Fähigkeiten, um Medienströme zu analysieren und zu extrahieren.

Systemarchitektur und Modulübersicht

Die Architektur folgt einem klaren Schichtenmodell, das die Trennung von Zuständigkeiten für UI, Geschäftslogik, Systemintegration und Netzwerkverkehr gewährleistet. Das Backend in Go übernimmt dabei alle rechenintensiven und systemnahen Aufgaben, während das Frontend in Vue.js für die Interaktion mit dem Endbenutzer zuständig ist.

正在加载图表渲染器...

Erklärung der Architektur:

  1. Frontend Layer: Die Benutzeroberfläche wird als Single-Page-Application (SPA) ausgeführt. Der zentrale Store (frontend/src/stores/index.ts:1-99) verwaltet den globalen Zustand wie Konfiguration und Proxy-Status. Die Navigation erfolgt über den Vue Router (frontend/src/router/index.ts:1-31).
  2. Backend Layer: Die Go-Anwendung wird als Singleton gestartet (main.go:29-31). Die App-Struktur koordiniert alle Subsysteme. Die Kommunikation mit dem Frontend erfolgt über die Bind-Struktur, die Methoden nach JavaScript exportiert (core/bind.go:9-25).
  3. System & Utilities: Diese Module bieten Infrastrukturfunktionen wie persistente Konfigurationsspeicherung (core/storage.go:1-41), AES-Verschlüsselung für Passwörter (core/aes.go:16-72) und Logging (core/logger.go:16-66).

Technologie-Stack und Framework-Integration

Die Wahl der Technologien zielt auf eine hohe Performance bei der Netzwerkverarbeitung und eine moderne, flexible Benutzeroberfläche ab.

TechnologieVersion/BibliothekEinsatzzweckBegründung
Go1.22+Backend-Logik, Proxy, Netzwerk-I/OHohe Parallelität und Standardbibliotheken für Netzwerkoperationen.
Wails v2v2.10.1Desktop-FrameworkErmöglicht die Kombination von Go-Backend mit Web-Frontend ohne Overhead großer Electron-Apps.
Vue.js 3LatestUI-FrameworkReaktives Komponentensystem für eine reaktive Benutzeroberfläche.
goproxyelazarl/goproxyMITM Proxy EngineMächtige Bibliothek zur Manipulation von HTTP/HTTPS-Traffic.
PiniaLatestState ManagementZentraler Store für Vue.js, der direkt mit den Go-Bindings interagiert.
ZeroLogrs/zerologStrukturiertes LoggingPerformante, zero-allocation Logging-Bibliothek für Go.

Die Integration erfolgt über den Wails-Build-Prozess, der das Frontend in die Go-Binary einbettet (main.go:20-21). Zur Laufzeit generiert Wails JavaScript-Wrapper für die exportierten Go-Methoden, wie in frontend/wailsjs/go/core/Bind.js zu sehen ist.

Backend-Architektur und Modulare Struktur

Das Backend ist modular aufgebaut und nutzt das Singleton-Pattern, um den globalen Zustand über verschiedene Pakete hinweg zu verwalten.

App Lifecycle und Singleton-Verwaltung

Der Kern der Anwendung ist die App-Struktur in core/app.go. Sie wird beim Start einmalig instanziiert und verwaltet lebenswichtige Ressourcen wie das eingebettete Dateisystem (assets), Anwendungsmetadaten und Zertifikate.

  • Initialisierung: Die Funktion GetApp prüft, ob die Instanz bereits existiert, und extrahiert die Version aus den eingebetteten Metadaten (core/app.go:43-56).
  • Startup: Die Startup-Methode speichert den Wails-Kontext und startet den lokalen HTTP-Server in einem separaten Goroutine, um die UI nicht zu blockieren (core/app.go:129-132).
  • Shutdown: OnExit sorgt für ein sauberes Herunterfahren, einschließlich des Zurücksetzens des Systemproxys und dem Schließen der Log-Dateien (core/app.go:134-141).

Konfigurationsmanagement

Die Konfiguration (Config-Struktur) speichert Benutzereinstellungen wie Download-Verzeichnis, Proxy-Einstellungen und MIME-Type-Mappings (core/config.go:19-41). Ein besonderes Merkmal ist das MimeMap, das MIME-Typen auf Dateiendungen und Kategorien (Bild, Video, Audio) abbildet (core/config.go:119-157), was entscheidend für die Identifizierung von Ressourcen ist.

Die Persistenz übernimmt die Storage-Klasse (core/storage.go:1-41), die Konfigurationen als JSON-Dateien im Benutzerordner speichert und beim Start lädt.

Proxy-Infrastruktur und MITM-Architektur

Das Herzstück des Ressourcen-Downloaders ist der lokale Proxy-Server, der den Netzwerkverkehr abfängt.

MITM-Implementierung

Der Proxy wird in core/proxy.go implementiert. Er nutzt goproxy, um einen HTTP-Server zu erstellen, der Anfragen entweder direkt beantwortet (API) oder an den Zielserver weiterleitet (Proxy).

  • CA-Zertifikat: Um HTTPS-Traffic zu entschlüsseln, muss der Proxy ein vertrauenswürdiges Zertifikat verwenden. Die Methode setCa lädt das in der App eingebettete Zertifikat und konfiguriert goproxy für MITM-Verbindungen (core/proxy.go:95-109).
  • Regelbasierte Interzeption: Nicht aller Traffic soll abgefangen werden. Die RuleSet-Struktur (core/rule.go:22-126) entscheidet basierend auf Domänen (z.B. *.qq.com), ob ein MITM durchgeführt werden soll. Dies ist essenziell für Leistung und Privatsphäre.
  • Request/Response Hooks: Der Proxy registriert Handler für OnRequest und OnResponse (core/proxy.go:91-92), die den Datenstrom analysieren und relevante URLs extrahieren.

Plugin-System

Die Logik zur Extraktion von Medien-URLs ist in Plugins ausgelagert. Das Bridge-Interface verbindet die Plugins mit dem Core-System (core/proxy.go:32-54). Plugins können z.B. spezifische Header auswerten oder verschlüsselte Parameter für Video-Plattformen verarbeiten.

Frontend-Architektur und State Management

Das Frontend ist als typische Vue-3-Anwendung aufgebaut.

State Management mit Pinia

Der useIndexStore in frontend/src/stores/index.ts dient als zentrale Wahrheitsquelle. Er verwaltet:

  1. App-Info: Metadaten wie Name und Version, die beim Start via bind.AppInfo() geladen werden.
  2. Global Config: Die Konfigurationsobjekte, die mit bind.Config() synchronisiert werden.
  3. Proxy Status: Ein reaktiver isProxy-Status, der über openProxy und unsetProxy gesteuert wird.

Diese Aktionen im Store rufen wiederum die Go-Backend-Funktionen auf, was den Datenaustausch transparent macht.

Routing

Der Router (frontend/src/router/index.ts:1-31) definiert zwei Hauptansichten: index (Hauptfläche für Downloads) und setting (Konfiguration). Ein Layout-Component umschließt diese und stellt die Navigationsstruktur bereit.

Datenfluss und Interaktionsabläufe

Um zu verstehen, wie eine Ressource vom Browser auf die Festplatte gelangt, betrachten wir den typischen Ablauf beim Aktivieren des Proxys und einem Download.

正在加载图表渲染器...

Schlüsselinteraktionen im Detail:

  1. Proxy-Aktivierung: Der Benutzer klickt im UI auf "Start". Der Store ruft bind.OpenSystemProxy() auf. Im Backend ruft dies systemOnce.setProxy() auf, was die Systemproxy-Einstellungen (Windows/Mac/Linux) ändert, um den lokalen Port (z.B. 8899) zu nutzen (core/app.go:156-166).
  2. Traffic Abfang: Sobald der Browser eine Anfrage an eine in den Regeln definierte Domäne sendet, leitet der Betriebssystem-Proxy sie an res-downloader weiter. Der goproxy entschlüsselt bei Bedarf den TLS-Traffic.
  3. Analyse: Der OnRequest-Handler übergibt den Request an das Plugin-System. Das Plugin (z.B. für QQ) analysiert den Body oder die Header und extrahiert die eigentliche Medien-URL.
  4. Download: Wenn eine URL gefunden wird, sendet das Backend ein Event an das Frontend. Der Benutzer startet den Download. Die Resource.download-Methode (core/resource.go:100-181) führt den eigentlichen Download durch, inklusive Header-Parsing und optionaler Entschlüsselung (z.B. für WeChat-Dateien).

Sicherheits- und Hilfskomponenten

Neben der Kernlogik stellt das Backend wichtige Sicherheitsfunktionen bereit.

Verschlüsselung und Systemintegration

Sensible Daten wie Passwörter für den Systemproxy oder Zertifikate werden geschützt.

  • AES-Verschlüsselung: Die AESCipher-Struktur implementiert CBC-Mode-Verschlüsselung (core/aes.go:21-42), um Passwörter lokal im Cache-File zu speichern (core/system.go:45-58).
  • Zertifikats-Management: Das System installiert bei Bedarf ein Root-CA-Zertifikat, damit der Browser dem lokalen Proxy vertraut (core/system.go:29-43).
  • Logging: Ein globaler Logger (core/logger.go:16-66) schreibt strukturierte Logs in eine Datei im Benutzerordner, was bei der Fehlersuche in Produktionsumgebungen hilft.

Ressourcen-Handling

Das Resource-Modul (core/resource.go:1-274) kapselt komplexe Logik:

  • Dateinamen-Bereinigung: Entfernt ungültige Zeichen und berücksichtigt Längenbeschränkungen.
  • XOR-Entschlüsselung: Spezielle Logik für bestimmte Plattformen (z.B. WeChat), die Dateien mit einem XOR-Algorithmus verschlüsseln (core/resource.go:247-274).
  • Fortschritts-Tracking: Sendet regelmäßige Updates über den HTTP-Server an das Frontend (core/resource.go:227-245).