Go 빠른 시작

이 페이지의 나머지 부분에서 설명하는 단계를 완료하면 약 5분 후에 YouTube Data API에 요청을 수행하는 간단한 Go 명령줄 애플리케이션이 생성됩니다.

이 가이드에 사용된 샘플 코드는 GoogleDevelopers YouTube 채널의 channel 리소스를 검색하고 이 리소스에서 기본 정보를 출력합니다.

기본 요건

이 빠른 시작을 실행하려면 다음이 필요합니다.

  • Go, 최신 버전 권장
  • Git, 최신 버전 권장
  • 인터넷 및 웹브라우저 액세스
  • Google 계정

1단계: YouTube Data API 사용 설정하기

  1. 이 마법사를 사용하여 Google Developers Console에서 프로젝트를 만들거나 선택하고 API를 자동으로 사용 설정하세요. 계속을 클릭한 다음 사용자 인증 정보로 이동을 클릭합니다.

  2. 사용자 인증 정보 만들기 페이지에서 취소 버튼을 클릭합니다.

  3. 페이지 상단에서 OAuth 동의 화면 탭을 선택합니다. 이메일 주소를 선택하고 아직 설정되지 않은 경우 제품 이름을 입력한 후 저장 버튼을 클릭합니다.

  4. 사용자 인증 정보 탭을 선택하고 사용자 인증 정보 만들기 버튼을 클릭한 후 OAuth 클라이언트 ID를 선택합니다.

  5. 애플리케이션 유형을 Other로 선택하고 'YouTube Data API quickstart'를 입력한 후 만들기 버튼을 클릭합니다.

  6. 확인을 클릭하여 표시되는 대화상자를 닫습니다.

  7. 클라이언트 ID 오른쪽에 있는 (JSON 다운로드) 버튼을 클릭합니다.

  8. 다운로드한 파일을 작업 디렉터리로 이동하고 이름을 client_secret.json로 변경합니다.

2단계: 작업공간 준비하기

  1. GOPATH 환경 변수를 작업 디렉터리로 설정합니다.
  2. 다음 명령어를 사용하여 YouTube Data API Go 클라이언트 라이브러리 및 OAuth2 패키지를 가져옵니다.
go get -u google.golang.org/api/youtube/v3
go get -u golang.org/x/oauth2/...

3단계: 샘플 설정

작업 디렉터리에 quickstart.go이라는 파일을 만들고 다음 코드를 복사합니다.

// Sample Go code for user authorization

package main

import (
  "encoding/json"
  "fmt"
  "log"
  "io/ioutil"
  "net/http"
  "net/url"
  "os"
  "os/user"
  "path/filepath"

  "golang.org/x/net/context"
  "golang.org/x/oauth2"
  "golang.org/x/oauth2/google"
  "google.golang.org/api/youtube/v3"
)

const missingClientSecretsMessage = `
Please configure OAuth 2.0
`

// getClient uses a Context and Config to retrieve a Token
// then generate a Client. It returns the generated Client.
func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
  cacheFile, err := tokenCacheFile()
  if err != nil {
    log.Fatalf("Unable to get path to cached credential file. %v", err)
  }
  tok, err := tokenFromFile(cacheFile)
  if err != nil {
    tok = getTokenFromWeb(config)
    saveToken(cacheFile, tok)
  }
  return config.Client(ctx, tok)
}

// getTokenFromWeb uses Config to request a Token.
// It returns the retrieved Token.
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
  authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
  fmt.Printf("Go to the following link in your browser then type the "+
    "authorization code: \n%v\n", authURL)

  var code string
  if _, err := fmt.Scan(&code); err != nil {
    log.Fatalf("Unable to read authorization code %v", err)
  }

  tok, err := config.Exchange(oauth2.NoContext, code)
  if err != nil {
    log.Fatalf("Unable to retrieve token from web %v", err)
  }
  return tok
}

// tokenCacheFile generates credential file path/filename.
// It returns the generated credential path/filename.
func tokenCacheFile() (string, error) {
  usr, err := user.Current()
  if err != nil {
    return "", err
  }
  tokenCacheDir := filepath.Join(usr.HomeDir, ".credentials")
  os.MkdirAll(tokenCacheDir, 0700)
  return filepath.Join(tokenCacheDir,
    url.QueryEscape("youtube-go-quickstart.json")), err
}

// tokenFromFile retrieves a Token from a given file path.
// It returns the retrieved Token and any read error encountered.
func tokenFromFile(file string) (*oauth2.Token, error) {
  f, err := os.Open(file)
  if err != nil {
    return nil, err
  }
  t := &oauth2.Token{}
  err = json.NewDecoder(f).Decode(t)
  defer f.Close()
  return t, err
}

// saveToken uses a file path to create a file and store the
// token in it.
func saveToken(file string, token *oauth2.Token) {
  fmt.Printf("Saving credential file to: %s\n", file)
  f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
  if err != nil {
    log.Fatalf("Unable to cache oauth token: %v", err)
  }
  defer f.Close()
  json.NewEncoder(f).Encode(token)
}

func handleError(err error, message string) {
  if message == "" {
    message = "Error making API call"
  }
  if err != nil {
    log.Fatalf(message + ": %v", err.Error())
  }
}

func channelsListByUsername(service *youtube.Service, part string, forUsername string) {
  call := service.Channels.List(part)
  call = call.ForUsername(forUsername)
  response, err := call.Do()
  handleError(err, "")
  fmt.Println(fmt.Sprintf("This channel's ID is %s. Its title is '%s', " +
              "and it has %d views.",
              response.Items[0].Id,
              response.Items[0].Snippet.Title,
              response.Items[0].Statistics.ViewCount))
}


func main() {
  ctx := context.Background()

  b, err := ioutil.ReadFile("client_secret.json")
  if err != nil {
    log.Fatalf("Unable to read client secret file: %v", err)
  }

  // If modifying these scopes, delete your previously saved credentials
  // at ~/.credentials/youtube-go-quickstart.json
  config, err := google.ConfigFromJSON(b, youtube.YoutubeReadonlyScope)
  if err != nil {
    log.Fatalf("Unable to parse client secret file to config: %v", err)
  }
  client := getClient(ctx, config)
  service, err := youtube.New(client)

  handleError(err, "Error creating YouTube client")

  channelsListByUsername(service, "snippet,contentDetails,statistics", "GoogleDevelopers")
}

4단계: 샘플 실행

작업 디렉터리에서 다음 명령어를 사용하여 샘플을 빌드하고 실행합니다.

go run quickstart.go

샘플을 처음 실행하면 액세스를 승인하라는 메시지가 표시됩니다.

  1. 웹브라우저에서 제공된 URL로 이동합니다.

    아직 Google 계정에 로그인하지 않은 경우 로그인하라는 메시지가 표시됩니다. 여러 Google 계정에 로그인되어 있는 경우 승인에 사용할 계정 한 개를 선택하라는 메시지가 표시됩니다.

  2. 수락 버튼을 클릭합니다.
  3. 제공된 코드를 복사하여 명령줄 프롬프트에 붙여넣고 Enter 키를 누릅니다.

메모

  • 승인 정보는 파일 시스템에 저장되므로 이후의 실행 시 승인 메시지가 표시되지 않습니다.
  • 이 예시의 승인 흐름은 명령줄 애플리케이션용으로 고안되었습니다. 웹 애플리케이션에서 승인을 수행하는 방법에 대한 자세한 내용은 웹 서버 애플리케이션용 OAuth 2.0 사용을 참조하세요.

추가 자료