【问题标题】:How do you get the comments of a video using the YouTube Java Client API when given the video ID?给定视频 ID 后,如何使用 YouTube Java 客户端 API 获取视频评论?
【发布时间】:2021-04-14 13:49:00
【问题描述】:

我希望编写将视频 ID 作为输入并检索在相应视频上制作的 cmets 的代码。这是link to the API docs。我试过这段代码

    String videoId = "id";
    YouTube.Comments.List list2 = youtube.comments().list(Arrays.asList("snippet"));
    list2.setId(Arrays.asList(videoId));
    list2.setKey(apiKey);
    Comment c = list2.execute().getItems().get(0);

但我在最后一行得到一个IndexOutOfBoundsException,因为getItems 返回一个空的List。我将videoId 设置为有效的 YouTube 视频 ID(我已经成功地从中获取了视频数据,如观看次数、标题等),我认为这可行,但显然我错了。除非我错过了一些东西,否则我在 Video 类的文档中找不到任何关于获取评论数据的内容,所以这就是我再次向 SO 寻求帮助的原因。

编辑:根据 stvar 的评论,我尝试将上述代码的第二行更改为

YouTube.CommentThreads.List list2 = youtube.commentThreads().list(Arrays.asList("snippet"));

当然将c 的类型更改为CommentThread。 这是我应该使用的CommentThreads API,对吧?无论哪种方式,这也会返回一个空列表...

【问题讨论】:

  • 您没有进行正确的 API 调用。请阅读answer I provided to a similar question,其中描述了检索给定视频的所有 cmets(顶级和回复)所需的 API。
  • 在阅读您链接的答案后,我第二次尝试获取数据并编辑了问题。

标签: java youtube youtube-data-api


【解决方案1】:

这是检索任何给定视频的所有 cmets(顶级和回复)的完整 Java 代码:

List<Comment> get_comment_replies(
    YouTube youtube, String apiKey, String commentId)
{
    YouTube.Comments.List request = youtube.comments()
        .list(Arrays.asList("id", "snippet"))
        .setParentId(commentId)
        .setMaxResults(100)
        .setKey(apiKey);
    List<Comment> replies = new ArrayList<Comment>();
    String pageToken = "";

    do {
        CommentListResponse response = request
            .setPageToken(pageToken)
            .execute();

        replies.addAll(response.getItems());

        pageToken = response.getNextPageToken();
    } while (pageToken != null);

    return replies;
}

List<CommentThread> get_video_comments(
    YouTube youtube, String apiKey, String videoId)
{
    YouTube.CommentThreads.List request = youtube.commentThreads()
        .list(Arrays.asList("id", "snippet", "replies"))
        .setVideoId(videoId)
        .setMaxResults(100)
        .setKey(apiKey);
    List<CommentThread> comments = new ArrayList<CommentThread>();
    String pageToken = "";

    do {
        CommentThreadListResponse response = request
            .setPageToken(pageToken)
            .execute();

        for (CommentThread comment : respose.getItems()) {
            CommentThreadReplies replies = comment.getReplies();
            if (replies != null &&
                replies.getComments().size() !=
                comment.getSnippet().getTotalReplyCount())
                replies.setComments(get_comment_replies(
                    youtube, apiKey, comment.getId()));
        }

        comments.addAll(response.getItems());

        pageToken = response.getNextPageToken();
    } while (pageToken != null);

    return comments;
}

您必须调用 get_video_comments,将您感兴趣的视频的 ID 传递给它。返回的列表包含该视频的所有顶级 cmets;每个顶级评论都有其 replies 属性,其中包含所有相关的评论回复。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多