質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1668閲覧

YouTubeのLIve配信動画におけるチャットコメントを習得するプログラムでリアルタイムでコメントをとってこられない

macarooon

総合スコア2

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/05/19 17:23

前提・実現したいこと

Youtubeapiを用いたunityとyoutubeliveの連携

Youtubeliveのチャットを取得し、unityのコンソールに表示させたい。
チャットの書き込みがあったらその都度表示させたいです。

こちらのサイトを参考に、コードをそのまま使用しています。
https://qiita.com/n0mimono/items/0c2921c9b964cd305fe3

発生している問題・エラーメッセージ

unity起動時に、すでにチャット上にあるコメントは、コンソールに表示されるのですが、 その後Youtubeliveチャットにコメントを記入してもunityのコンソールに表示されません。

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using System.Threading; 4using System; 5using System.Net; 6using System.Text.RegularExpressions; 7using UnityEngine; 8using UnityEngine.Networking; 9using SimpleJSON; 10 11public class YouTubeLiveController : MonoBehaviour { 12 13 IEnumerator Start() { 14 var clientId = "自分のクライアントID"; 15 var clientSecret = "自分のクライアントシークレット"; 16 17 var code = ""; 18 LocalServer (c => code = c); 19 20 var authUrl = "https://accounts.google.com/o/oauth2/v2/auth?response_type=code" 21 + "&client_id=" + clientId 22 + "&redirect_uri=" + "http://localhost:8080" 23 + "&scope=" + "https://www.googleapis.com/auth/youtube.readonly" 24 + "&access_type=" + "offline"; 25 Application.OpenURL (authUrl); 26 yield return new WaitUntil (() => code != ""); 27 28 Debug.Log (code); 29 30 var tokenUrl = "https://www.googleapis.com/oauth2/v4/token"; 31 var content = new Dictionary<string,string> () { 32 { "code", code }, 33 { "client_id", clientId }, 34 { "client_secret", clientSecret }, 35 { "redirect_uri", "http://localhost:8080" }, 36 { "grant_type", "authorization_code" }, 37 { "access_type", "offline" }, 38 }; 39 var request = UnityWebRequest.Post (tokenUrl, content); 40 yield return request.SendWebRequest(); 41 42 var json = JSON.Parse (request.downloadHandler.text); 43 var token = json["access_token"].RawString(); 44 45 Debug.Log (token); 46 47 var url = "https://www.googleapis.com/youtube/v3/liveBroadcasts?part=snippet"; 48 url += "&id=" + "配信中のyoutubeliveのv=の後ろを記入"; 49 50 var req = UnityWebRequest.Get (url); 51 req.SetRequestHeader ("Authorization", "Bearer " + token); 52 yield return req.SendWebRequest(); 53 54 json = JSON.Parse (req.downloadHandler.text); 55 var chatId = json["items"][0]["snippet"]["liveChatId"].RawString(); 56 57 Debug.Log (chatId); 58 59 url = "https://www.googleapis.com/youtube/v3/liveChat/messages?part=snippet,authorDetails"; 60 url += "&liveChatId=" + chatId; 61 62 req = UnityWebRequest.Get (url); 63 req.SetRequestHeader ("Authorization", "Bearer " + token); 64 yield return req.SendWebRequest(); 65 66 json = JSON.Parse (req.downloadHandler.text); 67 var items = json["items"]; 68 69 foreach (var item in items) { 70 var snip = item.Value ["snippet"]; 71 var author = item.Value["authorDetails"]; 72 Debug.Log (author ["displayName"].RawString () + ": " 73 + snip ["displayMessage"].RawString()); 74 } 75 Debug.Log (json["nextPageToken"]); 76 } 77 78 void LocalServer(Action<string> onReceive) { 79 ThreadStart start = () => { 80 try { 81 var listener = new HttpListener(); 82 listener.Prefixes.Add("http://*:8080/"); 83 listener.Start(); 84 85 var context = listener.GetContext(); 86 var req = context.Request; 87 var res = context.Response; 88 89 var re = new Regex (@"/?code=(?<c>.*)"); 90 var code = re.Match (req.RawUrl).Groups ["c"].ToString(); 91 onReceive(code); 92 93 res.StatusCode = 200; 94 res.Close(); 95 } catch (Exception e) { 96 Debug.LogError(e); 97 } 98 }; 99 new Thread (start).Start (); 100 } 101 102} 103 104public static class SimpleJsonUtility { 105 public static string RawString(this JSONNode node) { 106 var len = node.ToString ().Length - 2; 107 return node.ToString ().Substring (1, len); 108 } 109}

試したこと

75行目あたり
Debug.Log (json["nextPageToken"]);
こちらで新しいコメントが記入されるとコンソールに表示するようにしていると思います。

問題点と解決策をご教示していただきたいです。どうぞよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Youtubeのリアルタイムコメント取得は知らないので解決方法はわかりませんが、
明確に悪い点として、req.SendWebRequest(); 以降にWebからデータ取得していない点があげられます

その後の処理は受け取ったデータをjsonパーサを用いて表示しているだけで、
追加のコメントがあったとしても、Webから取得する仕組みもないし、
ストリームを用いている箇所も見当たりません

おそらく、nextPageTokenを使って再度Webリクエストを送信する必要があるのではないですか?

投稿2020/05/19 22:26

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macarooon

2020/05/20 16:18

ご指摘していただいたとおり、こちらのコードではリアルタイムでコメント取得出来ないようでした.. 参考サイトから用いるコードが違った用です。 解決しました。 ご回答ありがとうございました...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問