이번에는 OAuth 2.0 클라이언트 ID를 사용해서 자신의 계정에 비공개 재생목록을 가져와 보겠습니다.

👇아래 링크에서 OAuth 2.0 클라이언트 ID를 먼저 발급해주세요.

https://healer4-13.tistory.com/14

 

Go[golang] Youtube api를 사용하여 비공개 재생목록 가져오기 3편(OAuth 인증 준비)

https://healer4-13.tistory.com/12 Go[golang] Youtube api를 사용하여 공개 재생목록 가져오기 1편(API 키 준비) Youtube api를 사용하기 위해서는 먼저 구글 클라우드 플랫폼에서 프로젝트를 생성해줘야 합니다. ht

healer4-13.tistory.com

 

Github 코드 : https://github.com/jeetkd/golang_youtube_api/tree/main/private_playlist

 

GitHub - jeetkd/golang_youtube_api: golang youtube api use

golang youtube api use. Contribute to jeetkd/golang_youtube_api development by creating an account on GitHub.

github.com

 

go get "google.golang.org/api/youtube/v3"
go get "golang.org/x/oauth2"

youtube api와 OAuth 2.0 클라이언트 인증을 사용하기 위해서 외부 패키지를 다운로드해주세요.

 

 

package main

import (
	"context"
	"fmt"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/option"
	"google.golang.org/api/youtube/v3"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	//Read json file (json 파일 읽어옴)
	jsonKey, err := ioutil.ReadFile("client.json")
	if err != nil {
		log.Fatalf("Failed to read JSON file: %v", err)
	}

	// Set up the OAuth 2.0 configuration (OAuth 2.0 구성 환경 설정)
	config, err := google.ConfigFromJSON(jsonKey, youtube.YoutubeReadonlyScope)
	if err != nil {
		log.Fatalf("Unable to parse client secret file: %v", err)
	}

	// Create a new OAuth 2.0 client (새로운 OAuth 2.0 클라이언트를 생성 합니다.)
	client := getClient(config)

	// Set up the YouTube API client using the authenticated client (인증된 클라이언트를 사용하여 유튜브 API 클라이언트를 설정)
	service, err := youtube.NewService(context.Background(), option.WithHTTPClient(client))
	if err != nil {
		log.Fatalf("Unable to create YouTube service: %v", err)
	}

	// Retrieve the playlist ID for the private playlist you want to access (접근을 원하는 비공개 재생목록 ID)
	playlistID := "자신의 계정에 비공개 재생목록의 ID를 넣어주세요"

	// Retrieve the playlist items from the private playlist (비공개 재생목록으로부터 재생목록 아이템들을 불러옵니다.)
	playlistItemsCall := service.PlaylistItems.List([]string{"snippet"}).
		PlaylistId(playlistID). // 재생목록 ID 설정
		MaxResults(50)          // Adjust the maximum number of results as per your requirements(가져올 재생목록 item 최대값 설정)

	playlistItemsResponse, err := playlistItemsCall.Do() // "youtube.playlistItems.list" 호출 실행.
	if err != nil {
		log.Fatalf("Unable to retrieve playlist items: %v", err)
	}

	// Process and display the playlist items //가져온 재생목록 아이템들을 제목과 ID 출력
	for _, item := range playlistItemsResponse.Items {
		title := item.Snippet.Title
		videoID := item.Snippet.ResourceId.VideoId
		fmt.Printf("Title: %s, Video ID: %s\n", title, videoID)
	}
}

// getClient retrieves a valid OAuth 2.0 client.(유효한 OAuth 2.0 클라이언트를 불러옵니다.)
// 토큰트로 *http.Client를 생성하고 반환
func getClient(config *oauth2.Config) *http.Client {
	// Retrieve a token, if it exists, or prompts the user to authenticate.
	token := getTokenFromWeb(config)
	return config.Client(context.Background(), token)
}

// getTokenFromWeb uses the provided OAuth 2.0 Config to request a Token. (제공된 Auth 2.0 구성을 사용해서 토큰을 요청)
// 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)
	}

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

비공개 재생목록의 아이디와 제목을 가져오는 코드입니다. 하나씩 살펴보겠습니다.

 

config, err := google.ConfigFromJSON(jsonKey, youtube.YoutubeReadonlyScope)

 

- json 파일과 권한 범위를 가지고 *oauth2.Config 구조체를 구성하고 반환함(토큰을 받기 위한 정보가 있음)
jsonKey : 3편에서 다운로드한 json파일
youtube.YoutubeReadonlyScope : 접근 가능한 권한 범위(읽기 전용으로 설정함)

 

service, err := youtube.NewService(context.Background(), option.WithHTTPClient(client))

- Youtube api 사용을 위한 새로운 Service를 생성합니다.
option.WithHTTPClient(client) : 통신을 하기 위해 사용할 HTTP 클라이언트를 지정하는 ClientOption을 리턴.

 

playlistID := "자신의 계정에 비공개 재생목록의 ID를 넣어주세요"

- 접근을 원하는 비공개 재생목록 ID를 넣어주세요.

 

playlistItemsResponse, err := playlistItemsCall.Do()

- "youtube.playlistItems.list"를 실행하고 PlaylistItemListResponse 구조체를 반환합니다.
PlaylistItemListResponse 구조체에 Items에 반환된 재생목록들의 정보가 있습니다.

 

for _, item := range playlistItemsResponse.Items {
		title := item.Snippet.Title
		videoID := item.Snippet.ResourceId.VideoId
		fmt.Printf("Title: %s, Video ID: %s\n", title, videoID)
	}

- resPlaylist.Items를 통해서 반환된 정보를 가져오고 Snippet에서 정보들을 가져옴.
가져온 제목과 비디오 id를 출력합니다.

 

 

1. func getTokenFromWeb(config *oauth2.Config) *oauth2.Token 함수 안에 코드 설명

 

authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)

- 인증코드를 얻기 위한 동의 페이지 url을 반환해 준다. (사용자 인증 후 인증코드 반환)
"state-token" : csrf 방지를 위한 매개변수
oauth2.AccessTypeOffline : 토큰에 관한 설정에 관한 매개변수 (처음에만 인증하고 재인증 필요 없이 리프레쉬 토큰 재발급 가능)

 

token, err := config.Exchange(context.Background(), code)

- 인증코드를 토큰으로 변환해 줍니다.
code : 위에서 발급받고 입력한 인증코드

 

 

2. func getClient(config *oauth2.Config) *http.Client 함수 안에 코드 설명

 

return config.Client(context.Background(), token)

- Client는 제공된 토큰을 사용하여 http 클라이언트를 리턴합니다.
token : 위에서 생성한 토큰

 

실행 화면 설명

 

실행화면 1

1. 빨간색 박스의 url을 복사해서 인터넷 url창에 붙여 넣어서 이동해 주세요.

 

로그인

2. 등록하신 계정으로 로그인해주세요.

 

계속

3. 계속을 눌러주세요.

 

계속

4. 다시 한번 계속을 눌러주세요.

 

토큰 복사

5. 마지막으로 토큰이 발급된 것을 볼 수 있습니다. 빨간색 박스(토큰)를 복사해 주시고 입력해 주시면 돼요.

 

실행 결과

복사하신 토큰을 입력하시면 이렇게 비공개 재생목록의 제목과 ID를 가져옵니다.

6. 파란색 박스 : 토큰

7. 빨간색 박스 : 가져온 제목과 ID

+ Recent posts