Java 查看YouTube视频上的所有评论

Java 查看YouTube视频上的所有评论,java,youtube,Java,Youtube,我正在尝试使用Java程序获取YouTube视频上的所有评论。我不能得到他们虽然,因为它有“显示更多”而不是所有的评论。我正在寻找一种方法,以获得所有的意见或网页的意见,我可以通过。我有一个视频id和东西,只需要评论 我尝试了所有的评论,而不是在URL中观看,但它不会仍然显示所有评论,并重定向到再次观看 我还查看了YouTube api,只能找到如何使用id获取评论,但我需要从视频id获取所有评论 如果有人知道怎么做,请告诉我 我已经为任何能给我一个好答案的人添加了50个代表奖金。您需要获取视频

我正在尝试使用Java程序获取YouTube视频上的所有评论。我不能得到他们虽然,因为它有“显示更多”而不是所有的评论。我正在寻找一种方法,以获得所有的意见或网页的意见,我可以通过。我有一个视频id和东西,只需要评论

我尝试了所有的评论,而不是在URL中观看,但它不会仍然显示所有评论,并重定向到再次观看

我还查看了YouTube api,只能找到如何使用id获取评论,但我需要从视频id获取所有评论

如果有人知道怎么做,请告诉我


我已经为任何能给我一个好答案的人添加了50个代表奖金。

您需要获取视频的评论线程列表请求,然后使用上一次响应中的下一页标记向前滚动:

private static int counter = 0;
private static YouTube youtube;

public static void main(String[] args) throws Exception {
    // For Auth details consider:
    // https://github.com/youtube/api-samples/blob/master/java/src/main/java/com/google/api/services/samples/youtube/cmdline/Auth.java
    // Also don't forget secrets https://github.com/youtube/api-samples/blob/master/java/src/main/resources/client_secrets.json
    List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube.force-ssl");
    Credential credential = Auth.authorize(scopes, "commentthreads");
    youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).build();

    String videoId = "video_id";

    // Get video comments threads
    CommentThreadListResponse commentsPage = prepareListRequest(videoId).execute();

    while (true) {
        handleCommentsThreads(commentsPage.getItems());

        String nextPageToken = commentsPage.getNextPageToken();
        if (nextPageToken == null)
            break;

        // Get next page of video comments threads
        commentsPage = prepareListRequest(videoId).setPageToken(nextPageToken).execute();
    }

    System.out.println("Total: " + counter);
}

private static YouTube.CommentThreads.List prepareListRequest(String videoId) throws Exception {

    return youtube.commentThreads()
                  .list("snippet,replies")
                  .setVideoId(videoId)
                  .setMaxResults(100L)
                  .setModerationStatus("published")
                  .setTextFormat("plainText");
}

private static void handleCommentsThreads(List<CommentThread> commentThreads) {

    for (CommentThread commentThread : commentThreads) {
        List<Comment> comments = Lists.newArrayList();
        comments.add(commentThread.getSnippet().getTopLevelComment());

        CommentThreadReplies replies = commentThread.getReplies();
        if (replies != null)
            comments.addAll(replies.getComments());

        System.out.println("Found " + comments.size() + " comments.");

        // Do your comments logic here
        counter += comments.size();
    }
}
private static int counter=0;
私有静态YouTube YouTube;
公共静态void main(字符串[]args)引发异常{
//有关身份验证详细信息,请考虑:
// https://github.com/youtube/api-samples/blob/master/java/src/main/java/com/google/api/services/samples/youtube/cmdline/Auth.java
//也不要忘记秘密https://github.com/youtube/api-samples/blob/master/java/src/main/resources/client_secrets.json
列表范围=列表。newArrayList(“https://www.googleapis.com/auth/youtube.force-ssl");
凭证=授权(作用域,“评论线程”);
youtube=new youtube.Builder(Auth.HTTP_TRANSPORT,Auth.JSON_FACTORY,credential).build();
String videoId=“video\u id”;
//获取视频评论线程
CommentThreadListResponse commentsPage=prepareListRequest(videoId).execute();
while(true){
handleCommentsThreads(commentsPage.getItems());
String nextPageToken=commentsPage.getNextPageToken();
if(nextPageToken==null)
打破
//获取下一页视频评论线程
commentsPage=prepareListRequest(videoId).setPageToken(nextPageToken.execute();
}
系统输出打印项次(“总计:+计数器);
}
私有静态YouTube.CommentThreads.List prepareListRequest(字符串videoId)引发异常{
返回youtube.commentThreads()
.list(“片段、回复”)
.setVideoId(videoId)
.setMaxResults(100L)
.setModerationStatus(“已发布”)
.setTextFormat(“纯文本”);
}
私有静态void handleCommentsThreads(列出commentThreads){
for(CommentThread CommentThread:commentThreads){
List comments=Lists.newArrayList();
comments.add(commentThread.getSnippet().getTopLevel注释());
CommentThreadReplies=commentThread.getReplies();
如果(回复!=null)
comments.addAll(repress.getComments());
System.out.println(“find”+comments.size()+comments.”);
//你的评论符合逻辑吗
计数器+=注释.size();
}
}
如果需要样例骨架项目,请考虑


更新

无法获得所有评论的情况也可能是由以下原因造成的(至少我面对过):

  • 单位/50000000
  • 单位/100秒/用户300000

这不是java、python、js或任何特定于语言的规则。如果你想超过配额,你不能尝试。不过,我会从控制吞吐量开始。很容易超过100秒/用户配额。

试试这个,它可以下载我测试过的给定视频的所有评论

输出为JSON格式:

{
  "text": "+Tony Northrup many thanks for the prompt reply - I'll try that.",
  "time": "1 day ago",
  "cid": "z13nfbog0ovqyntk322txzjamuensvpch.1455717946638546"
}

有趣的是,我也期待着一个答案。如果6小时内没有人回答,我就要悬赏了。我不介意,只要有人回答,这就是我所关心的。悬赏现在被增加了!检查总页数。写一个循环并进行增量调用使用这种方法,你能抓取的注释数量没有限制吗?我怀疑您能否使用“.setMaxResults()”限制页面大小。这是他们api的一部分,所以你也可以在python客户端中使用它。我的意思是,如果一个视频有1M条评论,这可以下载所有评论吗?我在某处看到api不支持此功能,它使用的api与您的api相同,但来自java。我认为这些限制是由配额造成的。我会把它添加到我的答案中。谢谢,这是我所需要的,谢谢你,但请详细说明限制以及如何申请更高的限制。非常感谢。你得到了赏金:)是的,那一个有效!如果没有YouTube API凭据和配额限制:-)虽然我得到了这样的德国元值有点可笑:{“text”:“Mega Madness\ufeff”,“time”:“vor 1 Woche”,“author”:“Jessica Fischer”,“cid”:“z135hboyasa2j1rgy04cgdrwxmunhdvajqg0k”}但随着下载评论数量的增加,这个脚本变得非常缓慢。YT API快得多。@samsamara如果可能的话,我希望你能用java重写它,或者给我一些建议,让我用java重新创建它。@Vũạ我不是那个脚本的作者。不管怎样,随着评论数量的增加,它变得非常慢。你有什么理由不能使用YT API吗?我已经求助于使用YT API,因为这个脚本太慢了
{
  "text": "+Tony Northrup many thanks for the prompt reply - I'll try that.",
  "time": "1 day ago",
  "cid": "z13nfbog0ovqyntk322txzjamuensvpch.1455717946638546"
}