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 標頭。
注意:對您的會話 cookie 保密非常重要,因為其他人可以存取您的 Advent of Code 帳戶(如果他們可以存取它)。
取得輸入的代碼
以下是一個簡單的程序,我們將用它來動態取得拼圖輸入:
我們首先定義用於取得輸入的基本 URL,並建立一個函數來讀取特定日期的輸入。
const baseURL = "https://adventofcode.com/2024/day/%s/input" func readInput(day string) { url := fmt.Sprintf(baseURL, day) fmt.Println(url) }
接下來,我們建立一個 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 }
增強安全性
在我們的程式碼中對會話令牌進行硬編碼並不安全。相反,我們應該使用以下步驟將其儲存為環境變數:
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 }
這有助於將會話令牌保留在原始程式碼之外,從而降低意外暴露的風險。
以下是完整的程序供參考:
export AOC_SESSION="[YOUR_SESSION_TOKEN]"
要記住的事情
會話過期:會話令牌可能會在一段時間後過期。如果遇到問題,請重新登入並檢索新令牌。
隱私權:切勿公開分享您的會話令牌,包括在部落格文章或 GitHub 儲存庫中。
結論
您可以透過在 HTTP 要求中包含會話 cookie 來動態取得您的 Advent of Code 輸入。
歡迎在評論部分分享您的技巧或提出問題。快樂編碼,祝福 2024 年代碼降臨一切順利!
以上是在 GO 動態取得代碼輸入的出現的詳細內容。更多資訊請關注PHP中文網其他相關文章!