当前位置: 首页 > 知识库问答 >
问题:

使用Javascript从关键字搜索返回Youtube视频URL

苏凯
2023-03-14

好的,我正在为我的服务器制作一个不协调的机器人,我想实现的是一个youtube命令
我一直在搜索Youtube API,我能找到的只是他们对类似浏览器的搜索

我用nodejs在我的笔记本电脑上运行它,而我的机器人运行的是discord。js
我有一个类似的命令,可以执行MAL和Urban字典搜索,但我什么也没找到,也不知道如何在youtube上执行同样的操作

我曾经有一个蟒蛇机器人的命令,它能够实现这一点,我见过其他不和谐机器人也能做到这一点,所以我知道这显然是可能的

基本上,我想说的是,我需要能够从一系列搜索词中搜索并返回youtube视频URL(第一个搜索结果),这样使用情况看起来就像

>>youtube Tunak Tunak Tun

将返回https://www.youtube.com/watch?v=vTIIMJ9tUc8,这是该关键字的第一个搜索结果

编辑:
我已经找到了可以做到这一点的python命令,但是几乎没有技巧也没有信心尝试将其翻译成JavaScript

elif prefix and cmd=="youtube" and len(args) > 0:
        try:
            yword=args.replace(" ","_")
            ydata= urlreq.urlopen("http://gdata.youtube.com/feeds/api/videos?vq="+yword+"&racy=include&orderby=relevance&max-results=1")
            yread= str(ydata.read())
            if "<openSearch:totalResults>0</openSearch:totalResults>" in yread:
                room.message("I got nothin' for ya by the name of "+args)
            else:
                trash , yclean=yread.split("<media:player url='http://www.youtube.com/watch?v=",1)
                yclean , trash=yclean.split("&amp;",1)
                room.message("http://http://www.youtube.com/watch?v="+yclean,True)
        except:
            room.message("Somethin ain't right")

编辑2(为长度道歉):好吧!我发现了一些让我更接近的东西!https://www.npmjs.com/package/youtube-search
我现在在机器人中有一个命令,它是这样的:

if (commandIs("yt" , message)){
  search(args.join(' ').substring(4), opts, function(err, results) {
    if(err) return console.log(err);
  message.channel.sendMessage(results);
  console.log(results);
  });
}

所以现在当我输入

[ { id: 'vTIIMJ9tUc8',
link: 'https://www.youtube.com/watch?v=vTIIMJ9tUc8',
kind: 'youtube#video',
publishedAt: '2014-03-21T07:00:01.000Z',
channelId: 'UC3MLnJtqc_phABBriLRhtgQ',
channelTitle: 'SonyMusicIndiaVEVO',
title: 'Daler Mehndi - Tunak Tunak Tun Video',
description: 'Presenting \'Tunak Tunak Tun\' music video sung by the talented Daler Mehndi Song Name - Tunak Tunak Tun Album - Tunak Tunak Tun Singer - Daler Mehndi ...',
thumbnails: { default: [Object], medium: [Object], high: [Object] } } ]

在控制台和discord频道中的[object object]。http://i.imgur.com/Vorpn0f.png

所以现在的问题是我可以拿到链接,但我不能让它返回链接,我不知道如何把它从混乱中拉出来。


共有2个答案

阙弘博
2023-03-14

好的,这是另一种对我有效的方法,使用GoogleJavaScriptAPI。同样,SO代码段没有运行它,因此我将把您链接到小提琴。

此方法要求您设置google API密钥,然后启用youtube API访问。

我已经从fiddle中删除了我的google API密钥,所以您需要进行设置。我可以PM你我的,如果你想先测试的话。

var apiKey = null //put your API key here

function search() {
	var searchTerm = $('#txtSearch').val()
 
  gapi.client.init({
    'apiKey': apiKey, 
    'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest']
  }).then(function() {
    return gapi.client.youtube.search.list({
      q: searchTerm,
      part: 'snippet'
    });
  }).then(function(response) {
  	var searchResult = response.result;
    $('#search-results').append(JSON.stringify(searchResult, null, 4))
  	console.log(searchResult.items[0])
    var firstVideo = searchResult.items[0]
    firstVideo.url = `https://youtube.com/watch?v=${firstVideo.id.videoId}`
    $('#first-video').text(firstVideo.url).attr('href', firstVideo.url)
    $('#first-video-title').text(firstVideo.snippet.title)
    $('#first-video-description').text(firstVideo.snippet.description)
  });

}


$('#btnSearch').on('click', function() {
  	$('#first-video-title').text("")
    if (!apiKey) {
      $('#first-video-title').text("You need to set an apiKey!")
      return;
    }
  	gapi.load('client', search)
  });
#search-results { white-space: pre; font-family: monospace; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src='https://apis.google.com/js/api.js'></script>

<div id="container">
  <input id="txtSearch" type="text" />
  <button id="btnSearch">
    Search!
  </button>
  <br />
  <p id='first-video-title'> </p>
  <p id='first-video-description'></p>
  <a target="_blank" id="first-video"></a>
  <div id='search-results'>
  
  </div>
</div>
芮建茗
2023-03-14

听起来您的结果对象是一个JSON字符串。这本质上意味着它是javascript对象的字符串表示。您可以使用JSON将其解析为一个对象。parse()

var objResults = JSON.parse(results);
console.log(objResults);
console.log(objResults.link);

编辑

未能注意到结果实际上是一个数组。您只需要像这样访问它:console.log(结果[0]. link)。不应该需要JSON. parse()

 类似资料:
  • 我想搜索视频列表并用频道图标将其显示在屏幕上,但我不知道如何在搜索查询中获得频道id或频道图标直接链接。 我正在关注youtube的开发人员页面(Java)中的一个例子,我希望搜索结果包含channel_id或channel_icon,该怎么办? [已解决] 我已经解决了我的问题,我编辑了我的字段过滤器,完整代码: 我有 channelId,我可以得到 channel icon,只需将 url 替

  • 对,这似乎记录得不好,或者我在留档里看不到。我基本上不想要相关的视频()使用JavaScript API。 这就是我所拥有的。 我也尝试过: 没有运气。是否有人知道可以添加的选项(尝试了,但运气不佳)

  • 非常新的初学者。我目前正在做一个项目,用户可以输入一个搜索词,并使用YouTube数据API v3获得一个视频ID。然后这个视频ID被用来组装一个URL,我用它把视频下载到我的电脑上。这是我用来做这件事的。(忽略我已经导入的库,我稍后会清理它们) 因此,对于“Youtube Rewind 2018”的搜索查询,Youtube API将返回以下内容: {'kind': 'youtube#search

  • 我在使用YouTube API v3时不断收到无效的SearchFilter错误。我有以下参数: 我正在使用API游乐场,并注意到如果我进行OAuth调用,它会工作,但仅使用API密钥(在没有OAuth的情况下执行),它会失败。同样的事情发生在我的代码中。基本的列表调用在两者中都有效,所以我怀疑他们的API中存在错误,或者我错过了一些东西。 其他人可以确认这一点,看看我是否错过了什么? 如果我去掉

  • 这样地:http://gdata.youtube.com/feeds/api/videos?alt=rss 我可以同时搜索作者和关键词, 但是我在v3版本中找不到它 https://www.googleapis.com/youtube/v3/search?part=snippet

  • 搜索视频 通过该接口可以搜索指定信息的视频,地址为http://spark.bokecc.com/api/videos/search 需要传递以下参数: 参数 说明 userid 用户id,不可为空 q 查询条件,不可为空 格式:查询字段:查询内容 查询字段:目前只支持TITLE 查询内容:查询关键字 注:格式中的”:”为英文半角 Example:q=TITLE:test sort 查询结果排序,