0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

YouTubeの配信・動画のコメント(トップレベルコメントのみ)を取得するnode.jsのツールを作成

Last updated at Posted at 2020-11-20

概要

  • 気になる事があったので、配信のコメントを取得するツールを作成した。
  • トップレベルコメントのみ(コメントへの返信は取得していない)
  • 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);
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?