如何检索 youtube 视频的评论
Posted
技术标签:
【中文标题】如何检索 youtube 视频的评论【英文标题】:how to retrieve comments of a youtube video 【发布时间】: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();
【问题讨论】:
【参考方案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。以上是关于如何检索 youtube 视频的评论的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 从视频 URL 中检索 YouTube 视频详细信息?