如何从 Youtube 视频中获取所有评论

Posted

技术标签:

【中文标题】如何从 Youtube 视频中获取所有评论【英文标题】:How to get all comments from a Youtube video 【发布时间】:2017-07-12 10:55:27 【问题描述】:

首先,我查看了所有其他标题。所有这些都过时了。我的意思是,他们使用的是旧的 api。

我编写了一个代码来列出所有 cmets 及其 nextPageToken


<?php
$url      = "SE0wDh_pILk"; // Youtube video ID
$ytkey    = "IzaSyCaRXmJ9XDC4XucAZCzXx7hisCtYEH0mNs"; //"IzaSyBuu-rnbmPAj1DjR6WmyxGmpmQKz8aTXbw"  Your api key
$nextPage = ""; // Next Page Token for get comments of next Page.
//$i =0; // DO NOT CHANGE


for ($i = 0; $i < 5; $i++) 
    $str = file_get_contents("https://www.googleapis.com/youtube/v3/commentThreads?key=" . "$ytkey" . "&textFormat=plainText&part=snippet&videoId=" . "$url" . "&maxResults=100&nextPagetoken=" . "$nextPage");

    $json = json_decode($str, true); // decode the JSON into an associative array
    //echo '<pre>' . print_r($json, true) . '</pre>'; // Print json data as array structer ..

    echo "$i - " . "Next Page Token : " . $json['nextPageToken']; // Take the next Page Token for get next 100 comment...
    echo "<hr>"; // Divider


    $nextPage = $json['nextPageToken']; // Take token for next query
    // print comments.

    foreach ($json['items'] as $val)  // Loop for list comments...
        $author  = $val['snippet']['topLevelComment']['snippet']['authorDisplayName']; //Get Comment Author Name.
        //$author_url = $val['snippet']['topLevelComment']['snippet']['authorChannelUrl']; //Get Comment Author URL.
        //$author_thumbnail_url = $val['snippet']['topLevelComment']['snippet']['authorProfileImageUrl']; //Get Comment Author Thumbnail URL.
        $comment = $val['snippet']['topLevelComment']['snippet']['textDisplay']; //Get Comment Content.

        echo "<span style='color:red';>" . "$author" . "</span>" . " --> " . "$comment"; // Author and comment
        echo "<hr>"; // Divider
    



echo "Process over. ";
?>

我学习了如何解析 json 以及如何从 *** 在 php 上显示它们。

现在,使用 nextPageTokens 已经没有问题了。但我无法获得 cmets。

当我运行脚本时,它返回不同的nextPageToken 但 cmets 是相同的,它们来自第一页。

我尝试添加足够多的注释行。 抱歉,我无法为 php 代码着色。

【问题讨论】:

您为什么要手动执行此操作而不使用 Google PHP 客户端库? github.com/google/google-api-php-client 你能扩展你的答案吗? 现在您自己编写代码。 Google 为 PHP 创建了一个库,它将为您完成所有这些工作。你让自己变得更难,那么它需要developers.google.com/youtube/v3/code_samples/… 功能不能满足我的要求,我想得到所有评论这个脚本只能查看最常见的cmets并回复它们.. 公开发布您的 API 密钥真的是个好主意吗? 【参考方案1】:

您正在使用参数&amp;nextPagetoken= 调用commentThreads

要使用的正确参数是&amp;pageToken=

【讨论】:

相同的结果 :( 令牌没问题。但是 cmets 是一样的。 对于您代码中的视频 ID SE0wDh_pILk,totalResults 为 90,小于请求的 100。老实说,我不知道为什么 YouTube 在这种情况下会返回 nextPageToken,因为只有 1 页结果。 在视频中,页面显示“有超过 200 个 cmets。但在 json 中只显示大约 100 个 如果您也想要评论回复,您需要请求 part=sn-p,replies【参考方案2】:

这是一个递归的、简单的函数,用于从视频中返回所有 cmets

public function getAllComments($videoId,$pageToken=null,$maxResults)
        $url = "https://www.googleapis.com/youtube/v3/commentThreads";

        static $all =[];
        $params =[
            'key' => 'your-key',
            'part' => 'snippet',
            'maxResults' => $maxResults,
            'videoId' => $videoId,
            'pageToken' => $pageToken
        ];

        $call = $url.'?'.http_build_query($params);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $call);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $data = NULL;
        $data = json_decode($output,true);
        $all[] = $data;
        if(isset($data['nextPageToken']))
            if($data['nextPageToken'] != NULL )
                $pageToken = $data['nextPageToken'];
                getAllComments($videoId,$pageToken,$maxResults);
            
        
        curl_close($ch);
        return $all;


    

【讨论】:

如果您不关心编码,也可以使用youtuberandomcomment.com将cmets下载为json。【参考方案3】:

最后我找到了一个做我想做的事情的网站。

如果您必须收集视频的所有 cmets 并随机抽取其中一个进行抽奖等,请使用这些网站 ->https://www.randomcommentpicker.comhttp://commentpicker.com/youtube.html

【讨论】:

以上是关于如何从 Youtube 视频中获取所有评论的主要内容,如果未能解决你的问题,请参考以下文章

如何抓取 YouTube 视频评论?

使用 YouTube API 从带有 JSON 提要的视频中获取所有评论

如何检索 youtube 视频的评论

获取 YouTube 字幕

查看 YouTube 视频的所有评论

如何从 Youtube 频道获取所有视频 ID