如何解决亚马逊 Alexa“AskSdk.RequestEnvelopeUtils 错误:期望请求类型为 IntentRequest 但得到 SessionEndedRequest”
我正在尝试播放最终用户可以在我的网站上提供的广播电台。
这是应该发生的:
用户:打开 i。页。无线电
回声:欢迎收听 IP 广播。你可以让我播放你最喜欢的电台,或者你可以说帮助。
用户:播放普通电台
回声:好的,播放 123.4:通用电台(然后播放电台)
但这就是发生的事情。
用户:打开 i。页。无线电
回声:欢迎收听 IP 广播。你可以让我播放你最喜欢的电台,或者你可以说帮助。
用户:播放普通电台
回声:请求技能的响应有问题。
然后这会记录在控制台中:
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 设备上所有正在运行的流并播放该流。
祝大家有个美好的一天!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。