You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无需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快速实现:

  1. 下载并安装ngrok
  2. 在终端运行:
ngrok http 5000
  1. 复制生成的HTTPS地址(类似https://xxxx-xx-xx-xx-xx.ngrok.io),这就是你的Alexa技能端点。

3. 在Alexa开发者控制台配置端点

  1. 打开Alexa开发者控制台,进入你的技能项目
  2. 切换到「Endpoint」页面,选择「HTTPS」
  3. 把ngrok生成的地址加上路由后缀(比如https://xxxx.ngrok.io/alexa-skill)填入对应区域的输入框
  4. 选择「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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:40:38