.net 如何使用YouTube API获取随机YouTube视频?

h4cxqtbf  于 2022-12-30  发布在  .NET
关注(0)|答案(9)|浏览(303)

我需要一个完全随机的YouTube视频。没有限制。
如何使用YouTube API?

**编辑 * 按要求确定以下是我目前尝试的:

1 -浏览了YouTube开发站点上的API和示例。X1 E0 F1 X没有找到正确的API或在那里做的方法。
2 -当然是谷歌搜索;)得到了http://randomyoutubevideo.net/,但他们只提供了一个API,从他们使用之间的我和youtube。〈这给了我希望,它实际上是可能做到这一点。
3 -甚至查看了YouTube应用程序库http://youtube-gallery.appspot.com/,看看是否有人在做。以及如何做。
我也会在YouTube的讨论页面上问一下,也许那里有人能帮上忙。

hmtdttj4

hmtdttj41#

步骤1:创建API密钥

1.创建一个Google帐户
1.访视:https://console.developers.google.com/
1.创建新项目:点击创建新项目在头菜单,并给予它一个名称
1.现在激活YouTube数据API:单击它并启用它。
1.插入您的应用程序信息
1.单击“创建凭据”
1.点击我需要什么?
1.记下您的API密钥
现在您可以访问YouTube-API。

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

在这一步中,我们使用YouTube-API来获取随机视频ID。使用下面的代码示例,您将从YouTube-Search中获取50个随机视频。这是最大值。您可以将它们存储在数据库中或直接返回一个随机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

Step 3:生成/返回您的视频URL

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

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

您的随机视频是:

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

好好玩!

mzmfm0qo

mzmfm0qo2#

我知道这有点离题,但我可以提供下面的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"),并将它们作为搜索查询传递给谷歌。谷歌搜索YouTube网站寻找这些随机字符串,在大多数情况下,它会返回结果(变量"searchresult")。如果没有结果,用另一个随机字符串重复搜索直到成功。2通常需要一到三次尝试。我尝试了不同长度的搜索字符串-4可能不够唯一,6太长,可能需要很多尝试才能得到结果,我观察到,如果脚本在短时间内发送超过10个搜索请求,谷歌暂时阻止我进一步搜索。
下一步,脚本从搜索结果中提取YouTube视频的超链接,并将它们放入变量"urls"中,然后随机选择其中一个进行播放(变量"url")并传递给播放器-在我的情况下是omxplayer,但你可以用任何你想要的球员替换它。Omxplayer在树莓派上很不错,因为它使用硬件加速,并通过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个字符的字符串的匹配。同样,在这里,我将Google返回的搜索结果的数量限制为10,以保持它们的相关性。有了100,我也会得到不太相关的结果,如业余爱好者试图播放深紫色歌曲的视频。
下一个脚本将随机播放仅最近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文档。

svgewumm

svgewumm3#

似乎没有办法做到这一点,但有办法近似你所寻找的。见这里的想法。
这些页面的基本思想是使用最新的上传提要(如果你不关心什么时候上传的话),或者简单地获得所有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中提取了大量的视频列表,并制作了一个数据库,从中随机选择。

xxe27gdn

xxe27gdn4#

肮脏的爬虫是一个选项吗?因为我使用了一个简单的随机youtube视频链接生成器。它只是为了积累大量的视频数据库,而不是为了制作。
It seems to be (very) similar to "youtuberandomvideo.com" approach as he described.

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我设法迅速获得成千上万的随机视频链接,这是所有我需要的,它只有几行代码...
代码的一些解释:(随机-〉伪随机...)
1.随机生成检索查询(此处为3个字母)
2.从视频链接的下半部分随机选择一些链接(动机是为了避免商业广告)
注意:代码很混乱--它应该只作为技术的一个基本示例,而不是正确的代码设计和/或优雅的Python代码。

t1qtbnec

t1qtbnec5#

获取随机视频ID的最好方法是生成自己的数据库。使用谷歌Youtube API的VideoSearch-Request。只需生成一个类似“v=SEARCH_STRING”的搜索查询,并将您获得的视频ID插入到您的数据库中。搜索字符串应该是一个随机生成的字符串。我发现,字符串的长度应该是4个字符,以获得大多数视频的请求,而不必有许多重复的结果。
如果你的数据库已经准备好了,你可以从它里面得到一个随机的行。
我已经在我自己的Website(random-video.net)上做了这个,在几个小时内得到了超过200万个条目。没有真实的的限制--只是你的数据库大小。

kse8i1jr

kse8i1jr6#

AFAIK:搜索v=没有任何意义。如果你搜索v=LadyGaga,你会找到LadyGaga的视频。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是video-ID语法中的随机5字符串。如果结果集包含1到50个视频,且其中至少一个ID包含该字符串,则发现随机视频。此方法通常需要尝试1-5次。
需要最后一次检查。示例:一个随机字符串是ydoat。用上面的url查询它只会得到一个id为VEBt0Hxp5Q8的视频,这不合适。该视频可能在其描述中的某个地方包含该字符串。如果我通过https://www.youtube.com/results?q=ydoat搜索ydoat,没有找到任何结果。搜索v%3Dydoatv=ydoat)会得到相同的结果。
源代码:https://github.com/phil294/-Php-Randomtube-random-YouTube-video-generator-
像安东,我发现4个随机字符将是最合适的。

du7egjpx

du7egjpx7#

得到一个单词列表,有几百个或几千个单词。然后从中随机选择两个单词并将其用作查询。如果你想对它的随机程度有一定的控制,这也会很有用。例如,你可以有一个英语单词列表,或者德语单词列表。或者有一个较小的精选列表,只包含与你感兴趣的主题相关的单词。

2j4z5cfb

2j4z5cfb8#

此时,您可以通过此URL获取随机YouTube视频:
https://www.googleapis.com/youtube/v3/search?part=snippet
并且使用多个参数。你可以在这里找到它。但是有一个限制:每天10 000个请求。
你可以在这个Random YouTube Video站点查看它是如何工作的。

llew8vvj

llew8vvj9#

这就是我如何解决我的问题,需要一个随机视频,但它的每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”循环,而不是任务,我把它放在获得随机链接的基础上查询

相关问题