Advent of Code は、プログラマーが問題解決スキルをテストし、向上させるための楽しい方法です。パズルを解くときに、ローカルで使用できるテキスト ファイルに入力をコピーするのではなく、URL を使用してパーソナライズされたパズル入力の取得を自動化したい場合があります。ただし、単純な HTTP リクエストを使用して入力 URL にアクセスしようとすると、次のメッセージが表示されます:
パズルの入力はユーザーによって異なります。パズルの入力を取得するにはログインしてください。
この記事では、これが起こる理由と、Go プログラミング言語を使用して入力を動的に正しくフェッチする方法について説明します。
問題: なぜ入力を直接フェッチできないのでしょうか?
Advent of Code では、パーソナライズされたパズル入力にアクセスするにはログインする必要があります。ブラウザ経由でログインすると、Advent of Code はブラウザにセッション Cookie を設定します。この Cookie は、アカウントを識別し、独自の入力を提供するために使用されます。
HTTP リクエストにこのセッション Cookie が含まれていない場合、Advent of Code サーバーはあなたをログイン ユーザーとして認識できないため、エラー メッセージが表示されます。
解決策: HTTP リクエストでセッション Cookie を使用する
パズルの入力を取得するには、HTTP リクエストにセッション Cookie を含める必要があります。以下に段階的なガイドラインを示します:
Advent of Code にログインします。
ブラウザの開発者ツールを開き (F12 キーを押して)、[ネットワーク] タブに移動します。
Advent of Code ページを更新し、リクエスト ヘッダーで Cookie ヘッダーを探します。
注: 他の人があなたの Advent of Code アカウントにアクセスすると、他の人があなたの Advent of Code アカウントにアクセスできるため、セッション Cookie を秘密にしておくことが重要です。
入力をフェッチするコード
以下は、パズルの入力を動的に取得するために使用する簡単なプログラムです。
入力を取得するためのベース 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): 簡単に表示できるように、本文をバイトのスライスから文字列に変換します。
main 関数から readInput 関数を呼び出して、1 日目の入力を取得します。
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 の入力を動的に取得できます。
お気軽にヒントを共有したり、コメントセクションで質問してください。コーディングを楽しんでください。Advent of Code 2024 も頑張ってください!
以上がGO でコード入力のアドベントを動的に取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。