試作ソフト動作時の様子

APIキー及び対象配信のURLを入力し、チャットを取得する。取得したチャットに対し、特定文字列が含まれているものを抽出して表示する。

動作時の様子

上記GIF右側にあるソフトのコードは以下に置いている。

実装内容の詳細

YouTubeLiveチャットの取得

YouTubeLiveチャットはYouTube Data APIを利用して取得する。YouTube Data APIは、YouTubeが公開している、YouTube上の情報を参照及び変更できるAPIである。コードサンプルページを見ると、以下の言語向けのクライアントライブラリがあることを確認できる。

  • Go
  • Java
  • JavaScript
  • .NET
  • PHP
  • Python
  • Ruby

今回は.NET用のGoogleAPIクライアントライブラリを使う。

APIキーの準備

YouTube Data APIを利用するために、APIキーを作成する必要がある。APIキーの作成方法はここでは詳しく記載しない。以下のサイト等を参考にしてほしい。

プロジェクトへのライブラリーの追加

プロジェクトにGoogle.Apis.YouTube.v3をインストールする。以下手順の説明はVisual Studio 2022の利用を想定している。

  1. Visual Studio 2022のタブから プロジェクト > NuGetパッケージの管理 を選択する。

NuGetパッケージの管理

  1. Google.Apis.YouTube.v3を検索し、最新バージョンをインストールする。

Google.Apis.YouTube.v3のインストール

プログラムの実装

チャットを取得するコードを実装する。チャットを取得するまでの流れは以下のような形にしている。

  1. 配信URLからVideo IDを取得する。
  2. Video IDからData APIを使って対象配信のChat IDを取得する。
  3. Chat IDからLive Streaming APIを使ってチャットのデータを取得する。

配信URLからVideo IDを取得する

Video IDは配信URLのクエリパラメータ中のvパラメータに相当する。例えば、配信URLがhttps://www.youtube.com/watch?v=fLM31tHrD5MであればfLM31tHrD5MVideo IDである。

Video ID抽出のための処理はSystem.Web.HttpUtility.ParseQueryString()を利用した。以下に実装のサンプルを記載する。なお、下記サンプルはvパラメータがない場合を想定していない。

var uri = new Uri(stringUrl);   // stringUrlには配信URLが入る
var query = System.Web.HttpUtility.ParseQueryString(uri.Query);
var videoId = query["v"];

Video IDからData APIを使って対象配信のChat IDを取得する

Video IDが取得できても、Video IDから直接チャットデータを取得することはできない。まずはChat IDを取得する必要がある。

Chat IDの取得はvideoリソースのlistメソッドを利用した。以下に実装のサンプルを記載する。

using Google.Apis.Services;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;

var apiKey = "xxxxxxx"; // 取得したAPIキーを指定する
var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
    ApiKey = apiKey
});
var request = youtubeService.Videos.List("liveStreamingDetails");
request.Id = videoId;

var response = await request.ExecuteAsync();
var chatId = response.Items[0].LiveStreamingDetails.ActiveLiveChatId;

Chat IDからLive Streaming APIを使ってチャットのデータを取得する

チャットデータはLive Streaming APIというライブ配信用のAPIを利用して取得する。こちらのAPIはData APIと比較して、公式から提供されている情報に日本語の情報が少ない。

チャットデータの取得はliveChatMessagリソースのlistメソッドを利用した。以下に実装のサンプルを記載する。

using Google.Apis.Services;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;

// チャットのメッセージとnextPageTokenを扱うためのクラス
public class ChatResponse
{
    public IList<LiveChatMessage> liveChatMessages { get; set; }
    public string nextPageToken { get; set; }

    public ChatResponse(IList<LiveChatMessage> liveChatMessages, string nextPageToken)
    {
        this.liveChatMessages = liveChatMessages;
        this.nextPageToken = nextPageToken;
    }
}

// チャットのメッセージとnextPageTokenを取得する
public async Task<ChatResponse> getChat(YouTubeService youtubeService, string chatId, string pageToken = "")
{
    var request = youtubeService.LiveChatMessages.List(chatId, "snippet");
    if (pageToken != "")
    {
        request.PageToken = pageToken;
    }
    var response = await request.ExecuteAsync();
    return new ChatResponse(response.Items, response.NextPageToken);
}

チャットデータの取得は繰り返し行う必要があるため関数化(getChat())して記載している。繰り返し呼び出す際、前回の呼び出し時の戻り値ChatResponse.nextPageTokenを次回呼び出し時の引数pageTokenに指定することで、更新分のデータを取得できる。

ここまででチャットデータの取得が出来るようになったので、後はチャットのメッセージに対し、特定文字列が入っているものを以下のように抽出できればよい。

var searchString = textBox.Text; // 検索文字列入力ボックスから検索文字列を取得する
if (searchString != "" && message.Contains(searchString)) {
    // 検索文字列がチャットのメッセージに含まれている時の処理
    ...
}

今後の拡張内容について

プロジェクト名を"YouTubeLiveChatHooks“としているように、取得したチャットのメッセージに特定文字列が含まれていた場合、任意のWebhookに通知を行えるようにしたい。さらに言えば、Webサーバーをローカルでホストして、上記Webhook通知をトリガーとしてGIF等をブラウザ上で表示出来るようにしたい。