求助:无需Lambda,基于Python构建连接内部数据库的Alexa技能后端Web服务
嗨,我之前刚好搭建过跳过Lambda的Alexa技能后端,用Flask和Bottle都试过,给你整理了一套快速上手的流程,应该能帮到你:
一、核心逻辑说明
Alexa技能的本质是请求-响应交互:Alexa会将用户的语音请求转换成标准JSON格式,通过POST请求发送到你的公网端点;你的Web服务需要解析这个请求,处理业务逻辑(比如查询内部数据库),再返回符合Alexa规范的JSON响应。跳过Lambda就是把这个后端逻辑放到自己的Flask/Bottle服务里,直接对接Alexa。
二、快速上手步骤(以Flask为例,Bottle可直接适配)
1. 搭建基础Flask服务
首先安装Flask:
pip install flask requests pyopenssl
然后写最基础的请求处理代码,包含意图解析、数据库交互(示例)和响应生成:
from flask import Flask, request, jsonify from OpenSSL import crypto import requests app = Flask(__name__) # 核心:验证Alexa请求的合法性(防止恶意访问) def verify_alexa_request(request): signature = request.headers.get('Signature') cert_url = request.headers.get('SignatureCertChainUrl') # 下载并验证证书域名 cert_response = requests.get(cert_url) cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_response.content) common_name = cert.get_subject().CN if not (common_name.endswith('.amazon.com') or common_name.endswith('.amazonaws.com')): return False # 验证请求签名 try: crypto.verify(cert, signature, request.data, 'sha1') return True except Exception as e: print(f"验证失败: {e}") return False # Alexa请求处理路由 @app.route('/alexa-skill', methods=['POST']) def alexa_handler(): # 先验证请求合法性 if not verify_alexa_request(request): return jsonify({"error": "无效请求"}), 403 # 解析Alexa的请求数据 req = request.json intent_name = req['request']['intent']['name'] # 处理业务逻辑(示例:查询内部数据库) speech_text = "" if intent_name == 'QueryDatabaseIntent': # 从请求槽位获取用户查询参数 query_param = req['request']['intent']['slots']['QueryKeyword']['value'] # 这里替换成你的内部数据库查询逻辑 # db_result = your_db_query_function(query_param) speech_text = f"从数据库查询到关于{query_param}的信息:[这里替换为实际查询结果]" else: speech_text = "抱歉,我没听懂你的请求,请换个说法试试。" # 生成符合Alexa规范的响应 response = { "version": "1.0", "response": { "outputSpeech": { "type": "PlainText", "text": speech_text }, "shouldEndSession": True # 是否结束对话,False则保持会话 } } return jsonify(response) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
2. 把服务暴露到公网(开发阶段)
Alexa要求端点必须是HTTPS,开发阶段可以用ngrok快速实现:
- 下载并安装ngrok
- 在终端运行:
ngrok http 5000
- 复制生成的HTTPS地址(类似
https://xxxx-xx-xx-xx-xx.ngrok.io),这就是你的Alexa技能端点。
3. 在Alexa开发者控制台配置端点
- 打开Alexa开发者控制台,进入你的技能项目
- 切换到「Endpoint」页面,选择「HTTPS」
- 把ngrok生成的地址加上路由后缀(比如
https://xxxx.ngrok.io/alexa-skill)填入对应区域的输入框 - 选择「My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority」,保存即可。
三、Bottle版本快速适配
如果习惯用Bottle,代码结构几乎一致:
from bottle import Bottle, request, response from OpenSSL import crypto import requests import json app = Bottle() # 同样的验证函数(和Flask版一致) def verify_alexa_request(request): # 内容和Flask版完全相同,略 pass @app.post('/alexa-skill') def alexa_handler(): if not verify_alexa_request(request): response.status = 403 return json.dumps({"error": "无效请求"}) req = request.json # 意图解析、数据库逻辑和Flask版一致 # ... response.content_type = 'application/json' return json.dumps(response_data) app.run(host='0.0.0.0', port=5000)
四、关键注意事项
- HTTPS是硬性要求:生产环境建议用Nginx+Let's Encrypt免费证书配置正式的HTTPS端点,不要依赖ngrok
- 数据库访问安全:不要让Web服务直接暴露数据库到公网,优先用内网IP访问,或者通过VPN/私有网络连接内部数据库
- 签名验证必须做:这是防止恶意请求的核心,你提到的教程里的验证逻辑就是这个思路,一定要实现
内容的提问来源于stack exchange,提问作者lost Coder
相关产品推荐
相关产品推荐

