LoginSignup
5
3

More than 3 years have passed since last update.

YouTube の動画にコメントする in Golang

Posted at

YouTube Data API を使って Golang で動画にコメント(返信)します。

Requirements

  • Golang
    • github.com/joho/godotenv
    • google.golang.org/api/googleapi/transport
    • google.golang.org/api/youtube/v3
  • Google OAuth Client ID
    • Google Cloud Console から作成してください
    • Application typeOther

準備

1. ライブラリのインストール

$ go get github.com/joho/godotenv
$ go get google.golang.org/api/googleapi/transport
$ go get google.golang.org/api/youtube/v3

2. チャンネル作成

Google アカウントでそのまま YouTube を使用している場合は、OAuth Client ID を発行しても認証が通りません。

YouTube の設定からチャンネルを作成する必要があります。

スクリーンショット 2019-04-27 23.24.15.png
スクリーンショット 2019-04-27 23.24.18.png
スクリーンショット 2019-04-27 23.24.21.png

手順

1. コードダウンロード

$ git clone https://github.com/Doarakko/api-challenge
$ cd api-challenge/youtube-data-api

2. CLIENT_IDCLIENT_SECRET を入力

事前に Google Cloud Console 上で作成した認証情報を入れます。

$ mv .env.example .env
CLIENT_ID = ghijk.apps.googleusercontent.com
CLIENT_SECRET = lmnopqr

コードに直書きでも動きますが、間違えて GitHub にあげると面倒なので .env 使います。

3. main.go 修正

func main() {
    err := godotenv.Load("./.env")
    if err != nil {
        log.Fatal("Error loading .env file")
    }
    comment("enter video id", "おもしろい!")
}

Video ID は動画 URL の以下の箇所です。

4. ビルド

$ go build -o main

5. 実行

$ ./main

スクリーンショット 2019-05-02 18.18.07.png

解説

  • comment.go
func comment(videoID string, message string) {
    service := newYoutubeService(newOAuthClient())
    commentThread := &youtube.CommentThread{
        Snippet: &youtube.CommentThreadSnippet{
            VideoId: videoID,
            TopLevelComment: &youtube.Comment{
                Snippet: &youtube.CommentSnippet{
                    TextOriginal: message,
                },
            },
        },
    }
    call := service.CommentThreads.Insert("id,snippet", commentThread)
    _, err := call.Do()
    if err != nil {
        log.Fatalf("%v", err)
    }
    log.Printf("Comment to %v\n", videoID)
}

コメントする際に、コメントの構造体(commentThread)を渡してあげる必要があります。

入れ子になっていてわかりづらいですが、ドキュメント見ながらエディタの補完機能と定義ジャンプ使うと簡単です。

おまけ

ついでにコメントへの返信もやってみます。
コメントと返信とで使用するメソッドが異なるので注意してください。

以下ではいいねの数が 100 以上のコメントに「わろた」と返信します。

1. main.go 修正

func main() {
    err := godotenv.Load("./.env")
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    for _, item := range getComments("enter video id") {
        likeCnt := item.Snippet.TopLevelComment.Snippet.LikeCount

        if likeCnt >= 100 {
            commentID := item.Snippet.TopLevelComment.Id
            reply(commentID, "わろた")
            log.Printf("Reply to %v\n", item.Snippet.TopLevelComment.Snippet.TextDisplay)
        }
    }
}

getComments で引数のビデオのコメントを取得して、いいね数が 100 以上のものに対して reply 関数を実行しています。

返信の場合は返信対象のコメント ID を指定します。

2. ビルド

$ go build -o main

3. 実行

$ ./main

スクリーンショット 2019-05-02 18.04.27.png
スクリーンショット 2019-05-02 18.04.19.png
スクリーンショット 2019-05-02 18.20.00.png

Hints

OAuth Client の作成コードは公式サンプルをそのまま使いました。

作成したトークンをローカルに保存して2回目以降はローカルを参照しています。

cacheFile := tokenCacheFile(config)
token, err := tokenFromFile(cacheFile)
if err != nil {
    token = tokenFromWeb(ctx, config)
    saveToken(cacheFile, token)
} else {
    log.Printf("Using cached token %#v from %q", token, cacheFile)
}

他にも Golang と YouTube Data API 関連で記事を書いているので参考にしてみてください。

おわりに

テストでコメントした際に手動で削除するのが面倒なので、対象の動画で自分のコメントを全削除する関数を書いておけばよかったです。

Reference

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3