> 백엔드 개발 > Golang > GO에서 동적으로 코드 입력 가져오기

GO에서 동적으로 코드 입력 가져오기

Susan Sarandon
풀어 주다: 2024-12-08 10:32:17
원래의
194명이 탐색했습니다.

Advent of Code는 프로그래머가 문제 해결 능력을 테스트하고 향상할 수 있는 재미있는 방법입니다. 퍼즐을 해결하는 동안 입력을 로컬에서 사용할 수 있는 텍스트 파일에 복사하는 대신 URL을 사용하여 직접 개인화된 퍼즐 입력 가져오기를 자동화할 수 있습니다. 그러나 간단한 HTTP 요청을 사용하여 입력 URL에 액세스하려고 하면 다음 메시지가 표시됩니다.

퍼즐 입력은 사용자마다 다릅니다. 퍼즐을 입력하려면 로그인하세요.

이 문서에서는 이러한 일이 발생하는 이유와 Go 프로그래밍 언어를 사용하여 동적으로 입력을 올바르게 가져오는 방법을 설명합니다.

문제: 입력을 직접 가져올 수 없는 이유는 무엇입니까?

Advent of Code는 개인화된 퍼즐 입력에 액세스하려면 로그인이 필요합니다. 브라우저를 통해 로그인하면 Advent of Code는 브라우저에 세션 쿠키를 설정합니다. 이 쿠키는 귀하의 계정을 식별하고 고유한 입력을 제공하는 데 사용됩니다.

HTTP 요청에 이 세션 쿠키가 포함되어 있지 않으면 Advent of Code 서버가 귀하를 로그인한 사용자로 인식할 수 없으므로 오류 메시지가 표시됩니다.

해결책: HTTP 요청에 세션 쿠키 사용

퍼즐 입력을 가져오려면 HTTP 요청에 세션 쿠키를 포함해야 합니다. 단계별 지침은 다음과 같습니다.

  • Advent of Code에 로그인하세요.

  • 브라우저의 개발자 도구를 열고(F12 키를 누름) 네트워크 탭으로 이동하세요.

  • Advent of Code 페이지를 새로 고치고 요청 헤더에서 쿠키 헤더를 찾으세요.

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

  • 세션 쿠키의 값을 추출합니다.

FETCHING ADVENT OF CODE INPUTS DYNAMICALLY IN GO

참고: 다른 사람이 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 요청을 생성하고 세션 쿠키를 포함합니다.

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 요청에 세션 쿠키를 포함시켜 Advent of Code 입력을 동적으로 가져올 수 있습니다.

댓글 섹션에서 자유롭게 팁을 공유하거나 질문을 남겨주세요. 즐거운 코딩 되시기 바랍니다. Advent of Code 2024에서 행운을 빕니다!

위 내용은 GO에서 동적으로 코드 입력 가져오기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿