概要
- 気になる事があったので、配信のコメントを取得するツールを作成した。
- トップレベルコメントのみ(コメントへの返信は取得していない)
- APIキーは伏字。log4jsでログ出力しているので(いないとは思いますが)流用する場合は各々の出力方法に変換してください。
引数
- 動画ID(watch?v=XXXXXXXXXXXのXXXXXXXXXXX部分)
実行結果
以下を出力する。
- 投稿者表示名(items.snippet.topLevelComment.snippet.authorDisplayName)
- 投稿者チャンネルID(items.snippet.topLevelComment.snippet.authorChannelId.value)
- 表示メッセージ(items.snippet.topLevelComment.snippet.textDisplay)
- いいね数(items.snippet.topLevelComment.snippet.likeCount)
- 投稿日(items.snippet.topLevelComment.snippet.publishedAt)
- 詳細はAPIドキュメントを参照
備考
YouTubeの利用規約としては、個人を特定する情報を収集・取得するのは駄目、とありますが、
APIで取得できる情報が規約的に駄目ならAPIを使っては駄目なのでは、という話になりかねないので
とりあえず取得できるものは見ていい(DBには保存しない)というスタンスで扱います。
ソース
const ApiKey = "key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
const UrlCommentThreads = "https://www.googleapis.com/youtube/v3/commentThreads?" + ApiKey + "&part=snippet&maxResults=100&videoId="
var logger = require('../modules/logger');
var axios = require("axios");
let targetVideoId = getTargetVideoId(process.argv);
if ( targetVideoId == undefined || targetVideoId.length == 0 ) {
logger.info("video comment require arg... video id.")
return;
}
// call main
main(targetVideoId);
function getTargetVideoId(argv) {
if ( argv.length <= 2 ) {
return "";
}
return argv[2];
}
// main
async function main(videoId) {
logger.info("video comment start");
var itemArray = new Array();
logger.info("get video comment, videoId[" + videoId + "]");
await outVideoComment(itemArray, videoId, "");
logger.info("video comment end");
};
// out video comment
async function outVideoComment(itemArray, videoId, pageToken) {
var nextPageToken = "";
var docs = undefined;
let requestUrl = UrlCommentThreads + videoId + "&pageToken=" + pageToken;
logger.debug(requestUrl)
await axios.get(requestUrl)
.then(function(res) {
nextPageToken = res.data.nextPageToken;
docs = res.data.items;
})
.catch(function(err) {
docs = undefined;
logger.error("axios error!");
logger.error(err);
});
if ( docs != undefined && docs.length > 0 ) {
for ( let key in docs ) {
let topLevelCommentSnippet = docs[key].snippet.topLevelComment.snippet;
let comment = {
authorDisplayName: topLevelCommentSnippet.authorDisplayName,
authorChannelId: topLevelCommentSnippet.authorChannelId.value,
textDisplay: topLevelCommentSnippet.textDisplay,
likeCount: topLevelCommentSnippet.likeCount,
publishedAt: topLevelCommentSnippet.publishedAt
}
logger.info(comment);
}
} else {
logger.debug("no docs");
}
if ( nextPageToken == undefined || nextPageToken == "" || nextPageToken.length == 0 ) {
logger.debug("no next page");
return;
}
await outVideoComment(itemArray, videoId, nextPageToken);
}