ホームページ > バックエンド開発 > Golang > GO でコード入力のアドベントを動的に取得する

GO でコード入力のアドベントを動的に取得する

Susan Sarandon
リリース: 2024-12-08 10:32:17
オリジナル
197 人が閲覧しました

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 ヘッダーを探します。

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

  • セッション Cookie の値を抽出します。

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

注: 他の人があなたの Advent of Code アカウントにアクセスすると、他の人があなたの Advent of Code アカウントにアクセスできるため、セッション Cookie を秘密にしておくことが重要です。

入力をフェッチするコード

以下は、パズルの入力を動的に取得するために使用する簡単なプログラムです。

  • ベース 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): 簡単に表示できるように、本文をバイトのスライスから文字列に変換します。

  • メイン関数の定義

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
    }
ログイン後にコピー

セキュリティの強化

コード内でセッション トークンをハードコーディングすることは安全ではありません。代わりに、以下の手順を使用して環境変数として保存する必要があります:

  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 の入力を動的に取得できます。

お気軽にヒントを共有したり、コメントセクションで質問してください。コーディングを楽しんでください。Advent of Code 2024 も頑張ってください!

以上がGO でコード入力のアドベントを動的に取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート