Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获得用户';YouTube的全部观看历史是什么?_Javascript_Youtube Api - Fatal编程技术网

Javascript 如何获得用户';YouTube的全部观看历史是什么?

Javascript 如何获得用户';YouTube的全部观看历史是什么?,javascript,youtube-api,Javascript,Youtube Api,我正在尝试在我的YouTube API应用程序中获取给定用户观看的视频的完整列表。我想把所有视频的总持续时间加起来 当我从历史播放列表中获取视频列表时,API将其限制为50项。有分页,但项目总数是50(不仅仅是每页);我无法使用出现的API访问更多数据 我有没有办法在没有数据上限的情况下得到这个播放列表?我希望有另一种方法(使用API)或者一种不用API的方法。我知道YouTube存储了这些数据,因为我可以查看我的整个历史(远远超过50个视频) 我正在使用以下代码: var requestOpt

我正在尝试在我的YouTube API应用程序中获取给定用户观看的视频的完整列表。我想把所有视频的总持续时间加起来

当我从历史播放列表中获取视频列表时,API将其限制为50项。有分页,但项目总数是50(不仅仅是每页);我无法使用出现的API访问更多数据

我有没有办法在没有数据上限的情况下得到这个播放列表?我希望有另一种方法(使用API)或者一种不用API的方法。我知道YouTube存储了这些数据,因为我可以查看我的整个历史(远远超过50个视频)

我正在使用以下代码:

var requestOptions = {
    playlistId: playlistId,
    part: 'snippet',
    maxResults: 50
};
gapi.client.youtube.playlistItems.list(requestOptions);
其中
playlid
是我从
gapi.client.youtube.channels.list
请求中获取的历史播放列表的id


编辑(2017):我想澄清一下,我一直都想下载自己的历史记录,只是想看看我花了多少时间看视频。我仍然无法做到这一点。

API目前只检索最近两周的手表历史记录。有关更多信息,请参阅报告的错误问题:

注意:
这里也有一个类似的问题:

这似乎是2013年最初报告的一个已知错误。谷歌代码线程上解释了完全相同的行为:

头脑风暴,从未尝试过:您是否尝试过使用API而不是解析URL

理论上,可以模拟用户浏览,包括分页。我不知道这有多困难(可能非常困难),因为您需要处理身份验证,YouTube可能会尝试验证是否有人在浏览。

我不久前为这项任务编写了一个scraper(用Python 2.7(更新为3.5版)和Scrapy)。 由于没有官方API,它使用登录会话cookie和html解析。默认情况下,转储到SQLite。

它是如何完成的:本质上,它打开了url

https://www.youtube.com/feed/history'
使用从Chrome获取的有效(登录)会话cookie。为名称、视频(url)、频道/用户、描述、长度刮取所有视频条目。然后在页面底部找到属性为data uix load more href的按钮,该按钮包含指向下一页的链接,类似于:

"/browse_ajax?action_continuation=1&continuation=98h32hfoasau0fu928hf2hf908h98hr%253D%253D&target_id=item-section-552363&direct_render=1"
。。。从那里重新抓取视频条目,并将它们全部转储到sqlite数据库中;您可以按任何字段(名称、长度、用户、描述等)搜索条目

因此,在他们更改提要/历史页面之前,这是可行的。
我甚至可能会对其进行更新。

虽然目前仅使用YouTube API无法实现这一点,但有一种(尽管有点复杂)方法可以计算您的观看时间:

  • 使用下载手表历史记录列表作为JSON文件
  • 不幸的是,JSON文件不包含视频持续时间,因此下一步是提取视频ID(“titleURL”对象中“watch?v=”之后的部分)
  • 现在,获取您的视频ID列表,并向youtube API发送一个如下所示的请求:
  • (使用创建的代码)

    注意:您可能需要将视频ID列表分成更小的列表(我不得不这样做),否则API可能会拒绝请求。正如[stvar在评论中指出的,ID列表的最大长度是50,因此这是您的列表可以达到的最大长度。(完全披露:我使用Python发送请求)

  • 最后,只需提取持续时间值并将其相加(尽管这可能不像听起来那么容易)

  • 最好的一点是,我不认为这实际上违反了任何ToS。

    文档特别指出,
    maxResults
    的可接受值为0到50。因此,您必须点击paging@Ian,没有分页,总共只有50个结果。如
    response.result.pageInfo.totalResults
    ,它是所有页面上的视频总数也为50。此外,它不会返回
    nextPageToken
    prevPageToken
    。这也证实了它是有上限的。如果有上限,他们不希望你这样做。如果有可能,找到解决办法可能会违反他们的条款。特别是,Youtube API条款f Service II.2,其中规定您不得干预API的正常工作。如果有意限制50个结果,则这是正常工作。您可以在任何社交网络API(如facebook)中找到这一点。这似乎是一个BUG!仅在最后一周左右请支持此问题的评论:查看TOS是一个no GO您不会使用API,而是一个常规HTTP访问,解析响应并模拟用户交互(类似于
    curl…GET。。。https://www.youtube.com/feed/history
    )。这可能是一种痛苦,但不是对API的滥用。可能是对普通用户TOS的滥用。明确反对YouTube服务条款。你没有错,但我怀疑他们是否在乎人们是否使用刮板来获取自己的手表历史记录。围绕该术语的大多数政策要点都专门针对恶意使用。因此可能确实违反了政策的文字,但没有违反政策的精神。理论上,“使用任何自动方式访问服务”如果您在访问网站时使用键盘宏,也会被违反。如果您是为公司客户工作的自由职业者,在违反任何人的服务条款之前,您应该三思而后行,因为您的保险公司可能会为您提供一次保险,但非常肯定没有人会在不支付巨额保险费的情况下为您提供两次保险。保险的最长期限为逗号分隔的视频ID列表是50;这个值是因为API(按设计)在提供给调用者的结果集中不会返回超过50个项。事实上,我同意你的评估:上面的解决方案是兼容的。
     function execute() {
        return gapi.client.youtube.videos.list({
          "part": [
            "contentDetails"
          ],
          "id": [
            "VIDEO IDs"
          ],
          "fields": "items(contentDetails(duration))"
        })