Amazon Alexa "AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest."
Amazon Alexa "AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest."
我正在尝试播放最终用户可以在我的网站上提供的广播电台。
这是应该发生的事情:
用户: 打开 i. p.收音机
Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。
用户:播放通用电台
Echo: 好的,正在播放 123.4: Generic Radio Station(然后播放该电台)
但事实就是这样。
用户: 打开 i. p.收音机
Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。
用户:播放通用电台
Echo:请求的技能响应有问题。
然后将其记录在控制台中:
2021-04-24T22:31:10.222Z INFO ~~~~ Error handled string: AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest.
电台在8443端口。
这是运行的代码:
const PlayStationIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'PlayRadio';
},
async handle(handlerInput) {
function reallyHandle() {
return new Promise(async (res, rej) => {
let response = await axios.get("https://msbc.one/api/stations", {headers: {"Authorization": "Bearer " + handlerInput.requestEnvelope.context.System.user.accessToken}})
if (response.data.length === 0) {
const speakOutput = "You have no stations added! You can add stations at, m s b c dot one. Login, and follow the instructions."
res(handlerInput.responseBuilder
.speak(speakOutput)
.getResponse());
} else {
let station_url;
let station_title;
for (let i = 0; i < response.data.length; i++) {
console.log("~~~~ over here! " + response.data[i].command + "\n\n" + handlerInput.requestEnvelope.request.intent.slots.station.value)
if (response.data[i].command === handlerInput.requestEnvelope.request.intent.slots.station.value) {
station_url = response.data[i].url
station_title = response.data[i].title
}
}
if (!station_url) {
const speakOutput = "That station does not exist, please try again."
res(handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse());
} else {
const speakOutput = "OK, playing " + station_title + "."
const builder = handlerInput.responseBuilder
builder.speak(speakOutput)
builder.addDirective({
type: "AudioPlayer.Play",
playBehavior: "ENQUEUE",
audioItem: {
stream: {
url: station_url,
token: handlerInput.requestEnvelope.request.intent.slots.station.value,
offsetInMilliseconds: 0,
}
},
metadata: {
title: station_title,
subtitle: "IP Radio",
}
})
res(builder.getResponse())
}
}
})
}
if (!handlerInput.requestEnvelope.context.System.user.accessToken) {
const speakOutput = "Welcome to IP radio. To use the full features of this skill, please link your account. I've sent a card to your Alexa app with more instructions."
return handlerInput.responseBuilder
.speak(speakOutput)
.withLinkAccountCard()
.getResponse();
} else {
let okDoThis = await reallyHandle()
return okDoThis;
}
}
};
谢谢你,祝你有愉快的一天。
编辑: 我已经完成并尝试删除 speakOutput,但仍然无法正常工作。还有其他想法吗?
我解决了我的问题,因为我使用了 playBehavior ENQUEUE
而不是 REPLACE_ALL
,因为 ENQUEUE
需要一个令牌,因为如果它与之前的令牌不匹配,它就不会工作。 REPLACE_ALL
删除 Echo 设备上的所有 运行 流并播放该流。
祝大家有个愉快的一天!
我正在尝试播放最终用户可以在我的网站上提供的广播电台。
这是应该发生的事情:
用户: 打开 i. p.收音机
Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。
用户:播放通用电台
Echo: 好的,正在播放 123.4: Generic Radio Station(然后播放该电台)
但事实就是这样。
用户: 打开 i. p.收音机
Echo: 欢迎使用 IP 广播。你可以让我播放你喜欢的电台,或者你可以说帮助。
用户:播放通用电台
Echo:请求的技能响应有问题。
然后将其记录在控制台中:
2021-04-24T22:31:10.222Z INFO ~~~~ Error handled string: AskSdk.RequestEnvelopeUtils Error: Expecting request type of IntentRequest but got SessionEndedRequest.
电台在8443端口。
这是运行的代码:
const PlayStationIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'PlayRadio';
},
async handle(handlerInput) {
function reallyHandle() {
return new Promise(async (res, rej) => {
let response = await axios.get("https://msbc.one/api/stations", {headers: {"Authorization": "Bearer " + handlerInput.requestEnvelope.context.System.user.accessToken}})
if (response.data.length === 0) {
const speakOutput = "You have no stations added! You can add stations at, m s b c dot one. Login, and follow the instructions."
res(handlerInput.responseBuilder
.speak(speakOutput)
.getResponse());
} else {
let station_url;
let station_title;
for (let i = 0; i < response.data.length; i++) {
console.log("~~~~ over here! " + response.data[i].command + "\n\n" + handlerInput.requestEnvelope.request.intent.slots.station.value)
if (response.data[i].command === handlerInput.requestEnvelope.request.intent.slots.station.value) {
station_url = response.data[i].url
station_title = response.data[i].title
}
}
if (!station_url) {
const speakOutput = "That station does not exist, please try again."
res(handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse());
} else {
const speakOutput = "OK, playing " + station_title + "."
const builder = handlerInput.responseBuilder
builder.speak(speakOutput)
builder.addDirective({
type: "AudioPlayer.Play",
playBehavior: "ENQUEUE",
audioItem: {
stream: {
url: station_url,
token: handlerInput.requestEnvelope.request.intent.slots.station.value,
offsetInMilliseconds: 0,
}
},
metadata: {
title: station_title,
subtitle: "IP Radio",
}
})
res(builder.getResponse())
}
}
})
}
if (!handlerInput.requestEnvelope.context.System.user.accessToken) {
const speakOutput = "Welcome to IP radio. To use the full features of this skill, please link your account. I've sent a card to your Alexa app with more instructions."
return handlerInput.responseBuilder
.speak(speakOutput)
.withLinkAccountCard()
.getResponse();
} else {
let okDoThis = await reallyHandle()
return okDoThis;
}
}
};
谢谢你,祝你有愉快的一天。
编辑: 我已经完成并尝试删除 speakOutput,但仍然无法正常工作。还有其他想法吗?
我解决了我的问题,因为我使用了 playBehavior ENQUEUE
而不是 REPLACE_ALL
,因为 ENQUEUE
需要一个令牌,因为如果它与之前的令牌不匹配,它就不会工作。 REPLACE_ALL
删除 Echo 设备上的所有 运行 流并播放该流。
祝大家有个愉快的一天!