当前位置:   article > 正文

【ChatGPT】原生JS实现ChatGPT小型Demo_api2d

api2d

初入前端的小白也可以尝尝鲜

无需科学上网,调用API2D的接口进行连接(也可以换成官方API,均有免费额度)

第一步、注册API2D

https://api2d.com/r/187255

使用GitHub或邮箱进行注册登录

,通过 GitHub 注册的开发者将获得 50 次的免费次数

第二步、复制ForwardKey

第三步、新建一个html文件

此处省略。。。

第四步、将代码复制到新建的html文件中

  1. <html>
  2. <head>
  3. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  4. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  5. <title>Chat GPT客服</title>
  6. </head>
  7. <body>
  8. <div class="rightSide">
  9. <div class="header">
  10. <div class="imgText">
  11. <div class="userimg">
  12. <img src="https://image.51uhj.com/wx/676e4ff60ad46337f9b39d8757766bf581b9b89f5927b1bdf4766a456efdd3d3.png"
  13. class="cover">
  14. </div>
  15. <h4>梯梯助手Chat GPT客服<br><span>在线</span></h4>
  16. </div>
  17. </div>
  18. <!--chatbox-->
  19. <div id="chatBox" class="chatBox">
  20. <div class="message frnd_message">
  21. <p>欢迎使用梯梯助手Chat GPT客服,有什么问题都可以问我。</span><br><span id="time"></span> </p>
  22. </div>
  23. </div>
  24. <!--chat input-->
  25. <div class="chatbox_input">
  26. <div class="chatbox_input_div">
  27. <input id="chatInput" type="text">
  28. <button id="chatbox_input_send" class="chatbox_input_send">发送</button>
  29. </div>
  30. </div>
  31. </div>
  32. </body>
  33. <script>
  34. document.getElementById('time').innerHTML = new Date().toLocaleString();
  35. var defuleValue = ''
  36. function debounce(fn, delay = 2000) {
  37. // 是闭包中的
  38. let timer
  39. let changeDom = document.getElementById('chatbox_input_send')
  40. // input事件调用的函数,相当于obj调用函数 this指向Input
  41. return function () {
  42. defuleValue = document.getElementById('chatInput').value
  43. // 这个if 判断不做也没关系,判断了(除第一次非空的情况)也就是执行从第二次开始,在延迟时间内多次触发才会走该判断
  44. if (timer) {
  45. clearTimeout(timer)
  46. } else {
  47. changeDom.innerHTML = '正在询问'
  48. changeDom.disabled = true
  49. document.getElementById('chatInput').value = ""
  50. }
  51. // 此时的箭头函数的this 和 arguments 都是从外部函数继承而来
  52. // 如果用普通函数就要用词法作用域 var that = this var arg = arguments
  53. timer = setTimeout(() => {
  54. // 使得传入的回调函数的this 指向Input这个元素对象
  55. // arguments是该事件的详情,可以获得该函数被调用时的所有参数,是一个event 对象(所有Dom事件都会传event对象进入)
  56. // 直接使用 fn() 问题也不大
  57. fn.apply(this, arguments)
  58. timer = null
  59. }, delay)
  60. }
  61. }
  62. // 直接使用
  63. document.getElementById('chatbox_input_send').addEventListener('click', debounce(() => {
  64. // 可直接使用this.value获得输入框的值; arguments可用于获取具体触发事件的信息
  65. // console.log(defuleValue)
  66. this.handleSend(defuleValue)
  67. }))
  68. document.getElementById('chatInput').addEventListener('keydown', function (event) {
  69. if (event.keyCode == "13") {
  70. document.getElementById('chatbox_input_send').click();
  71. }
  72. })
  73. function handleSend(inputValue) {
  74. // console.log(1);
  75. let inputDom = document.getElementById('chatBox');
  76. if (!inputValue.length) {
  77. alert('请输入您的问题!');
  78. document.getElementById('chatbox_input_send').innerHTML = '发送'
  79. document.getElementById('chatbox_input_send').disabled = false
  80. defuleValue = ""
  81. return
  82. }
  83. if (inputValue.length > 50) {
  84. alert('您输入的问题过长!');
  85. document.getElementById('chatbox_input_send').innerHTML = '发送'
  86. document.getElementById('chatbox_input_send').disabled = false
  87. defuleValue = ""
  88. return
  89. }
  90. inputDom.innerHTML = inputDom.innerHTML + '<div class="message my_message"><p>' + inputValue +
  91. '</span><br><span>' + new Date().toLocaleString() + '</span> </p></div>'
  92. const params = {
  93. model: 'gpt-3.5-turbo',
  94. messages: [{
  95. role: 'user',
  96. content: inputValue
  97. }],
  98. }
  99. let xhr = new XMLHttpRequest();
  100. xhr.open('post', `https://openai.api2d.net/v1/chat/completions`);
  101. xhr.setRequestHeader('content-type', 'application/json');
  102. xhr.setRequestHeader('Authorization', 'Bearer 此处写你的fk');
  103. xhr.send(JSON.stringify(params));
  104. xhr.onload = function () {
  105. console.log(JSON.parse(xhr.response));
  106. let res = JSON.parse(xhr.response)
  107. inputDom.innerHTML = inputDom.innerHTML +
  108. '<div class="message frnd_message"><p>' + res.choices[0].message.content + '</span><br><span>' +
  109. new Date().toLocaleString() +
  110. '</span> </p></div>'
  111. document.getElementById('chatbox_input_send').innerHTML = '发送'
  112. document.getElementById('chatbox_input_send').disabled = false
  113. defuleValue = ""
  114. }
  115. }
  116. </script>
  117. </html>
  118. <style>
  119. .chatbox_input_div {
  120. display: flex;
  121. align-items: center;
  122. justify-content: space-between;
  123. }
  124. .chatbox_input_send {
  125. width: 80px;
  126. height: 30px;
  127. }
  128. * {
  129. margin: 0;
  130. padding: 0;
  131. box-sizing: border-box;
  132. font-family: 'Open Sans', sans-serif;
  133. }
  134. body {
  135. display: flex;
  136. justify-content: center;
  137. align-items: center;
  138. min-height: 100vh;
  139. background: linear-gradient(#009688 0%, #009688 130px, #d9dbd5 130px, #d9dbd5 100%)
  140. }
  141. .rightside {
  142. background: #e5ddd5;
  143. width: 100%;
  144. position: fixed;
  145. top: 50px;
  146. }
  147. .rightside::before {
  148. content: '';
  149. position: absolute;
  150. top: 0;
  151. left: 0;
  152. width: 100%;
  153. height: 100%;
  154. background: url(img6-bg.jpg);
  155. opacity: 0.06;
  156. }
  157. .header {
  158. position: relative;
  159. width: 100%;
  160. height: 60px;
  161. background: #ededed;
  162. display: flex;
  163. justify-content: space-between;
  164. align-items: center;
  165. padding: 0 15px;
  166. }
  167. .userimg {
  168. position: relative;
  169. width: 40px;
  170. height: 40px;
  171. overflow: hidden;
  172. border-radius: 50%;
  173. cursor: pointer;
  174. }
  175. .cover {
  176. position: absolute;
  177. top: 0;
  178. left: 0;
  179. width: 100%;
  180. height: 100%;
  181. object-fit: cover;
  182. }
  183. .imgText {
  184. position: relative;
  185. display: flex;
  186. justify-content: center;
  187. align-items: center;
  188. }
  189. .imgText h4 {
  190. font-weight: 500;
  191. line-height: 1.2em;
  192. margin-left: 15px;
  193. }
  194. .imgText h4 span {
  195. font-size: 0.8em;
  196. color: #555;
  197. }
  198. .chatBox {
  199. position: relative;
  200. width: 100%;
  201. /* height: calc(100%-120px); */
  202. height: 70vh;
  203. padding: 50px;
  204. overflow-y: auto;
  205. }
  206. .message {
  207. position: relative;
  208. display: flex;
  209. width: 100%;
  210. margin: 5px 0;
  211. }
  212. .message p {
  213. position: relative;
  214. right: 0;
  215. text-align: right;
  216. max-width: 65%;
  217. padding: 12px;
  218. background: #dcf8c6;
  219. border-radius: 10px;
  220. font-size: 0.9em;
  221. }
  222. .message p::before {
  223. content: '';
  224. position: absolute;
  225. top: 0;
  226. right: -12px;
  227. width: 20px;
  228. height: 20px;
  229. background: linear-gradient(135deg, #dcf8c6 0%, #dcf8c6 50%, transparent 50%, transparent);
  230. }
  231. .message p span {
  232. display: block;
  233. margin-top: 5px;
  234. font-size: 0.85em;
  235. opacity: 0.5;
  236. }
  237. .my_message {
  238. justify-content: flex-end;
  239. }
  240. .frnd_message {
  241. justify-content: flex-start;
  242. }
  243. .frnd_message p {
  244. background: #fff;
  245. text-align: left;
  246. }
  247. .message.frnd_message p::before {
  248. content: '';
  249. position: absolute;
  250. top: 0;
  251. left: -12px;
  252. width: 20px;
  253. height: 20px;
  254. background: linear-gradient(225deg, #fff 0%, #fff 50%, transparent 50%, transparent);
  255. }
  256. .chatbox_input {
  257. position: relative;
  258. width: 100%;
  259. /* height: 150px; */
  260. background: #f0f0f0;
  261. padding: 15px;
  262. justify-content: space-between;
  263. align-items: center;
  264. }
  265. .chatbox_input input {
  266. position: relative;
  267. width: 90%;
  268. margin: 0 20px;
  269. padding: 10px 20px;
  270. border: none;
  271. outline: none;
  272. border-radius: 30px;
  273. font-size: 1em;
  274. }
  275. </style>

第五步、将复制的ForwardKey粘贴到这个地方

!!!注意 Bearer与空格不能删除

第六步、双击打开html文件

 这样就可以愉快的聊天了,如果只是想简单的尝试一下话就不用看下面的附录了。

附录

代码实现了按钮与输入框防抖置灰

如果想正式使用的话请将ForwardKey加密,否则会有恶意攻击的风险

如果需要更加深入的功能(如更换训练模型,更换版本)请看API2D官方文档(结一下广告费,本条

                                                                                   

目录

第一步、注册API2D

第二步、复制ForwardKey

第三步、新建一个html文件

第四步、将代码复制到新建的html文件中

第五步、将复制的ForwardKey粘贴到这个地方

第六步、双击打开html文件

附录


RiverGod-致力于每一个还有梦想的前端小白

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/248904?site
推荐阅读
相关标签
  

闽ICP备14008679号