对接讯飞聊天机器人接口--复盘

1、准备工作

        1)、进入以下平台进行注册,登录后,点击红框处

        2)、点击个人免费包(会弹出实名认证,先进行实名认证)

     3)、认证后,会进入以下界面,先添加应用

     4)、添加应用

    5)、选择套餐,提交订单

   6)、返回主页,点击控制台,找到自己的应用,点击进入应用

   7)、进入应用后找到自己的APPID、APISecret、APIKey。


2、先看效果 

3、前端完整代码

★★★注意★★★:个人只是写了前端代码,聊天记录刷新后就没有了。

<template><a-layout style="max-width: 800px; margin: auto"><a-layout-content:style="{border: '3px solid #4fc3f7',borderRadius: '8px',boxShadow: '0 8px 16px rgba(0, 0, 0, 0.3)',overflow: 'hidden',}"><h2 style="margin-bottom: 20px; text-align: center; color: #4fc3f7">Chat Record</h2><div class="divider"></div><div class="chat-messages" ref="chatMessages"><!-- 聊天记录显示区域Q --><div v-if="dialogueHistory.length === 0" class="no-data-message">暂无数据</div><divv-for="message in dialogueHistory":key="message.id"class="message-container"><!-- 修改部分 --><div:class="[message.type === 'question'? 'user-name-aline': 'robot-name-aline',]"><div>{{ message.name }}:</div></div><div class="divider"></div><div:class="[message.type === 'question' ? 'user-message' : 'bot-message',message.isCode ? 'code-message' : '',]"style="position: relative"><template v-if="message.isCode"><!-- 使用 extractCodeAndLanguage 函数 --><prev-html="highlightCode(extractCodeAndLanguage(message.text).code)"style="background-color: #f0f0f0;padding: 15px;box-shadow: #999999;border-radius: 5px;margin: 0;"></pre></template><template v-else>{{ message.text }}</template><!-- 添加复制按钮 --><buttonv-if="message.isCode"@click="copyCode(message.text)"class="copy-button"style="position: absolute;top: 7px;right: 7px;cursor: pointer;border: none;background: transparent;color: #3498db;">Copy</button></div><!-- 结束修改部分 --></div></div><div class="user-input-container"><!-- 用户输入框 --><a-inputv-model="inputVal"@pressEnter="sendMsg"placeholder="请输入消息..."style="flex-grow: 1;padding: 8px;border: 1px solid #3498db;border-radius: 5px;margin-right: 10px;"/><!-- 发送按钮 --><a-button type="primary" @click="sendMsg" style="cursor: pointer">发送</a-button></div></a-layout-content></a-layout>
</template>
<script setup>
import { ref } from "vue";
import * as base64 from "base-64";
import CryptoJs from "crypto-js";
import hljs from "highlight.js/lib/core";
import "highlight.js/styles/default.css"; // 选择适合你项目的样式// 导入你需要的语言支持
import javascript from "highlight.js/lib/languages/javascript";
import css from "highlight.js/lib/languages/css";
import html from "highlight.js/lib/languages/xml";
import ClipboardJS from "clipboard";// 注册语言支持
hljs.registerLanguage("javascript", javascript);
hljs.registerLanguage("css", css);
hljs.registerLanguage("html", html);
const requestObj = {APPID: "填你自己的",APISecret: "填你自己的",APIKey: "填你自己的",Uid: "0",sparkResult: "",
};const inputVal = ref("");
const result = ref("");
const dialogueHistory = ref([]);const isCopyButtonClicked = ref(false);// 检测回复是否为代码
const isCode = (text) => {// 简单的检测逻辑,您可以根据需要进行调整return text.startsWith("```") && text.endsWith("```");
};// 获取鉴权 URL
const getWebsocketUrl = async () => {return new Promise((resolve, reject) => {const url = "wss://spark-api.xf-yun.com/v3.1/chat";const host = "spark-api.xf-yun.com";const apiKeyName = "api_key";const date = new Date().toGMTString();const algorithm = "hmac-sha256";const headers = "host date request-line";const signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v3.1/chat HTTP/1.1`;const signatureSha = CryptoJs.HmacSHA256(signatureOrigin,requestObj.APISecret);const signature = CryptoJs.enc.Base64.stringify(signatureSha);const authorizationOrigin = `${apiKeyName}="${requestObj.APIKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;const authorization = base64.encode(authorizationOrigin);// 将空格编码resolve(`${url}?authorization=${authorization}&date=${encodeURI(date)}&host=${host}`);});
};// 发送消息
const sendMsg = async () => {const myUrl = await getWebsocketUrl();const socket = new WebSocket(myUrl);socket.onopen = (event) => {// 发送消息的逻辑// 发送消息const params = {header: {app_id: requestObj.APPID,uid: "redrun",},parameter: {chat: {domain: "generalv3",temperature: 0.5,max_tokens: 1024,},},payload: {message: {text: [{ role: "user", content: inputVal.value }],},},};dialogueHistory.value.push({type: "question",name: "我",text: inputVal.value,// timestamp: getTimestamp(),});socket.send(JSON.stringify(params));};socket.onmessage = (event) => {const data = JSON.parse(event.data);if (data.header.code !== 0) {console.error("Error:", data.header.code, data.header.message);socket.close();return;}// 累积所有接收到的消息if (data.payload.choices.text) {// 连接新接收到的消息片段const newMessage = data.payload.choices.text[0].content;if (dialogueHistory.value.length > 0 &&dialogueHistory.value[dialogueHistory.value.length - 1].type ==="answer") {// 连接新接收到的消息片段到最后一个回答dialogueHistory.value[dialogueHistory.value.length - 1].text +=newMessage;} else {// 添加新的回答dialogueHistory.value.push({type: "answer",name: "智能助手",text: newMessage,// timestamp: getTimestamp(),});}// 如果回复是代码,添加相应的标记和样式if (isCode(newMessage)) {dialogueHistory.value[dialogueHistory.value.length - 1].isCode = true;}}// 如果对话完成或者发生错误,则关闭 socketif (data.header.status === 2 || data.header.code !== 0) {setTimeout(() => {socket.close();}, 1000);}};socket.onclose = (event) => {inputVal.value = "";};socket.onerror = (event) => {console.error("WebSocket error:", event);};
};
// 移除代码块的标记和语言标识符
const extractCodeAndLanguage = (text) => {if (isCode(text)) {const lines = text.split("\n");const language = lines[0].substring(3).trim();const code = lines.slice(1, -1).join("\n");return { language, code };}return { language: null, code: text };
};
// 高亮代码的方法
const highlightCode = (code) => {// 判断是否包含代码标识符if (code.startsWith("```") && code.endsWith("```")) {// 去掉头尾的```标识符code = code.slice(3, -3);}const highlighted = hljs.highlightAuto(code);return highlighted.value;
};
//
// // 获取当前时间戳
// const getTimestamp = () => {
//   return Math.floor(new Date().getTime() / 1000);
// };
//
// // 格式化时间戳为可读的时间格式
// const formatTimestamp = (timestamp) => {
//   const date = new Date(timestamp * 1000);
//   const hours = date.getHours();
//   const minutes = "0" + date.getMinutes();
//   return `${hours}:${minutes.substr(-2)}`;
// };
const copyCode = (code) => {// 使用 clipboard.js 复制文本到剪贴板const parentButton = document.querySelector(".message-container button");// 获取处理后的代码,如果是代码块,提取其中的代码const processedCode =code.startsWith("```") && code.endsWith("```")? extractCodeAndLanguage(code).code: code;// 获取按钮元素const copyButton = document.querySelector(".copy-button");// 按钮初始文本const initialButtonText = copyButton.innerText;// 修改按钮文本为勾copyButton.innerText = "✔ Copied";// 3秒后将按钮文本还原setTimeout(() => {copyButton.innerText = initialButtonText;}, 3000);if (parentButton && parentButton.parentNode) {const clipboard = new ClipboardJS(parentButton, {text: function () {return processedCode;},});clipboard.on("success", function (e) {console.log("Text copied to clipboard:", e.text);clipboard.destroy(); // 销毁 clipboard 实例,防止重复绑定});clipboard.on("error", function (e) {console.error("Unable to copy text to clipboard:", e.action);clipboard.destroy(); // 销毁 clipboard 实例,防止重复绑定});} else {console.error("Parent button or its parent node is null or undefined.");}
};
</script><style scoped>
#ChatRobotView {max-width: 800px;margin: auto;
}.chat-container {border: 1px solid #ccc;border-radius: 8px;overflow: hidden;
}.chat-messages {padding: 10px;max-height: 400px;overflow-y: auto;
}.message {margin-bottom: 10px;
}.user-message {background-color: #3498db;color: #ffffff;padding: 10px;border-radius: 5px;align-self: flex-end;
}.bot-message {background-color: #e0e0e0;color: #000000;padding: 10px;border-radius: 5px;align-self: flex-start;
}.user-input-container {display: flex;justify-content: space-between;align-items: center;padding: 10px;border-top: 1px solid #ddd;
}.user-input-container input {flex-grow: 1;padding: 8px;border: 1px solid #ddd;border-radius: 5px;margin-right: 10px;
}.user-input-container button {background-color: #4caf50;color: #fff;border: none;padding: 8px 16px;border-radius: 5px;cursor: pointer;
}.message-container {display: flex;flex-direction: column;margin-bottom: 10px;
}.message-info {font-size: 12px;color: #888;margin-bottom: 5px;
}.user-name-aline {align-self: flex-end;margin-bottom: 5px;
}.robot-name-aline {align-self: flex-start;margin-bottom: 5px;
}.no-data-message {font-size: large;color: #8c8c8c;height: 200px;display: flex;align-items: center;justify-content: center;
}.message-container button.copy-button:active {background-color: #4caf50; /* 按下时的背景色 */color: #fff;
}.divider {width: 100%;height: 1px;background-color: #4fc3f7;margin: 5px 0;
}
</style>

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

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

相关文章

代码随想录刷题题Day29

刷题的第二十九天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day29 任务 ● 01背包问题&#xff0c;你该了解这些&#xff01; ● 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 …

软件测试|深入理解Python的encode()和decode()方法

简介 在Python中&#xff0c;字符串是不可变的序列对象&#xff0c;它由Unicode字符组成。当我们需要在字符串和字节之间进行转换时&#xff0c;Python提供了两个非常重要的方法&#xff1a;encode()和decode()。这两个方法允许我们在Unicode字符和字节之间进行相互转换&#…

认知能力测验,⑤破解图形推理测试题,校招社招网申在线测评必用

认知能力测试&#xff0c;如今是每个求职者必须要面对的&#xff0c;有的人可以顺顺利利通过&#xff0c;而有的人只能够遗憾止步。想要通过认知能力测验&#xff0c;并不是一件易事&#xff0c;而今天要说的图形推理&#xff0c;仅仅是其中的一个部分&#xff0c;抛砖引玉&…

【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云

文章目录 引言数据采集数据集展示数据预处理 数据分析评价总体情况分析本人浅薄分析 各游客人群占比分析本人浅薄分析 各评分雷达图本人浅薄分析 差评词云-可视化本人浅薄分析 好评词云-可视化本人浅薄分析 综合分析写在最后 今年冬天&#xff0c;哈尔滨冰雪旅游"杀疯了&q…

IP地址的网络安全防护和预防

网络安全对于保护个人和组织的信息资产至关重要&#xff0c;而IP地址是网络通信的基础。在这篇文章中&#xff0c;IP数据云将探讨IP地址的网络安全防护和预防措施&#xff0c;以确保网络的安全性和可靠性。 IP地址是互联网上每个设备在网络中的唯一标识符。有IPv4和IPv6两种类…

docker部署awvs

docker部署awvs cantos部署docker点这里 下载镜像 docker pull xiaomimi8/awvs14-log4j-2022 docker images 查看本地所有镜像启动镜像 docker run -it -d&#xff08;后台运行&#xff09; -p&#xff08;端口映射&#xff09; 13443&#xff08;主机端口&#xff09;:3443&…

【Databand】日期时间函数

文章目录 获取当前日期和时间日期格式化函数日期加减运算日期时间和时间戳转化日期时间各部分拆分日期时间加减运算实际应用扩展总结 获取当前日期和时间 Databend 使用 UTC 作为默认时区&#xff0c;并允许您将时区更改为当前地理位置。 -- 查看时区 select timezone(); ---…

【Java开发工具】windows和mac多版本JDK 安装指南:让你在开发中轻松应对不同版本需求

解决思路 通过动态修改JDK环境变量中的JAVA_HOME 将值改成相应的JDK安装目录&#xff0c;来达到在同一电脑中安装不同版本jdk的效果。 windows系统 安装的jdk目录 右键→属性→高级系统设置→高级→环境变量→系统变量。 新建4个系统变 量变量值,变量名分别为&#xff1a…

statsmodels.tsa 笔记 detrend(去趋势)

1 基本使用方法 statsmodels.tsa.tsatools.detrend(x, order1, axis0) 2 参数说明 x数据。如果是二维数组&#xff0c;那么每一行或每一列将独立地去除趋势&#xff0c;但趋势的阶数是一样的。order趋势的多项式阶数。0 表示常数趋势&#xff08;即没有趋势&#xff09;&…

kubernetes Adminssion Webhook 准入控制器 (ImagePolicyWebhook)

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 介绍 原理 流程 Admission Webhook 准入控制器Vebhook是准入控制插件的一种&#xff0c;用于拦截所有向APISERVER发送的…

超声波清洗机是智商税吗?哪些超声波清洗机值得买?这些值得入手

自打超声波清洗机问世以来&#xff0c;就有非常多朋友会有这个疑问&#xff01;超声波清洗机到底是不是智商税呢&#xff1f;其实不光是大家&#xff0c;一开始我也有这个疑问&#xff0c;但是通过了解了超声波清洗机的一些工作原理之后&#xff0c;会发现&#xff0c;其实超声…

服务器组网方案

在当今数字化时代&#xff0c;服务器组网方案不仅是企业信息管理的关键&#xff0c;更是支撑业务运作的核心架构 。为了实现高效的数据处理和存储&#xff0c;服务器组网方案成为企业不可或缺的一部分。本文将深入探 讨服务器组网方案的核心要素和实施策略&#xff0c;明确其在…

RTMP vs SRT:延迟与最大带宽的比较

引言 文来自Haivision的白皮书&#xff0c;比较了RTMP和SRT两种流媒体协议的优缺点&#xff0c;并通过实验测试了两种协议在延迟和最大带宽两方面的表现。 本文福利&#xff0c; 免费领取C音视频学习资料包学习路线大纲、技术视频/代码&#xff0c;内容包括&#xff08;音视频…

zabbix监控部署

目录 一、什么是zabbix&#xff1f; 二、zabbix监控原理 三、zabbix常见的五个程序 四、zabbix监控mysql实验 1、部署服务端 2、部署客户端 3、自定义监控内容 一、什么是zabbix&#xff1f; zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的…

如何让GPT支持中文

上一篇已经讲解了如何构建自己的私人GPT&#xff0c;这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型&#xff0c;GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品&#xff0c;llama.cpp 不再…

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…

C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性 阅读C#之反编译之路(一) 如何快速定位代码位置 用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误 拿到关键字车牌号长度错误直接反编译代码 打开dnSpy.exe→加载项目→CtrlF打开搜索框→输入…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息&#xff0c;感谢关注&#xff01; 链接&#xff1a;https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…

极海APM32F003通过IEC 60730/60335功能安全认证,为产品安全保驾护航

近日&#xff0c;极海APM32F003系列工业级超值型MCU&#xff0c;已顺利通过IEC 60730/60335功能安全认证&#xff0c;并可提供符合CLASS B标准的功能安全设计套件&#xff0c;有助于客户减少认证时间与成本&#xff0c;快速推出稳定可靠的终端产品。 *VDE是德国的一个权威性电气…

Spring - 配置支持多数据源

目录 SpringBoot整合多数据源整合步骤具体整合步骤如下&#xff1a;1、在application.properties中配置出多个数据源2、在代码中创建出mapper目录&#xff0c;在mapper目录下创建出不同数据源的目录创建出目录MySQL数据源的MapperSQL Server数据源的Mapper 3、创建config packa…