YoutubeのコメントをDiscordに転送


以前作成した、Youtubeの新規コメントをDiscordに転送するBOTを紹介する。

function fetchData(videoId) {
// データを取得
let pageToken = '';
const data = YouTube.CommentThreads.list('id, replies, snippet', {
videoId: videoId,
maxResults: 10,
order: 'time',
textFormat: 'plaintext',
pageToken: pageToken,
});
return data;
}
//特定の動画のコメントを最新の10個取得する関数(固定コメントがある場合先頭に取得されるため注意)
// }
// すべての動画を取得
function getallvideos() {
let listid = "";
//各チャンネルに存在する、すべての投稿動画が含まれる再生リストのID
let listres = YouTube.PlaylistItems.list('contentDetails', { playlistId: listid, maxResults: 33 });
//最新33動画についてデータを取得
//次のページのトークンを取得する
let nexttoken = listres.nextPageToken;
let videoIds = [];
//取得した動画アイテムをデータ分idを取得する
for (let i = 0; i < listres.items.length; i++) {
//2次元で追加していく
videoIds.push(listres.items[i].contentDetails.videoId);
}
return videoIds;
}
function analyze() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
//各動画の最終コメント取得日時などをスプレッドシートに保存している
const sheet = spreadsheet.getSheets()[0];
getallvideos().forEach((element, i) => {
console.log(element);
var textFinder = sheet.createTextFinder(element);
console.log(textFinder);
var cells = textFinder.findAll()
console.log(cells);
const id=element;
// console.log(cells);
if (cells.length == 0) {
sheet.insertRowBefore(2);
sheet.getRange("A2").setValue(element);
var cellNumber = 2;
newVideo(element);
} else {
// console.log(cells[0].getA1Notation());
var cellNumber = sheet.getRange(cells[0].getA1Notation()).getRow();
}
// console.log(cellNumber);
const item = fetchData(element).items;
item.reverse().forEach((element, i) => {
// console.log(element);
if (element == undefined) {
}
else {
const b = sheet.getRange("B" + String(cellNumber));
const time = new Date(element.snippet.topLevelComment.snippet.publishedAt).getTime();
if (time > b.getValue() || b.getValue() == "") {
send("[▶](<https://www.youtube.com/watch?v="+id+">) "+element.snippet.topLevelComment.snippet.textDisplay, element.snippet.topLevelComment.snippet.authorDisplayName, element.snippet.topLevelComment.snippet.authorProfileImageUrl);
//コメント本文・投稿者の名前・投稿者のアイコンを送信、絵文字に動画のリンクを貼ることでどの動画へのコメントか確認することができる
b.setValue(time);
}
else {
}
}
})
});
}
// getallvideos関数で用いる、すべての動画が入った再生リストを取得
function getlistid() {
//idを指定してリストを取得
let res = YouTube.Channels.list(part = "contentDetails", { id: "UCJ6tw8z3pAqyQIM_Qsp1XIA" });
//アップロード動画の再生リストIDを取得して変数に入れておく
let listid = res.items[0].contentDetails.relatedPlaylists.uploads;
console.log(listid);
}
// 以下Discord送信に関する関数
function newVideo(id){
//新規動画の投稿を通知する
var WEBHOOK_URL = ""
let payload =
{
"content": "https://www.youtube.com/watch?v="+id
};
let options =
{
"method": "post",
"payload": payload
};
UrlFetchApp.fetch(WEBHOOK_URL, options);
}
function send(content, name, icon) {
//コメントの内容をDiscordに転送する
 var WEBHOOK_URL = ""
let payload =
{
"content": content,
"tts": false,
"username": name,
"avatar_url": icon,
};
//Botの名前とアイコンを投稿者のものに変更する
let options =
{
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload)
};
UrlFetchApp.fetch(WEBHOOK_URL, options);
}

このプログラムを、YouTubeAPIの上限も加味して5分に一回実行することでほぼリアルタイムでコメントを取得することができる。

YouTubeにログインしなくてもコメントを確認できる、皆でコメントに対してリアクションできるなど、複数人でYouTubeアカウントを運営している場合に便利。