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

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.hqwc.cn/news/333360.html

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

相关文章

Bito智能辅助编程体验报告

Bito智能辅助编程体验报告 1 Bito 能够为我们做些什么事&#xff1f; 号称 IDE 的“瑞士军刀”&#xff0c;可以提升开发 10 倍的效率; 生成代码&#xff1a;要求 Bito 使用自然语言提示生成任何语言的代码。&#xff08;例如&#xff0c;编写一个 Java 函数将数字从一种基数转…

NVIDIA官网如何下载所有历史版本的驱动,包括上古化石版本?

NVIDIA官网如何下载所有历史版本的驱动&#xff0c;包括上古化石版本&#xff1f; 1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;4.结果预览&#x1f914; 1.软件环境⚙️ Windows10 教育版64位 GeForce GTX 1060 (Notebooks) Chrome 120.0.6099.199&#xff…

阿里云计算平台大数据基础工程技术团队直聘!!!

大数据基础工程技术团队&#xff0c;隶属于阿里云智能集团计算平台事业部&#xff0c;是一支负责阿里集团、公共云和混合云场景计算平台大数据&AI产品的稳定性建设、架构&成本优化、运维产品ABM&#xff08;Apsara Big data Manager&#xff09;研发和售后技术专家支持…

这个门禁监控技术,好用好用极了!!

随着科技的迅猛发展&#xff0c;门禁监控技术在各行各业得到了广泛的应用。门禁监控系统不仅提高了安全性&#xff0c;还为管理人员提供了更为便捷和高效的管理手段。 客户案例 企业大厦安全管理 深圳某高层企业大厦面临着人员流动频繁、安全隐患较多的挑战。通过部署泛地缘科…

Android Studio安卓读写NFC Ntag标签源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.3513789erHXVGx&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

【Android Studio】创建第一个APP工程及生成APK安装包

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本文详细介绍创建Android Studio第一个APP工程及打包生成APK安装包。 如下两个博客我记录了第一次创建项目时出现的问题&#xff0c;若你也遇见了同样的问题&#xff0c;可参考&#…

维生素C,新生儿成长的阳光:补充注意事项指南

引言&#xff1a; 新生儿的健康发育需要全方位的关注&#xff0c;而维生素C作为一种重要的营养元素&#xff0c;在宝宝的成长中扮演着关键的角色。本文将深入讨论维生素C的功能、补充时机&#xff0c;以及在给新生儿补充维生素C时应该注意的事项&#xff0c;为小天使们提供最贴…

多模态推荐系统综述:五、挑战

五、挑战 1、Multimodal Recommender Systems: A Survey 2023 •通用解决方案。 值得注意的是&#xff0c;尽管针对模型中的不同阶段提出了一些方法[24]&#xff0c;但没有提供这些技术组合的最新通用解决方案。 •模型可解释性。 多模态模型的复杂性会使系统生成的建议难以…

01-连接池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

Debugger断点调试以及相应面板介绍

断点&#xff08;包含条件断点&#xff09;调试以及相应面板介绍 ​ 先准备两个函数&#xff0c;在bar函数中使用debugger&#xff0c;代码如下。 function foo() {let result 0for (let i 0; i < 10; i) {result i}result bar(result)return result}function bar(resu…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

【MySQL】数据库之Redis的持久化

目录 一、Redis的高可用 1.1什么是高可用 1.2Redis的高可用技术 1.3持久化功能 1.4Redis持久化的方式 二、Redis的持久化之RDB 2.1RDB持久化的触发方式 触发条件 RDB持久化的触发分为手动触发和自动触发两种。 &#xff08;1&#xff09;手动触发 &#xff08;2&…