View all comments on a YouTube video

前端 未结 2 2082
独厮守ぢ
独厮守ぢ 2021-02-04 13:23

I am trying to get all the comments on a YouTube video using a Java program. I cannot get them though as it has the \"Show More\" instead of all the comments. I\'m looking for a

相关标签:
2条回答
  • 2021-02-04 13:40

    try this it can download all the comments for a given video which i have tested.

    https://github.com/egbertbouman/youtube-comment-downloader

    python downloader.py --youtubeid YcZkCnPs45s --output OUT 
    Downloading Youtube comments for video: YcZkCnPs45s 
    Downloaded 1170 comment(s) 
    Done!
    

    output is in the JSON format:

    {
      "text": "+Tony Northrup many thanks for the prompt reply - I'll try that.",
      "time": "1 day ago",
      "cid": "z13nfbog0ovqyntk322txzjamuensvpch.1455717946638546"
    }
    
    0 讨论(0)
  • 2021-02-04 13:55

    You need to get comment threads list request for your video and then scroll forward using next page token from the last response:

    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();
        }
    }
    

    Consider api-samples, if you need a sample skeleton project.


    Update

    The situation when you can't get all the comments can be also caused by the quota limits (at least I faced it):

    • units/day 50,000,000
    • units/100seconds/user 300,000

    This is not a java, python, js, or whatever language specific rules. If you want to get above the quota, you cant try to apply for higher quota. Though, I would start from controlling your throughput. It's very easy to get above the 100seconds/user quota.

    0 讨论(0)
提交回复
热议问题