[Go]GAE와 로컬에서 YoutubeDataAPI 사용

12865 단어 5YouTube

소개



YoutubeDataAPI를 사용하면 Youtube 채널 및 업로드된 동영상에 대한 정보를 얻을 수 있습니다.
이번에는 YoutubeDataAPI를 GAE와 로컬 환경에서 사용하는 방법에 대해 설명합니다.
사용할 언어는 go입니다.
YoutubeDataAPI를 사용할 때 인증 방법으로 API 키를 사용하는 방법이 자주 사용되지만 GAE에서 사용하는 경우 GAE 기본 서비스 계정을 사용할 수도 있습니다.
이 문서에서는 인증에 서비스 계정을 사용합니다.

프로젝트 준비



적절한 GCP 프로젝트를 만들고 GAE에 애플리케이션을 배포합니다.
응용 프로그램을 배포하면 기본 서비스 계정이 만들어지므로 내용이 무엇이든 좋으므로 배포하십시오.

배포하면 IAMと管理 > サービスアカウントApp Engine default service account라는 서비스 계정이 만들어집니다.
이 계정의 키를 만들고 키 유형을 JSON으로 저장합니다.



이 키는 로컬에서 YoutubeDataAPI를 사용할 때 필요합니다.

그런 다음 GCP 콘솔 상단의 검색 창에서 Youtube를 검색하여 나온 Youtube Data API v3를 활성화합니다.

이것으로 프로젝트 준비가 완료됩니다.

YoutubeDataAPI 사용



다음 명령을 사용하여 필요한 라이브러리를 설치합니다.
$ go get golang.org/x/oauth2/google
$ go get google.golang.org/api/youtube/v3

로컬에서 사용하는 경우 환경 변수GOOGLE_APPLICATION_CREDENTIALS를 프로젝트 준비에서 검색한 서비스 계정의 키 경로를 설정합니다.
GAE에서 사용할 때는 특별히 아무 것도 할 필요가 없습니다.

나중에 다음 코드에서 사용할 수 있습니다.
자세한 내용은 주석을 참조하십시오.

main.go
// 特定のチャンネルの動画を5件取得し、そのタイトル、投稿日時、長さを表示する
package main

import (
    "context"
    "log"
    "strings"

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

// video 取得した動画の情報を表す構造体
type video struct {
    id          string
    title       string
    publishedAt string
}

func hoge() {
    ctx := context.Background()
    // サービスアカウントを使用した認証用のhttpクライアントを作成
    // 環境変数`GOOGLE_APPLICATION_CREDENTIALS`が設定されている場合は自動で必要な設定をしてくれる
    client, err := google.DefaultClient(ctx, youtube.YoutubeReadonlyScope)
    if err != nil {
        log.Fatalf("Error creating google client: %v", err)
    }

    // youtubeAPIサービスの作成
    service, err := youtube.New(client)
    if err != nil {
        log.Fatalf("Error creating YouTube client: %v", err)
    }

    // 取得するチャンネルのID
    const channelID = "UCLhUvJ_wO9hOvv_yYENu4fQ"

    channelRes, err := service.Channels.List("contentDetails").Id(channelID).Do()
    if err != nil {
        log.Fatalf("Cannot get channel: %v", err)
    }

    channel := channelRes.Items[0]
    // アップロードされた動画から5件を取得する
    // 並び順は必ずしも公開日順とは限らないがだいたい公開日順に並んでいる
    // (最新の動画が先頭ではない可能性がある。アップロード順という説もあるが詳細不明。)
    // 最大50件まで同時に取得可能
    // 50件より多く取得したい場合はNextPageTokenを使用する
    itemRes, err := service.PlaylistItems.List("snippet").
        PlaylistId(channel.ContentDetails.RelatedPlaylists.Uploads).
        MaxResults(5).
        Do()
    if err != nil {
        log.Fatalf("Cannot get playlistitem: %v", err)
    }

    videos := make([]video, 0, len(itemRes.Items))
    videoIDs := make([]string, 0, len(itemRes.Items))
    for _, it := range itemRes.Items {
        // PlaylistItemsでは動画の長さがわからない
        v := video{
            id:          it.Snippet.ResourceId.VideoId,
            title:       it.Snippet.Title,
            publishedAt: it.Snippet.PublishedAt,
        }
        videos = append(videos, v)
        videoIDs = append(videoIDs, it.Snippet.ResourceId.VideoId)
    }

    // 動画の詳細情報を取得する
    videoIDsStr := strings.Join(videoIDs, ",")
    videoRes, err := service.Videos.List("contentDetails").Id(videoIDsStr).Do()
    durationMap := map[string]string{}
    for _, v := range videoRes.Items {
        durationMap[v.Id] = v.ContentDetails.Duration
    }

    // タイトル、投稿日時、長さを表示する
    for _, v := range videos {
        log.Printf("%v - %v - %v", v.title, v.publishedAt, durationMap[v.id])
    }
}

실행 결과
2020/02/02 21:57:46 ポケモン都市伝説 - 2020-02-02T10:00:13.000Z - PT5M34S
2020/02/02 21:57:46 今回はすごく欲求不満になりました…【アプリ実況】 - 2020-02-01T10:00:03.000Z - PT12M24S
2020/02/02 21:57:46 感情を縛られた結果、どうすることもできませんでした。ごめんなさい【#シロ生放送】 - 2020-01-30T12:30:00.000Z - PT1H21M24S
2020/02/02 21:57:46 同じ動画素材を全く違う編集にしてみたらどうなる? - 2020-01-31T10:00:11.000Z - PT5M43S
2020/02/02 21:57:46 絶対に再生を止められない動画 - 2020-01-29T10:00:05.000Z - PT4M19S

좋은 웹페이지 즐겨찾기