ESP32接入扣子(Coze) API使用自定义智能体

使用ESP32接入Coze API实现聊天机器人的教程

本示例将使用ESP32开发板通过WiFi接入 Coze API,实现一个简单的聊天机器人功能。用户可以通过串口向机器人输入问题,ESP32将通过Coze API与智能体进行通信,并返回对应的回复。本文将详细介绍了如何通过HTTP请求和JSON解析来与API进行交互,并给出完整的代码示例。

一、准备工作

首先我们要获取Coze API 访问令牌和机器人 ID

在扣子(Coze)平台上,API 访问令牌(API Access Token)和机器人 ID(Bot ID)是两个关键的参数,它们用于身份验证和区分不同的机器人。

API 访问令牌(API Access Token)

API 访问令牌是一种安全机制,用于验证你的身份,确保你有权访问扣子平台的 API。每个令牌都是唯一的,并且与你的扣子账户相关联。

获取 API 访问令牌的步骤

  1. 登录扣子平台。
    https://www.coze.cn/home

  2. 注册进入账户 然后点击API 管理部分。
    在这里插入图片描述

  3. 查找生成 API 访问令牌的选项,点击生成新的访问令牌。
    在这里插入图片描述

  4. 系统会为你生成一个访问令牌,通常会有一个复制按钮,复制该令牌,保存起来。

✨注意事项

  • 访问令牌通常包含字母和数字,长度较长,需要妥善保管,不要泄露给他人。
  • 访问令牌一旦生成,通常无法再次查看,只能重新生成。如果丢失,需要重新生成新的令牌,并更新所有使用旧令牌的地方。

机器人 ID(Bot ID)

机器人 ID 是一个用于区分不同机器人的唯一标识符。在扣子平台上,每个机器人都有一个唯一的 ID。

获取机器人 ID 的步骤

  1. 进入你的机器人列表。
    在这里插入图片描述

  2. 点击你想要接入 API 的机器人,查看此时的URL bot/后面的一串数字就是机器人 ID。
    在这里插入图片描述

下面是我用python requests库搭建的请求示例,可以作为参考,这里我使用的v2发起对话接口,关于接口的详细信息可以看下官方文档 ➡️ 发起对话(V2)

import requests
# coze LLM
def send_coze(messages, user_profile):
    api_access_token:str = "pat_ugo1Q9BN1sPvc9dDNQawLtr*******************";  # API 访问令牌
    chat_bot_id:str = "74202200*********";  # 机器人 ID,用于区分不同的聊天机器人

    url = "https://api.coze.cn/open_api/v2/chat"
    headers = {
        "Authorization": f"Bearer {api_access_token}",
        "Content-Type": "application/json"
    }

    payload = {
        "bot_id": chat_bot_id,
        "user": "123123123", #user可随意修改
        "query": user_profile,
        "stream": False
    }
    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()  # 检查请求是否成功
        response_data = response.json()

        messages = response_data.get('messages', [])
        for message in messages:
            message_content = message.get('content', '')
            if not message_content.startswith("{") and not message_content.startswith("RPCError"):
                print(f"coze answer:{message_content}")
                return message_content

    except requests.exceptions.RequestException as e:
        print('Request failed:', e)
        raise e
# 测试函数
def test_send_coze():
    messages = ""
    user_profile = "你好啊"
    response = send_coze(messages, user_profile)
    print("Final Response:", response)
# 运行测试
if __name__ == "__main__":
    test_send_coze()

二、示例代码中的使用

在 ESP32 代码中,API 访问令牌和机器人 ID 被用于构建 HTTP 请求,以便与扣子平台的 API 进行通信。

const String api_access_token = "pat_ugo1Q9BN1sPvc9dDNQawLtrY***********************";  // API 访问令牌
const String chat_bot_id = "74202200**********";  // 机器人 ID

在发送 HTTP 请求时,API 访问令牌被添加到请求头中,用于身份验证:

http_client.addHeader("Authorization", "Bearer " + api_access_token);

机器人 ID 被添加到请求体中,用于指定请求发送到哪个机器人:

json_request["bot_id"] = chat_bot_id;

这样,当 ESP32 发送请求到扣子平台时,平台能够验证请求的合法性,并将其正确地路由到指定的机器人进行处理。

完整代码 arduino框架

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

const char* wifi_ssid = "";            // WiFi 网络名称
const char* wifi_password = "";        // WiFi 密码

const String api_access_token = "pat_ugo1Q9BN1sPvc9dDNQawLtr**************";  // API 访问令牌
const String chat_bot_id = "742022000*******";  // 机器人 ID,用于区分不同的聊天机器人

void setup() {
  Serial.begin(9600);

  // 第1步:连接到 WiFi
  WiFi.begin(wifi_ssid, wifi_password);
  while (WiFi.status() != WL_CONNECTED) {  // 如果尚未连接到 WiFi,等待并继续尝试连接
    delay(1000);
    Serial.println("正在连接到WiFi...");
  }
  Serial.println("已连接到WiFi");

  Serial.print("请输入问题: ");
}

void loop() {
  // 第2步:检查是否有用户输入
  if (Serial.available()) {
    String user_input = Serial.readStringUntil('\n');  // 读取用户输入直到遇到换行符
    user_input.trim();  // 去除输入前后的空白字符,确保输入干净

    Serial.println(user_input);  // 在串口打印用户输入的内容

    // 检查 WiFi 是否连接
    if (WiFi.status() != WL_CONNECTED) {
      Serial.println("错误: WiFi 未连接");
      return;
    }

    // 第3步:创建 HTTPClient 对象并配置请求
    HTTPClient http_client;  // 创建 HTTPClient 对象,管理 HTTP 请求
    http_client.begin("https://api.coze.cn/open_api/v2/chat");  
    http_client.addHeader("Authorization", "Bearer " + api_access_token);
    http_client.addHeader("Content-Type", "application/json");  // 设置请求头,指定内容类型为 JSON

    // 第4步:创建 JSON 请求体
    DynamicJsonDocument json_request(1024);
    json_request["bot_id"] = chat_bot_id;
    json_request["user"] = "123123123";
    json_request["query"] = user_input;
    json_request["stream"] = false;

    String request_body;  // 存储 JSON 
    serializeJson(json_request, request_body);  // JSON 文档序列化为字符串

    // 第5步:发送 HTTP POST 请求并获取响应
    int http_response_code = http_client.POST(request_body);  // 发送 POST 请求

    String server_response;
    if (http_response_code > 0) {
      server_response = http_client.getString(); 
    } else {
      Serial.print("POST请求出错: ");
      Serial.println(http_response_code);
      server_response = "错误: " + String(http_response_code);
    }
    http_client.end();

    // 第6步:解析并处理服务器响应
    DynamicJsonDocument json_response(1024);  // 创建用于解析响应的 JSON 文档
    DeserializationError json_error = deserializeJson(json_response, server_response);  // 解析服务器响应的 JSON 数据

    if (json_error) {  // 如果解析失败
      Serial.print("解析JSON失败: ");
      Serial.println(json_error.c_str()); 
      return; 
    }

    // 第7步:提取并输出消息内容
    JsonArray messages = json_response["messages"];  // 获取响应中的消息数组
    for (JsonVariant message : messages) {  // 遍历每个消息获取消息内容
      String message_content = message["content"].as<String>();  
      if (!message_content.startsWith("{") && !message_content.startsWith("RPCError")) {
        Serial.println(message_content);
      }
    }
    Serial.print("请输入问题: ");
  }
}

三、总结

参考资料:扣子 API快速文档

### 微信集成Coze智能体的方法 #### 准备工作 在开始集成前,需确保已拥有Coze平台账号并完成基础配置。对于微信接入部分,还需申请微信公众平台开发者权限以及获取相应的AppID和AppSecret。 #### 创建应用 进入微信公众平台,在设置项下找到服务器配置选项。按照指引填写URL、Token及EncodingAESKey等必要参数[^2]。这些信息将在后续步骤中用于验证消息合法性与加密通信。 #### 配置Webhook 前往Coze控制台的应用管理页面新建或编辑现有应用程序实例。在此过程中指定回调地址(即上述提到的URL),以便接收来自微信的消息推送。同时开启事件订阅功能以监听用户交互行为如关注/取消关注、发送文字等内容类型的通知请求[^3]。 #### 实现接口逻辑 编写服务端程序处理接收到的数据包解析与响应构建任务。以下是Python版本示例代码片段: ```python from flask import Flask, request, make_response import hashlib import xml.etree.ElementTree as ET app = Flask(__name__) @app.route('/wechat', methods=['GET', 'POST']) def wechat(): if request.method == 'GET': token = "your_token" query_name = ['signature', 'timestamp', 'nonce', 'echostr'] query_data = [request.args.get(name, '') for name in query_name] list_obj = [token, query_data[1], query_data[2]] list_obj.sort() sha1 = hashlib.sha1() map(sha1.update, list_obj) hashcode = sha1.hexdigest() if hashcode == query_data[0]: return make_response(query_data[-1]) else: return "" elif request.method == 'POST': rec = request.stream.read() root = ET.fromstring(rec) to_user_name = root.find('ToUserName').text from_user_name = root.find('FromUserName').text content_type = root.find('MsgType').text response_msg = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>" reply_content = process_message(content_type, root) # 自定义函数处理不同类型的信息 resp_xml = response_msg % (from_user_name, to_user_name, str(int(time.time())), reply_content) return make_response(resp_xml) if __name__ == '__main__': app.run(port=80) ``` 此段代码实现了最基本的认证流程及文本回复机制。实际项目里可能还需要考虑更多细节比如多媒体文件上传下载支持等功能扩展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值