开发调用REST API的Alexa技能遇问题:Lambda依赖与代码报错排查
Alexa技能问题排查与解答
一、AWS账户相关疑问
- 是的,你需要AWS账户来配置Lambda函数。Alexa开发者控制台本身不内置Lambda服务,Lambda是AWS的无服务器计算服务,必须通过AWS控制台创建并关联到你的Alexa技能。你可以通过Alexa开发者控制台的「Endpoint」页面跳转到AWS Lambda控制台创建对应函数。
二、代码错误排查
你的代码存在多处问题,这是导致Alexa返回技能响应错误的核心原因:
1. 缺失关键类导入
类GetElectricityConsumptionIntentHandler继承自AbstractRequestHandler,但代码未导入该类,需添加:
from ask_sdk_core.dispatch_components import AbstractRequestHandler
2. 未初始化SkillBuilder实例
代码末尾引用了sb但未创建实例,需添加:
from ask_sdk_core.skill_builder import SkillBuilder sb = SkillBuilder()
3. 未注册Intent处理类
创建完意图处理类后,必须将其注册到SkillBuilder,否则技能无法识别该意图:
sb.add_request_handler(GetElectricityConsumptionIntentHandler())
4. lambda_handler定义不完整
最后一行lambda_handler = sb.la是无效代码,正确写法为:
lambda_handler = sb.lambda_handler()
5. 无异常处理逻辑
当前代码中API请求失败会直接抛出异常,导致Lambda返回错误。需添加异常捕获,返回友好提示:
def handle(self, handler_input): try: # 原有核心逻辑代码 ... except Exception as e: speak_output = "抱歉,暂时无法获取能耗数据,请稍后再试。" return ( handler_input.response_builder .speak(speak_output) .response )
6. 冗余依赖导入
代码导入了json和dateutil.parser但未使用,可移除以减小部署包体积。
修复后的完整代码
import logging import ask_sdk_core.utils as ask_utils import requests import pandas as pd from datetime import datetime, timedelta from ask_sdk_core.dispatch_components import AbstractRequestHandler from ask_sdk_core.skill_builder import SkillBuilder API_KEY = "BLABLABLABLA" BASE_URL = f'https://api.octopus.energy/v1/electricity-meter-points/09090909/meters/2139898/consumption/' class GetElectricityConsumptionIntentHandler(AbstractRequestHandler): def can_handle(self, handler_input): return ask_utils.is_intent_name("GetElectricityConsumptionIntent")(handler_input) def handle(self, handler_input): try: page_number = 1 page_size = 15000 more_data = True total_data = pd.DataFrame() end_date = datetime.utcnow() start_date = end_date - timedelta(days=7) end_date_str = end_date.strftime('%Y-%m-%dT%H:%M:%SZ') start_date_str = start_date.strftime('%Y-%m-%dT%H:%M:%SZ') while more_data: url = f"{BASE_URL}?page={page_number}&page_size={page_size}&period_from={start_date_str}&period_to={end_date_str}&order_by=period" response = requests.get(url, auth=(API_KEY, '')) if response.status_code != 200: raise Exception("Failed to fetch data from the API") re = response.json() results = re['results'] if not results: more_data = False break data = pd.DataFrame(results) data['date'] = pd.to_datetime(data['interval_start']) total_data = pd.concat([total_data, data]) page_number += 1 total_data['date'] = total_data['date'].dt.date daily_data = total_data.groupby('date')['consumption'].sum().reset_index() highest_daily_consumption = daily_data['consumption'].max() highest_daily_date = daily_data.loc[daily_data['consumption'].idxmax(), 'date'] speak_output = f"过去7天里,单日最高用电量是{highest_daily_consumption}千瓦时,日期是{highest_daily_date}。" return ( handler_input.response_builder .speak(speak_output) .response ) except Exception as e: speak_output = "抱歉,暂时无法获取能耗数据,请稍后再试。" return ( handler_input.response_builder .speak(speak_output) .response ) sb = SkillBuilder() sb.add_request_handler(GetElectricityConsumptionIntentHandler()) lambda_handler = sb.lambda_handler()
三、额外建议
- 部署Lambda时,需确保包含所有依赖包(如
pandas、requests),可通过创建部署包或Lambda层管理依赖。 - 在Alexa开发者控制台的「Test」页面查看详细错误日志,辅助定位问题。
内容的提问来源于stack exchange,提问作者Wasabi
相关产品推荐
相关产品推荐

