【问题标题】:How do I get a random YouTube video with the YouTube API?如何使用 YouTube API 获取随机的 YouTube 视频?
【发布时间】:2012-07-04 03:37:09
【问题描述】:

我需要一种获取完全随机 YouTube 视频的方法。没有限制。

如何使用 YouTube API?

** 编辑 * 按要求确定,这是我到目前为止所尝试的:

1 - 浏览了 youtube 开发网站上的 api 和示例。 http://www.youtube.com/dev/ 找不到正确的 api 或在那里找到正确的方法。

2 - 当然是谷歌搜索;)得到了http://randomyoutubevideo.net/,但他们只提供了一个来自 THEM 的 api,供我和 youtube 之间使用。

3 - 甚至查看了 youtube 应用程序库 http://youtube-gallery.appspot.com/ 看看是否有人这样做。以及如何。

我还会在 youtube 讨论页面上提问。也许那里的人可以提供帮助。

【问题讨论】:

    标签: c# .net youtube-api youtube.net-api


    【解决方案1】:

    第 1 步:创建 API-Key

    1. 创建一个谷歌帐户
    2. 访问:https://console.developers.google.com/
    3. 创建一个新项目:点击主菜单中的创建新项目并为其命名
    4. 现在激活 YoutTubeData API:单击并启用它。
    5. 插入您的应用程序信息
    6. 点击“创建凭据”
    7. 点击我需要什么?
    8. 记下您的 API 密钥

    现在您可以访问 YouTube-API。

    第 2 步:使用 YouTube-API 抓取视频

    在这一步中,我们使用 YouTube-API 来获取随机 VideoId。使用以下代码示例,您将从 YouTube 搜索中获得 50 个随机 API。那是最大值。您可以将它们存储在数据库中或直接返回随机 ID。

    注意:限制为 30,000 个单位/秒/用户和每天 1,000,000 个。

    代码示例


    [C#-示例]

    using System;
    using System.Linq;
    using System.Net;
    using Newtonsoft.Json;
    
    namespace YouTube
    {
       class Program
       {
        private static Random random = new Random();
    
        public static string RandomString(int length)
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray());
        }
    
        static void Main(string[] args)
        {
            var count = 50;
            var API_KEY = "YOUR KEY";
            var q = RandomString(3);
            var url = "https://www.googleapis.com/youtube/v3/search?key=" + API_KEY + "&maxResults="+count+"&part=snippet&type=video&q=" +q;
    
            using (WebClient wc = new WebClient())
            {
                var json = wc.DownloadString(url);
                dynamic jsonObject = JsonConvert.DeserializeObject(json);
                foreach (var line in jsonObject["items"])
                {
                    Console.WriteLine(line["id"]["videoId"]);
                    /*store your id*/
                }
                Console.Read();
            }
        }
    }
    }
    

    [PHP-示例]

    function crawlVideos($count = 50)
    {
        $q = $this->generateRandomString(3);
        $url = "https://www.googleapis.com/youtube/v3/search?key=" . self::API_KEY . "&maxResults=$count&part=snippet&type=video&q=" . $q;
        $JSON = file_get_contents($url);
        $JSON_Data_search = json_decode($JSON);
        foreach ($JSON_Data_search->{"items"} as $result) {
            $videoId = ($result->{"id"}->{"videoId"});
            /*Insert video to your database*/
        }
    }
    
    function generateRandomString($length = 10)
    {
        return substr(str_shuffle(str_repeat($x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length / strlen($x)))), 1, $length);
    }
    

    [Python-示例]

    import json
    import urllib.request
    import string
    import random
    
    count = 50
    API_KEY = 'your_key'
    random = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(3))
    
    urlData = "https://www.googleapis.com/youtube/v3/search?key={}&maxResults={}&part=snippet&type=video&q={}".format(API_KEY,count,random)
    webURL = urllib.request.urlopen(urlData)
    data = webURL.read()
    encoding = webURL.info().get_content_charset('utf-8')
    results = json.loads(data.decode(encoding))
    
    for data in results['items']:
        videoId = (data['id']['videoId'])
        print(videoId)
        #store your ids
    

    第 3 步:生成/返回您的视频网址

    现在从数据库中读取一个随机 ID,例如:

    SELECT 'id' 
    FROM yttable
    WHERE 1 ORDER BY RAND() LIMIT 1
    

    您的随机视频是:

    https://www.youtube.com/embed/[random ID]
    

    玩得开心!

    【讨论】:

      【解决方案2】:

      我知道这有点离题,但我可以提供以下 bash 脚本。我在我的 Raspberry Pi 上使用它,效果很好。

          #!/bin/sh
          while [ true ];
          do
          searchresult=""
          while [ -z "$searchresult" ]; do
          rand=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-5};echo)
          echo "$rand"
          searchresult=$(googler -C -n 100 --np -x -w https://www.youtube.com "$rand")
          done
          urls=$(echo "$searchresult" | grep -o "https://www.youtube.com/watch?v=...........")
          url=$(shuf -e -n 1 $urls)
          echo "$url"
          omxplayer -o hdmi $(youtube-dl -f mp4 -g "$url")
          done
      

      前提条件是您已经安装了googleryoutube-dl。 我最初的想法是生成随机的 11 个字符串并将它们附加到 YouTube 视频的基本 URL。然而,可能的排列数量是巨大的(26 个大写字母 + 26 个小写字母 + 10 个数字 + 连字符 + 下划线 = 64 个字符;64^11=7.38x10^19 个排列),如果地球上每个人都上传,就会用完100 亿个视频。这就是为什么随机生成完整的 11 个字符的标识符不是一种可行的方法。我的脚本改为生成随机的 5 个字符的字符串(变量“rand”)并将它们作为搜索查询传递给 googler。 Googler 在 YouTube 网站上搜索这些随机字符串,在大多数情况下它会返回结果(变量“searchresult”)。如果没有结果,则使用另一个随机字符串重复搜索,依此类推,直到成功。通常需要一到三次尝试。我尝试了不同长度的搜索字符串 - 4 可能不够唯一,6 太长,可能需要多次尝试才能获得结果,我观察到如果脚本在短时间内发送超过 10 个搜索请求, Google 暂时阻止我进一步搜索。

      在下一步中,脚本会从搜索结果中提取指向 YouTube 视频的超链接,并将它们放入变量“urls”中。然后随机选择其中一个播放(变量“url”)并传递给播放器 - 在我的例子中是 omxplayer,但你可以用你想要的任何播放器替换它。 Omxplayer 在 Raspberry Pi 上很不错,因为它使用硬件加速并通过 hdmi 直接输出到我的电视机。如果我将“-o hdmi”更改为“-o local”,音频将通过 3.5 毫米立体声插孔发送到外部放大器。在播放过程中按“q”会停止播放当前视频,并自动开始下一个随机视频。它将永远持续下去,直到您按 Ctrl-C 停止脚本。

      其他提示

      通过一些修改,您可以获得关于给定主题的随机视频。例如,如果我们将“Deep Purple”作为附加搜索词,我们将获得 Deep Purple 的随机音乐视频:

          #!/bin/sh
          while [ true ];
          do
          searchresult=""
          while [ -z "$searchresult" ]; do
          rand=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-2};echo)
          echo "$rand"
          searchresult=$(googler -C -n 10 --np -x -w https://www.youtube.com "$rand" "Deep Purple")
          done
          urls=$(echo "$searchresult" | grep -o "https://www.youtube.com/watch?v=...........")
          url=$(shuf -e -n 1 $urls)
          echo "$url"
          omxplayer -o hdmi $(youtube-dl -f mp4 -g "$url")
          done
      

      请注意,在最后一个示例中,我已将随机因子降低为 2 个字符的字符串,因为在包含搜索词的所有 YouTube 视频的相对较小的子集中很难找到 5 个字符的字符串的匹配项“深紫色”。同样在这里,我将 googler 返回的搜索结果的数量限制为 10,以保持它们的相关性。如果是 100,我也会得到相关性较低的结果,例如业余爱好者尝试播放 Deep Purple 歌曲的视频。

      下一个脚本将随机播放仅在过去 12 小时内上传的新视频

          #!/bin/sh
          while [ true ];
          do
          searchresult=$(googler -C -n 100 --np -t h12 -x -w https://www.youtube.com "")
          urls=$(echo "$searchresult" | grep -o "https://www.youtube.com/watch?v=...........")
          url=$(shuf -e -n 1 $urls)
          echo "$url"
          omxplayer -o hdmi $(youtube-dl -f mp4 -g "$url")
          done
      

      您可以设置不同的时间限制。有关详细信息,请参阅 googler 的文档。

      【讨论】:

        【解决方案3】:

        似乎没有办法做到这一点,但是有一些方法可以近似您正在寻找的内容。有关想法,请参阅 here

        这些页面的基本想法是使用最新的上传提要(如果您不关心什么时候上传的),或者只是获取所有 youtube 视频的转储并从中随机选择一个 URL。

        在第一个链接中引用 youtube API 的人:

        正如其他人所提到的,我们会进行任何数据转储等 可用的。您与 YouTube 的所有互动都需要通过 标准 API。

        我不能说我有足够的统计学背景 建议您如何检索真正随机的视频样本。我愿意 认为通过尝试生成 11 个字符来实现它 不过,YouTube 视频 ID 可能是错误的方法——有 您会遇到太多不存在的视频ID,并且 我不认为 API 的最佳用途是发出将 X% 的时间返回 HTTP 404 响应。

        使用 API 搜索单词或 在“随机”中挑选的短语并对其进行抽样 结果。如果你这样做,你应该考虑使用什么值 orderby= URL 参数。默认排序是“相关性”,即 将导致最好的结果是我们的算法认为的结果 与您的搜索词最相关。这可能会扭曲您的 如果你总是抓住第一个条目或类似的结果。你也可以 按“已发布”排序,这将为您提供按时间顺序排列的提要 视频。

        干杯, -Jeff Posnick,YouTube API 团队 作为 关于 randomyoutubevideo.net,该网站的“关于”页面是这样说的:

        那么,我们如何才能提供真正随机的 YouTube 视频链接?事实证明 YouTube 编程接口 (API) 提供了额外的 允许发现更多视频的功能 随机的。使用一些技巧,结合一点操作 在时空结构中,我们设法创建了一个过程, 生成真正随机的 YouTube 视频链接。

        此页面上的随机 YouTube 功能目前使用 数据库。随着时间的推移,我们将扩展这个数据库,并根据 需求,可以通过 API 免费提供。

        我理解这意味着他们一直在从 API 中提取大量视频列表,并从中随机选择这些视频的数据库。

        【讨论】:

        • @b0x0rz 除了在您自己的数据库中构建完整的视频列表之外,这似乎是访问视频的最“随机”方式。
        【解决方案4】:

        脏爬虫是一种选择吗? 因为我使用了一个简单的随机 youtube vid 链接生成器。这只是为了积累大量的视频数据库,而不是为了生产。
        它似乎(非常)类似于他描述的“youtuberandomvideo.com”方法。

        import re, urllib
        from random import randint
        
        def random_str(str_size):
            res = ""
            for i in xrange(str_size):
                x = randint(0,25)
                c = chr(ord('a')+x)
                res += c
            return res
        
        def find_watch(text,pos):
            start = text.find("watch?v=",pos)
            if (start<0):
                return None,None
            end = text.find(" ",start)
            if (end<0):
                return None,None
        
            if (end-start > 200): #silly heuristics, probably not a must
                return None,None
        
            return text[start:end-1], start
        
        
        def find_instance_links():
            base_url = 'https://www.youtube.com/results?search_query='
            url = base_url+random_str(3)
            #print url
        
            r = urllib.urlopen(url).read()
        
            links = {}
        
            pos = 0
            while True:
                link,pos =  find_watch(r,pos)
                if link == None or pos == None:
                    break
                pos += 1
                #print link
                if (";" in link):
                    continue
                links[link] = 1
        
            items_list = links.items()
        
            list_size = len(items_list)
            selected = randint(list_size/2,list_size-1)
            return items_list[selected][0]
        
        
        for i in xrange(1000):
            link = find_instance_links()
            print link
        

        如您所见,它相当简单,可能很容易崩溃,但 IIRC 我设法快速获得了数千个随机视频链接,这正是我所需要的,而且只需要几行代码......

        代码的一些解释:(random->pseudo random ...)
        1. 随机生成搜索查询(此处为 3 个字母)
        2.从视频链接的下半部分随机选择一些链接(动机是避免广告)

        注意:代码很混乱 - 它应该仅作为该技术的基本示例,而不是正确的代码设计和/或优雅的 Python 代码。

        【讨论】:

        • 对我来说效果很好,但我建议在代码中添加一个随机的“暂停”,以避免由于速率限制而被 Google 暂时禁止。在 OP 代码的最后一个 for 循环中添加这一行:sleep(randint(7,20))。它会在 7 到 20 秒之间随机暂停,这似乎是在被 Google 暂时禁止与花费不合理的时间来获取数据之间进行权衡的正确时间。
        【解决方案5】:

        获取随机视频 ID 的最佳方法是生成您自己的数据库。使用 Google 的 Youtube-API 的 VideoSearch-Request。只需生成一个像“v=SEARCH_STRING”这样的搜索查询,然后将您获得的视频 ID 插入到您的数据库中。搜索字符串应该是随机生成的字符串。 我发现,字符串的长度应该是 4 个字符,这样才能从请求中取出大多数视频,而不必有很多重复的结果。

        如果您的数据库已准备就绪,您可以从中获取随机行。

        我自己完成了这项工作 Website(random-video.net) 并在几个小时内获得了超过 200 万个条目。没有真正的限制——只有数据库的大小。

        【讨论】:

        • random-video.net 似乎已过期并已被虚假搜索页面劫持。
        【解决方案6】:

        AFAIK:搜索v= 没有任何意义。你搜索v=LadyGaga,你会找到Lady Gaga 的视频。 YouTube 的搜索算法会查看描述、标题等 - 如果视频在其描述中链接了另一个视频(又名 ?v=..),则更有可能提出此搜索请求。另见https://developers.google.com/youtube/v3/docs/search/list

        Google 的 Youtube 数据 API 中尚未实现随机选择。我所做的是查询

        https://www.googleapis.com/youtube/v3/search?part=id&maxResults=50&type=video&q=QUERYSTRING&key=KEY
        

        QUERYSTRING 是视频 ID 语法中的随机 5 个字符的字符串。如果结果集包含 1 到 50 个视频,其中至少一个 id 包含字符串,则找到一个随机视频。此方法通常需要 1-5 次尝试。

        需要最后一次检查。示例:随机字符串是ydoat。使用上面的 url 进行查询会导致只有一个 id 为 VEBt0Hxp5Q8 的视频不适合。该视频可能在某处的描述中包含该字符串。如果我通过https://www.youtube.com/results?q=ydoat 搜索ydoat,则找不到任何结果。搜索v%3Dydoat (v=ydoat) 会得到相同的结果。

        编辑。 php源码:https://github.com/phil294/-Php-Randomtube-random-YouTube-video-generator-

        和 Anton 一样,我发现 4 个随机字符最合适。

        【讨论】:

          【解决方案7】:

          获取包含数百或数千个单词的单词列表。然后从中随机选择2个词作为查询。如果您想对随机性进行一定的控制,这也很有用。例如,您可以有一个英语单词列表,或一个德语单词列表。或者有一个较小的精选列表,其中包含仅与您感兴趣的主题相关的字词。

          【讨论】:

            【解决方案8】:

            此时您可以通过此 URL 获取随机 YouTube 视频:

            https://www.googleapis.com/youtube/v3/search?part=snippet

            并使用多个参数。你可以找到它here。 但是有一个限制:每天 10 000 个请求。

            您可以在这个Random YouTube Video 站点中查看它的工作原理。

            【讨论】:

              【解决方案9】:

              这就是我解决需要随机视频的问题的方法,但它每 30 分钟一次

              x = 30
              queries = ['to catch a predator', 'tcap', 'hansen vs predators']
              @tasks.loop(minutes=x)
              async def ytsend():
                query = random.choice(queries)
                channel = bot.get_channel(902955554819956807)
                query_string = urllib.parse.urlencode(
                          {'search_query': ' '.join(query)})
                htm_content = urllib.request.urlopen(
                          'http://www.youtube.com/results?' + query_string)
                search_results = re.findall(r'/watch\?v=(.{11})',
                                                  htm_content.read().decode())
                messageyt = await channel.send(
                          f'Suggested Video:\nhttp://www.youtube.com/watch?v={search_results[random.randint(0,len(search_results)-1)]}'
                      )
                await asyncio.sleep(1750) # wait 5 sekundes 
                await messageyt.delete() # deletes the message
              
              @ytsend.before_loop
              async def ytbefore():
                  await bot.wait_until_ready()
              
              ytsend.start()
              

              不确定它是否会帮助你,但它可能会帮助某人,你可以做一个“for/while”循环而不是我放置它的任务来获取基于查询的随机链接

              【讨论】:

                猜你喜欢
                • 2020-12-03
                • 2017-11-21
                • 2013-04-23
                • 2012-09-18
                • 2017-10-14
                • 2018-10-19
                • 2015-10-12
                • 2018-06-28
                • 2012-12-20
                相关资源
                最近更新 更多