17

我需要一种获取完全随机的 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 讨论页面上提问。也许那里的人可以提供帮助。

4

9 回答 9

18

第 1 步:创建 API 密钥

  1. 创建一个谷歌帐户
  2. 访问:https ://console.developers.google.com/
  3. 创建一个新项目:在 head-menu 中单击 Create new Project 并为其命名
  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 步:生成/返回您的视频 URL

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

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

您的随机视频是:

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

玩得开心!

于 2017-03-09T16:58:14.017 回答
6

我知道这有点离题,但我可以提供以下 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 个搜索请求,谷歌暂时阻止我进一步搜索。

在下一步中,脚本从搜索结果中提取指向 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 的文档。

于 2017-10-18T23:16:32.157 回答
4

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

这些页面的基本想法是使用最新的上传提要(如果您不关心上传内容的时间),或者只是获取所有 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 中提取大量视频列表,并从中随机选择它们的数据库。

于 2012-07-03T17:39:26.307 回答
3

肮脏的爬虫是一种选择吗?因为我使用了一个简单的随机 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 代码。

于 2015-06-21T14:36:43.720 回答
2

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

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

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

于 2013-10-25T22:14:19.793 回答
2

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

Google 的 Youtube Data 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不适合。该视频可能在某处的描述中包含该字符串。如果我搜索ydoatvia https://www.youtube.com/results?q=ydoat,则找不到任何结果。搜索v%3Dydoat( v=ydoat) 会导致相同的结果。

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

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

于 2016-10-15T16:47:10.067 回答
0

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

于 2018-08-13T02:13:32.210 回答
0

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

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

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

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

于 2019-01-19T20:27:28.757 回答
0

这就是我解决需要随机视频的问题的方法,但它每 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”循环而不是我放置它的任务来获取基于查询的随机链接

于 2021-11-08T01:31:18.850 回答