ブラウンチップ☆ 2020/01/11 17:13

ScalaでYoutubeLiveのコメントを取得してみる

はいどーもScalaできまScalaで有名なツミオです。
ScalaでYoutubeLiveのコメントを取得してみようと思い立ったので、本日は備忘録をば。

環境

SBTを使います。
build.sbtは以下の通りです。

name := "YoutubeLiveSample"

version := "0.1"

scalaVersion := "2.13.1"

libraryDependencies += "com.google.apis" % "google-api-services-youtube" % "v3-rev212-1.25.0"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")

YouTube Data APIを使用するために、依存関係を指定している以外はまあ普通かなと思います。
ちなみMaven Repositoryから探したやつです。
バージョンとかは適宜調整するとよい気がします。

APIキーの有効化

C#の記事ですが、APIキーの有効化には関係ないのでこちらの記事を参考にしました。
画像付きで非常にわかりやすかったです。

参考にするサイト

さてあとはコードを書くだけです。
が、Youtube Data APIを使ったこともなければ、Scalaも初心者ですので、今回の記事では「とりあえずコメントを取得できればなんでもOK」ということにしました。
基本は先に紹介したC#の記事を参考にしながら進めたのですが、Scalaではそのまま当てはめられないところも多々あったので、他に以下のサイトを参考にして作成しました。

基本は上記の2つですが、GitHubにもよさげなものが公開されています。

この中の特にListLiveChatMessagesは非常に参考になりそうな気配がしています(今回はこのリポジトリの存在に気がつけなかったので、次回以降利用してみます)。

LiveChatIDの取得

まずLiveChatIDを調べなければならないようです。
これはVideoIDからわかるようで、どうもハッシュ化かなにかされたもののようです。

https://www.youtube.com/watch?v=XXXXXX

これで言うとXXXXXXの部分がVideoIDですね。
VideoIDからLiveChatIDを調べるためのメソッドを定義します。

  def getLiveChatId(youtube:YouTube, videoId:String) : String = {
    val videoList = youtube.videos
      .list("LiveStreamingDetails")
      .setFields("items/liveStreamingDetails/activeLiveChatId")
      .setKey(apiKey)
      .setId(videoId)
    val response: VideoListResponse = videoList.execute

    val list = response.getItems.asScala
    list.filter(!_.isEmpty).map(_.getLiveStreamingDetails.getActiveLiveChatId).head
  }

apiKeyには先ほどAPIキーの有効化で作成したものを当てはめておきます。
YouTube型はYouTube Data APIリクエストの作成に使用するもので、こちらはあとで作成します。

このメソッドは以下のようにして使用できます。

val liveChatId = getLiveChatId(youtubeService, "HogeHoge")

チャットメセージの取得

次はシャットのメッセージを取得します。
まずはこんな感じ。

    val liveChatRequest = youtube.liveChatMessages.list(liveChatId, "snippet,authorDetails")
    liveChatRequest.setPageToken(nextPageToken)
    liveChatRequest.setKey(apiKey)
    val liveChatResponse = liveChatRequest.execute()

最初の行はsnippet,authorDetailsのみをリストから取ってくるという意味なのだと思いますが、snippetとauthorDetailsである理由はよくわかりませんw
とりあえずサンプルがこうなってたのでこうしただけです。
2行目と3行目はapiKeyやトークンをセットしています(nextPageTokenはリアルタイムにチャットメッセージを取得するときに使うもので、今回は「1度取得したら終わり」なところまでしか作らないのであまり関係なさそうです)。

リクエストを作り終えたら、あとはexecuteしてresponseを受けるだけですね。
このレスポンスを利用して実際にコメントをプリントするコードが以下の通りです。

    val list = liveChatResponse.getItems.asScala
    for(liveChat <- list) {
      if(liveChat.getSnippet.getSuperChatDetails != null) {
        println(s"スパチャ情報:${liveChat.getSnippet.getSuperChatDetails}")
      }
      println(s"${liveChat.getAuthorDetails.getDisplayName}:${liveChat.getSnippet.getDisplayMessage}")
    }

スパチャコメントがあればそれを表示して、スパチャが投げられていなければ普通に「書き込んだ人の名前」と「コメント内容」をプリントしています。
上記のコードをまとめて

getLiveChatMessages(liveChatId:String, youtube:YouTube, nextPageToken:String)

としておきます。
Scalaっぽくない非常に汚いコードなので、次回以降直していきます……。

動かしてみる

  val scopes = List("https://www.googleapis.com/auth/youtube").asJava
  val HTTP_TRANSPORT = new NetHttpTransport
  val JSON_FACTORY = new JacksonFactory
  val credential = new GoogleCredential().createScoped(scopes)
  val youtubeService: YouTube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
    "youtube-cmdline-channelbulletin-sample").build()

  val liveId = getLiveChatId(youtubeService, "XXXXXXXXXXXX")
  println(s"LiveChatID:$liveId")
  getLiveChatMessages(liveId, youtubeService, "")

はいこんな感じです。
NetHttpTransportとJacksonFactoryが何やってるのかはよくわからないですが、サンプルでこうしてたのでそうしました。
credentialだけはどうも情報が古いのか、そのままやっても動かなかったのでGoogleCredentialを利用しています。

あとはBuilderで組み立てればOKです。
これでコメントが取得できるようになりました。

終わりに

本日は非常に駆け足な記事ですが、Scalaで実装する情報が皆無だったので色々と苦労しました。
たぶんC#だったら5分くらいで作れたと思うんですが(情報多いですし)、Scalaで作ったこれ実際には数時間かかってますw

ですがなんとなく仕組みがわかってきたので「僕専用のコメントビューア」をScalaの学習用としてボチボチ作ってみたいと思いますよ。

Scala使った仕事に就きたいですねえ。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

記事を検索