好吧,所以我在我的服务器上使用Discord制作机器人,我想要实现的是一个youtube命令。
我一直在搜索并查看Youtube API,我只能找到他们搜索的浏览器
我正在使用nodejs从我的笔记本电脑上运行它,我的机器人运行了discord.js我有一个类似的命令执行MAL和Urban Dictionary搜索,但我什么都没发现并且不知道如何用youtube做同样的事情
我曾经有一个python机器人的命令能够达到这个目的,而且我已经看到其他Discord机器人也能够做到这一点,所以我知道它显然是可能的
基本上我所说的是我需要能够从一串搜索字词中搜索并返回youtube视频网址(第一个搜索结果),以便用法看起来像
>>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("&",1)
room.message("http://http://www.youtube.com/watch?v="+yclean,True)
except:
room.message("Somethin ain't right")
EDIT2(长篇道歉):好吧!我找到了让我更接近的东西! 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);
});
}
所以现在当我进入>>yt Tunak Tunak Tun
时,我得到了
[ { 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] } } ]
控制台中的和不和谐频道中的[object Object]
。
http://i.imgur.com/Vorpn0f.png
所以现在的问题是我的链接在我的范围内,但是我无法让它返回 JUST 链接,我不知道如何将它从混乱中拉出来。
答案 0 :(得分:1)
听起来您的结果对象是JSON
字符串。这实质上意味着它是javascript对象的字符串表示。您可以使用JSON.parse()
将其解析为对象。
var objResults = JSON.parse(results);
console.log(objResults);
console.log(objResults.link);
修改强>
无法注意到您的结果实际上是一个数组。您只需要像这样访问它:console.log(results[0].link)
。不应该JSON.parse()
答案 1 :(得分:0)
好的,这是另一种适用于我的方法,使用google javascript API。再一次,SO片段不会运行它,所以I'll link you to the fiddle.
此方法要求您setup a google API key,然后enable youtube API access.
我已从小提琴中删除了我的Google API密钥,因此您需要进行设置。如果你想先测试一下,我可以告诉你。
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>