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使った仕事に就きたいですねえ。