Advent of Code ist eine unterhaltsame Möglichkeit für Programmierer, ihre Fähigkeiten zur Problemlösung zu testen und zu verbessern. Während Sie die Rätsel lösen, möchten Sie möglicherweise den Abruf Ihrer personalisierten Rätseleingabe direkt über die URL automatisieren, anstatt die Eingabe in eine Textdatei zu kopieren, die lokal verfügbar ist. Der Versuch, über eine einfache HTTP-Anfrage auf die Eingabe-URL zuzugreifen, führt jedoch zu der folgenden Meldung:
Puzzle-Eingaben unterscheiden sich je nach Benutzer. Bitte melden Sie sich an, um Ihre Rätseleingabe zu erhalten.
In diesem Artikel wird erläutert, warum dies geschieht und wie Sie Ihre Eingaben mithilfe der Programmiersprache Go dynamisch korrekt abrufen.
Das Problem: Warum können wir die Eingabe nicht direkt abrufen?
Für Advent of Code müssen Sie sich anmelden, um auf Ihre personalisierten Puzzle-Eingaben zugreifen zu können. Wenn Sie sich über den Browser anmelden, setzt Advent of Code ein Sitzungscookie in Ihrem Browser. Dieses Cookie wird verwendet, um Ihr Konto zu identifizieren und Ihre eindeutige Eingabe bereitzustellen.
Wenn Ihre HTTP-Anfragen dieses Sitzungscookie nicht enthalten, kann der Advent of Code-Server Sie nicht als angemeldeten Benutzer erkennen, daher die Fehlermeldung.
Lösung: Verwendung des Sitzungscookies in HTTP-Anfragen
Wir müssen das Sitzungscookie in unsere HTTP-Anfragen einbinden, um die Puzzle-Eingabe abzurufen. Hier ist eine Schritt-für-Schritt-Anleitung:
Melden Sie sich bei Advent of Code an.
Öffnen Sie die Entwicklertools Ihres Browsers (drücken Sie die Taste F12) und navigieren Sie zur Registerkarte „Netzwerk“.
Aktualisieren Sie die Seite „Advent of Code“ und suchen Sie in den Anforderungsheadern nach dem Cookie-Header.
HINWEIS: Es ist wichtig, dass Sie Ihr Sitzungscookie geheim halten, da jemand anderes auf Ihr Advent of Code-Konto zugreifen kann, wenn er Zugriff darauf erhält.
Code zum Abrufen der Eingabe
Unten ist ein einfaches Programm, mit dem wir unsere Puzzle-Eingabe dynamisch abrufen:
Wir beginnen mit der Definition der Basis-URL zum Abrufen von Eingaben und der Erstellung einer Funktion zum Lesen der Eingaben für einen bestimmten Tag.
const baseURL = "https://adventofcode.com/2024/day/%s/input" func readInput(day string) { url := fmt.Sprintf(baseURL, day) fmt.Println(url) }
Als nächstes erstellen wir eine HTTP-Anfrage und fügen das Sitzungscookie ein.
client := &http.Client{} req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("Error creating HTTP request: %v\n", err) return } // Add the session cookie req.Header.Add("Cookie", "session=[YOUR_SESSION_TOKEN]")
http.NewRequest: Erstellt eine HTTP-GET-Anfrage für die Eingabe-URL.
req.Header.Add: Fügt der Anfrage einen Header mit dem Sitzungstoken zur Authentifizierung hinzu. (Ersetzen Sie [YOUR_SESSION_TOKEN] durch Ihr tatsächliches Token.
Jetzt senden wir die HTTP-Anfrage und lesen die Antwort des Servers.
const baseURL = "https://adventofcode.com/2024/day/%s/input" func readInput(day string) { url := fmt.Sprintf(baseURL, day) fmt.Println(url) }
client.Do(req): Sendet die HTTP-Anfrage und speichert die Antwort.
defer resp.Body.Close(): Stellt sicher, dass der Antworttext nach dem Lesen geschlossen wird.
resp.StatusCode: Überprüft den HTTP-Statuscode. Ein anderer Code als 200 weist auf einen Fehler hin.
Schließlich lesen wir den Antworttext und drucken die Puzzle-Eingabe aus.
client := &http.Client{} req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("Error creating HTTP request: %v\n", err) return } // Add the session cookie req.Header.Add("Cookie", "session=[YOUR_SESSION_TOKEN]")
io.ReadAll(resp.Body): Liest den Antworttext.
string(body): Konvertiert den Body von einem Byte-Slice in einen String zur einfachen Anzeige.
Wir rufen die readInput-Funktion der Hauptfunktion auf, um die Eingabe für Tag 1 abzurufen.
resp, err := client.Do(req) if err != nil { fmt.Printf("Error making HTTP request: %v\n", err) return } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { fmt.Printf("Unexpected HTTP status: %d\n", resp.StatusCode) return }
Verbesserung der Sicherheit
Das Festcodieren des Sitzungstokens in unserem Code ist nicht sicher. Stattdessen sollten wir es als Umgebungsvariable speichern, indem wir die folgenden Schritte ausführen:
body, err := io.ReadAll(resp.Body) if err != nil { fmt.Printf("Error reading response body: %v\n", err) return } fmt.Println(string(body))
func main() { readInput("1") // Fetches input puzzle for day 1 }
Dies trägt dazu bei, dass das Sitzungstoken außerhalb des Quellcodes bleibt, wodurch das Risiko einer versehentlichen Offenlegung verringert wird.
Hier ist das komplette Programm als Referenz:
export AOC_SESSION="[YOUR_SESSION_TOKEN]"
Dinge, die Sie beachten sollten
Sitzungsablauf: Sitzungstoken können nach einer Weile ablaufen. Wenn Sie auf Probleme stoßen, melden Sie sich erneut an und rufen Sie ein neues Token ab.
Datenschutz: Teilen Sie Ihr Sitzungstoken niemals öffentlich, auch nicht in Blog-Beiträgen oder GitHub-Repositories.
Fazit
Sie können Ihre Advent of Code-Eingaben dynamisch abrufen, indem Sie Ihr Sitzungscookie in HTTP-Anfragen einbinden.
Teilen Sie Ihre Tipps gerne mit uns oder stellen Sie Fragen im Kommentarbereich. Viel Spaß beim Codieren und viel Glück bei Advent of Code 2024!
Das obige ist der detaillierte Inhalt vonERHALTEN VON CODE-EINGABEN DYNAMISCH IN GO. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!