首頁 >後端開發 >Golang >在 GO 動態取得代碼輸入的出現

在 GO 動態取得代碼輸入的出現

Susan Sarandon
Susan Sarandon原創
2024-12-08 10:32:17198瀏覽

Advent of Code 是程式設計師測試和提高解決問題能力的有趣方式。在解決謎題時,您可能希望直接使用其 URL 自動取得個人化謎題輸入,而不是將輸入複製到本地可用的文字檔案中。但是,嘗試使用簡單的 HTTP 請求存取輸入 URL 會導致以下訊息:

謎題輸入因使用者而異。請登入以取得您的謎題輸入。

本文解釋了為什麼會發生這種情況以及如何使用 Go 程式語言動態正確取得輸入。

問題:為什麼我們不能直接取得輸入?

《代碼的降臨》要求您登入才能存取您的個人化謎題輸入。當您透過瀏覽器登入時,Advent of Code 會在您的瀏覽器中設定會話 cookie。此 cookie 用於識別您的帳戶並提供您獨特的輸入。

如果您的 HTTP 要求不包含此會話 cookie,Advent of Code 伺服器無法將您識別為登入用戶,因此會出現錯誤訊息。

解決方案:在 HTTP 請求中使用 Session Cookie

我們必須在 HTTP 請求中包含會話 cookie 才能取得拼圖輸入。以下是逐步指南:

  • 登入 Advent of Code。

  • 開啟瀏覽器的開發者工具(按 F12 鍵)並導覽至「網頁」標籤。

  • 重新整理 Advent of Code 頁面並在請求標頭中尋找 cookie 標頭。

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

  • 擷取會話 cookie 的值。

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

注意:對您的會話 cookie 保密非常重要,因為其他人可以存取您的 Advent of Code 帳戶(如果他們可以存取它)。

取得輸入的代碼

以下是一個簡單的程序,我們將用它來動態取得拼圖輸入:

  • 設定基本 URL

我們首先定義用於取得輸入的基本 URL,並建立一個函數來讀取特定日期的輸入。

const baseURL = "https://adventofcode.com/2024/day/%s/input"

func readInput(day string) {
    url := fmt.Sprintf(baseURL, day)
    fmt.Println(url)
}
  • 建立 HTTP 請求

接下來,我們建立一個 HTTP 請求並包含會話 cookie。

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:為輸入 URL 建立 HTTP GET 請求。

req.Header.Add:使用會話令牌向請求新增標頭以進行身份驗證。 (將 [YOUR_SESSION_TOKEN] 替換為您的實際令牌)。

  • 發送請求並處理回應

現在我們發送 HTTP 請求並讀取伺服器的回應。

const baseURL = "https://adventofcode.com/2024/day/%s/input"

func readInput(day string) {
    url := fmt.Sprintf(baseURL, day)
    fmt.Println(url)
}

client.Do(req):發送 HTTP 請求並儲存回應。

defer resp.Body.Close():確保讀取後關閉回應正文。

resp.StatusCode:檢查 HTTP 狀態碼。 200 以外的代碼表示錯誤。

  • 讀取並列印輸入

最後,我們讀取回應正文並列印拼圖輸入。

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):讀取回應正文。

string(body):將正文從位元組切片轉換為字串,以便於顯示。

  • 定義主要函數

我們從主函數呼叫 readInput 函數來取得第一天的輸入。

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
    }

增強安全性

在我們的程式碼中對會話令牌進行硬編碼並不安全。相反,我們應該使用以下步驟將其儲存為環境變數:

  1. 使用終端機導出會話令牌:
body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("Error reading response body: %v\n", err)
        return
    }

    fmt.Println(string(body))
  1. 修改程式碼以從環境變數讀取會話令牌。 (確保您的導入包含“os”):
func main() {
    readInput("1") // Fetches input puzzle for day 1
}

這有助於將會話令牌保留在原始程式碼之外,從而降低意外暴露的風險。

  • 完整程式碼

以下是完整的程序供參考:

export AOC_SESSION="[YOUR_SESSION_TOKEN]"

要記住的事情

  • 會話過期:會話令牌可能會在一段時間後過期。如果遇到問題,請重新登入並檢索新令牌。

  • 隱私權:切勿公開分享您的會話令牌,包括在部落格文章或 GitHub 儲存庫中。

結論

您可以透過在 HTTP 要求中包含會話 cookie 來動態取得您的 Advent of Code 輸入。

歡迎在評論部分分享您的技巧或提出問題。快樂編碼,祝福 2024 年代碼降臨一切順利!

以上是在 GO 動態取得代碼輸入的出現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn