【问题标题】:how to retrieve comments of a youtube video如何检索 youtube 视频的评论
【发布时间】:2016-11-22 15:26:15
【问题描述】:

我正在尝试使用以下方法获取 youtube 视频上的所有 cmets,但我无法获取与视频相关的所有 cmets,仅获取了一些 cmets。我尝试用谷歌搜索,但没有任何帮助,有人可以解释一下,如何获取与 youtube 视频相关的所有 cmets。

//url :- "https://www.googleapis.com/auth/youtube.force-ssl"

public void ReadAllComments(String videoId){
    try {

        CommentThreadListResponse videoCommentsListResponse = youtube.commentThreads()
                .list("snippet").setVideoId(videoId).setTextFormat("plainText").execute();

        List<CommentThread> videoComments = videoCommentsListResponse.getItems();

            for (CommentThread videoComment : videoComments) {             
                CommentSnippet  snippet = videoComment.getSnippet().getTopLevelComment().getSnippet();
                System.out.println("  - Author: " + snippet.getAuthorDisplayName());
                System.out.println("  - Comment: " + snippet.getTextDisplay());
                System.out.println("\n-------------------------------------------------------------\n");
            }

    } catch (Exception e) {
         e.printStackTrace();
    }

}

【问题讨论】:

    标签: java video youtube google-api youtube-api


    【解决方案1】:
      CommentThreadListResponse videoCommentsListResponse = youtube.commentThreads()
    .list("snippet").setVideoId(videoId).setTextFormat("plainText").execute();
    

    把上面的代码改成这样就可以了,

     CommentThreadListResponse videoCommentsListResponse = youtube.commentThreads()
    .list("snippet").setVideoId(videoId).setMaxResults(50l).setTextFormat("plainText").execute();
    

    【讨论】:

    • 如果视频有几十万个 cmets 怎么办?
    【解决方案2】:

    您可以使用 CommentThreads 检索 YouTube 视频中的 cmets。 commentThread 资源包含有关 YouTube 评论线程的信息,其中包括顶级评论和对该评论的回复(如果存在)。 commentThread 资源可以代表关于视频或频道的 cmets。

    这是获取 cmets 的 HTTP 请求示例。

    https://www.googleapis.com/youtube/v3/commentThreads?key=YOUR_API_KEY&textFormat=plainText&part=snippet&videoId=Vm8qiuDgcJ8&maxResults=50
    

    只需检查您可以在此请求中使用的不同 parameters

    您还可以在本文档中查看不同的sample code

    这里是 JAVA 的示例。

    package com.google.api.services.samples.youtube.cmdline.data;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.List;
    
    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.googleapis.json.GoogleJsonResponseException;
    import com.google.api.services.samples.youtube.cmdline.Auth;
    import com.google.api.services.youtube.YouTube;
    import com.google.api.services.youtube.model.Comment;
    import com.google.api.services.youtube.model.CommentSnippet;
    import com.google.api.services.youtube.model.CommentThread;
    import com.google.api.services.youtube.model.V3CommentListResponse;
    import com.google.api.services.youtube.model.V3CommentThreadListResponse;
    import com.google.common.collect.Lists;
    
    /**
     * This sample creates and manages comments by:
     *
     * 1. Retrieving the top-level comments for a video via "commentThreads.list" method.
     * 2. Replying to a comment thread via "comments.insert" method.
     * 3. Retrieving comment replies via "comments.list" method.
     * 4. Updating an existing comment via "comments.update" method.
     * 5. Sets moderation status of an existing comment via "comments.setModerationStatus" method.
     * 6. Marking a comment as spam via "comments.markAsSpam" method.
     * 7. Deleting an existing comment via "comments.delete" method.
     *
     * @author Ibrahim Ulukaya
     */
    public class CommentHandling {
    
        /**
         * Define a global instance of a YouTube object, which will be used to make
         * YouTube Data API requests.
         */
        private static YouTube youtube;
    
        /**
         * List, reply to comment threads; list, update, moderate, mark and delete
         * replies.
         *
         * @param args command line args (not used).
         */
        public static void main(String[] args) {
    
            // This OAuth 2.0 access scope allows for full read/write access to the
            // authenticated user's account and requires requests to use an SSL connection.
            List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube.force-ssl");
    
            try {
                // Authorize the request.
                Credential credential = Auth.authorize(scopes, "commentthreads");
    
                // This object is used to make YouTube Data API requests.
                youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential)
                        .setApplicationName("youtube-cmdline-commentthreads-sample").build();
    
                // Prompt the user for the ID of a video to comment on.
                // Retrieve the video ID that the user is commenting to.
                String videoId = getVideoId();
                System.out.println("You chose " + videoId + " to subscribe.");
    
                // Prompt the user for the comment text.
                // Retrieve the text that the user is commenting.
                String text = getText();
                System.out.println("You chose " + text + " to subscribe.");
    
                // All the available methods are used in sequence just for the sake
                // of an example.
    
                // Call the YouTube Data API's commentThreads.list method to
                // retrieve video comment threads.
                V3CommentThreadListResponse videoCommentsListResponse = youtube.commentThreads()
                        .list("snippet").setVideoId(videoId).setTextFormat("plainText").execute();
                List<CommentThread> videoComments = videoCommentsListResponse.getItems();
    
                if (videoComments.isEmpty()) {
                    System.out.println("Can't get video comments.");
                } else {
                    // Print information from the API response.
                    System.out
                            .println("\n================== Returned Video Comments ==================\n");
                    for (CommentThread videoComment : videoComments) {
                        CommentSnippet snippet = videoComment.getSnippet().getTopLevelComment()
                                .getSnippet();
                        System.out.println("  - Author: " + snippet.getAuthorDisplayName());
                        System.out.println("  - Comment: " + snippet.getTextDisplay());
                        System.out
                                .println("\n-------------------------------------------------------------\n");
                    }
                    CommentThread firstComment = videoComments.get(0);
    
                    // Will use this thread as parent to new reply.
                    String parentId = firstComment.getId();
    
                    // Create a comment snippet with text.
                    CommentSnippet commentSnippet = new CommentSnippet();
                    commentSnippet.setTextOriginal(text);
                    commentSnippet.setParentId(parentId);
    
                    // Create a comment with snippet.
                    Comment comment = new Comment();
                    comment.setSnippet(commentSnippet);
    
                    // Call the YouTube Data API's comments.insert method to reply
                    // to a comment.
                    // (If the intention is to create a new top-level comment,
                    // commentThreads.insert
                    // method should be used instead.)
                    Comment commentInsertResponse = youtube.comments().insert("snippet", comment)
                            .execute();
    
                    // Print information from the API response.
                    System.out
                            .println("\n================== Created Comment Reply ==================\n");
                    CommentSnippet snippet = commentInsertResponse.getSnippet();
                    System.out.println("  - Author: " + snippet.getAuthorDisplayName());
                    System.out.println("  - Comment: " + snippet.getTextDisplay());
                    System.out
                            .println("\n-------------------------------------------------------------\n");
    
                    // Call the YouTube Data API's comments.list method to retrieve
                    // existing comment
                    // replies.
                    V3CommentListResponse commentsListResponse = youtube.comments().list("snippet")
                            .setParentId(parentId).setTextFormat("plainText").execute();
                    List<Comment> comments = commentsListResponse.getItems();
    
                    if (comments.isEmpty()) {
                        System.out.println("Can't get comment replies.");
                    } else {
                        // Print information from the API response.
                        System.out
                                .println("\n================== Returned Comment Replies ==================\n");
                        for (Comment commentReply : comments) {
                            snippet = commentReply.getSnippet();
                            System.out.println("  - Author: " + snippet.getAuthorDisplayName());
                            System.out.println("  - Comment: " + snippet.getTextDisplay());
                            System.out
                                    .println("\n-------------------------------------------------------------\n");
                        }
                        Comment firstCommentReply = comments.get(0);
                        firstCommentReply.getSnippet().setTextOriginal("updated");
                        Comment commentUpdateResponse = youtube.comments()
                                .update("snippet", firstCommentReply).execute();
                        // Print information from the API response.
                        System.out
                                .println("\n================== Updated Video Comment ==================\n");
                        snippet = commentUpdateResponse.getSnippet();
                        System.out.println("  - Author: " + snippet.getAuthorDisplayName());
                        System.out.println("  - Comment: " + snippet.getTextDisplay());
                        System.out
                                .println("\n-------------------------------------------------------------\n");
    
                        // Call the YouTube Data API's comments.setModerationStatus
                        // method to set moderation
                        // status of an existing comment.
                        youtube.comments().setModerationStatus(firstCommentReply.getId(), "published");
                        System.out.println("  -  Changed comment status to published: "
                                + firstCommentReply.getId());
    
                        // Call the YouTube Data API's comments.markAsSpam method to
                        // mark an existing comment as spam.
                        youtube.comments().markAsSpam(firstCommentReply.getId());
                        System.out.println("  -  Marked comment as spam: " + firstCommentReply.getId());
    
                        // Call the YouTube Data API's comments.delete method to
                        // delete an existing comment.
                        youtube.comments().delete(firstCommentReply.getId());
                        System.out
                                .println("  -  Deleted comment as spam: " + firstCommentReply.getId());
                    }
                }
            } catch (GoogleJsonResponseException e) {
                System.err.println("GoogleJsonResponseException code: " + e.getDetails().getCode()
                        + " : " + e.getDetails().getMessage());
                e.printStackTrace();
    
            } catch (IOException e) {
                System.err.println("IOException: " + e.getMessage());
                e.printStackTrace();
            } catch (Throwable t) {
                System.err.println("Throwable: " + t.getMessage());
                t.printStackTrace();
            }
        }
    
        /*
         * Prompt the user to enter a video ID. Then return the ID.
         */
        private static String getVideoId() throws IOException {
    
            String videoId = "";
    
            System.out.print("Please enter a video id: ");
            BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
            videoId = bReader.readLine();
    
            return videoId;
        }
    
        /*
         * Prompt the user to enter text for a comment. Then return the text.
         */
        private static String getText() throws IOException {
    
            String text = "";
    
            System.out.print("Please enter a comment text: ");
            BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
            text = bReader.readLine();
    
            if (text.length() < 1) {
                // If nothing is entered, defaults to "YouTube For Developers."
                text = "YouTube For Developers.";
            }
            return text;
        }
    }
    

    更多信息,请查看此相关SO question

    【讨论】:

    • 我正在尝试相同的代码,它输出大约 25 个 cmets,我现在想要的是检索所有 cmets,
    • 可以设置可选参数maxResults。 maxResults 参数指定结果集中应返回的最大项目数。注意:此参数不支持与 id 参数一起使用。可接受的值为 1 到 100,包括 1 到 100。默认值为 20。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2016-11-14
    • 2013-11-21
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多