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

news2024/11/29 3:55:57

使用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。
    在这里插入图片描述

二、示例代码中的使用

在 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快速文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL 进阶系列03 - OpenGL实例化渲染来提高性能

目录 一:概述 二:实例化渲染的优点: 三:OpenGL实例化渲染的例子: 一:概述 OpenGL 实例化渲染(Instanced Rendering)是一种渲染技术,可以有效地绘制多个相同对象,而不需要为每个对象单独提交绘制调用。通过这种方式,可以显著提高渲染性能,尤其是在需要绘制大量相…

【每日刷题】Day137

【每日刷题】Day137 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; 2. 495. 提莫攻击 - 力扣&#xf…

【数据结构与算法】线性表顺序存储结构

文章目录 一.顺序表的存储结构定义1.1定义1.2 图示1.3结构代码*C语言的内存动态分配 二.顺序表基本运算*参数传递2.1建立2.2初始化(InitList(&L))2.3销毁(DestroyList(&L))2.4判断线性表是否为空表(ListEmpty(L))2.5求线性表的长度(ListLength(L))2.6输出线性表(DispLi…

基于GoogleNet深度学习网络的手语识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 手语How are you&#xff0c;测试识别结果如下&#xff1a; 手语I am fine&#xff0c;测试识别结果如下&#xff1a; 手…

java入门和Java语法

Java直接运行源代码文件&#xff0c;不会产生HelloWorld.class第二种方法&#xff1a;把模块放在D盘下&#xff0c;然后导入 第三种方法&#xff1a;新建一个模块&#xff0c;然后把内容复制过去 byte l 12; short m l; System.out.println(m); char n a; int reason mn; Sy…

消息摘要算法

算法特点 a) 消息摘要算法/单向散列函数/哈希函数 b) 不同长度的输入&#xff0c;产生固定长度的输出 c) 散列后的密文不可逆 d) 散列后的结果唯一 e) 哈希碰撞 f) 一般用于校验数据完整性、签名sign 由于密文不可逆&#xff0c;所以服务端也无法解密 想要验证&#xf…

解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)

机器视觉产业链全景回顾 视觉引导机器人生态系统或产业链分为三个层次。 上游&#xff08;供应商&#xff09; 该机器人视觉系统的上游包括使其得以运行的硬件和软件提供商。硬件提供商提供工业相机、图像采集卡、图像处理器、光源设备&#xff08;LED&#xff09;、镜头、光…

如何让信息学奥赛学习“边玩边学”?——趣味编程让枯燥学习变得有趣

信息学奥赛&#xff08;NOI&#xff09;作为一项高水平的编程竞赛&#xff0c;内容涉及到大量的算法、数据结构和复杂的逻辑思维&#xff0c;对学生的要求非常高。然而&#xff0c;面对枯燥的知识点和高难度的题目&#xff0c;很多学生在备赛过程中容易感到乏味甚至放弃。那么&…

Overfrp内网穿透:使用域名将内网http/https服务暴露到公网

项目地址&#xff1a;https://github.com/sometiny/overfrp 使用overfrp部署穿透服务器&#xff0c;绑定域名后&#xff0c;可使用域名访问内网的http/https服务。 用例中穿透服务器和内网机器之间的访问全链路加密&#xff0c;具有ssh2相当的安全级别。&#xff01;&#xf…

国外电商系统开发-运维系统秘钥管理

文件上传功能&#xff0c;都是通过拖放的方式上传的 当然了&#xff0c;上面我只是演示行的放几个文件而已&#xff0c;不要在意文件名。此时&#xff0c;如果您有服务器是通过SSH-Key登录的&#xff0c;那么在服务器配置中&#xff0c;您可以做如下选择&#xff1a;

【论文阅读】Learning a Few-shot Embedding Model with Contrastive Learning

使用对比学习来学习小样本嵌入模型 引用&#xff1a;Liu, Chen, et al. “Learning a few-shot embedding model with contrastive learning.” Proceedings of the AAAI conference on artificial intelligence. Vol. 35. No. 10. 2021. 论文地址&#xff1a;下载地址 论文代码…

jenkins 插件SSH Pipeline Steps

一、安装 SSH Pipeline Steps | Jenkins plugin 二、添加全局linux服务器用户名密码&#xff1a;linux-142 三、新建流水线SshServer 添加Pipeline Script node {def remote [:]remote.name tstremote.host 192.168.31.142remote.allowAnyHosts truewithCredentials([usern…

leetcode167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers…

操作系统中的并发控制——使用条件变量同步

本期主题&#xff1a; 操作系统中的并发控制&#xff0c;条件变量 往期链接&#xff1a; linux设备驱动中的并发操作系统中的多线程问题——原子操作、自旋锁的底层实现操作系统并发控制——使用互斥锁实现同步 操作系统并发控制之条件变量同步 1. 问题描述2. 条件变量的API讲…

数据治理、数据清洗定义、区别以及数据清洗常用方法

一、数据治理定义 数据治理是一种组织数据管理的方法&#xff0c;涉及数据的收集、存储、处理、分析和共享等方面&#xff0c;旨在最大程度地利用数据资产并降低数据相关的风险。‌ 数据治理确保数据的质量、安全性、合规性和可用性&#xff0c;以支持组织的决策和运营活动。‌…

【Canvas与标牌】2024.10.8胜利大逃亡盾形标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>537.日期金盾Draft2上色</title><style type"text/css…

用Raspberry Pi Imager重装树莓派系统

今天删东西的时候&#xff0c;无意中把系统文件给remove了&#xff0c;结果树莓派无法正常启动&#xff0c;只能重新安装。 用DiskGenius工具将SD卡彻底清空&#xff0c;并将boot分区和文件分区合并为一&#xff0c;之后再对这个新分区进行了格式化。接下来就是烧录镜像了。以…

Java知识巩固(二)

OKracle JDK vs OpenJD 可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异&#xff1f;下面我通过收集到的一些资料&#xff0c;为你解答这个被很多人忽视的问题。 首先&#xff0c;2006 年 SUN 公司将 Java…

HTB:Bike[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What TCP ports does nmap identify as open? Answer with a list of ports seperated by commas with no spaces, from low to high. 2.What software is running the service listening on the http/web port identified in the first …

MVC案例整合Spring和Hibernate

说到整合Spring和Hibernate首先要搞清楚&#xff0c;整合什么&#xff1f; 1、使用Spring的IOC容器来生产Hibernate的SessionFactory对象实例 2、让Hibernate使用Spring的声明式事务 整合步骤 1、先加入Hibernate 2、在加入Spring&#xff0c;整合 新建项目&#xff0c;建…