chatgpt小程序版本来了,解决你们手机上想用用不了的问题,chatgpt接口用到小程序里面,调用openai接口,提供前后端源码,可以私有部署使用

news2024/11/18 19:57:58

现在的chatgpt被玩的都开始加广告,又办会员什么的的,今天就把小程序的前后端无广告版本源码和部署方式说一下。

先看效果:

在这里插入图片描述

部署环境

前端用的uniapp,基础模版,单页面没有太多引用
后端使用的python的falsk框架,就一两个接口,用作跳转的,部署在阿里云的云函数里面。
因为微信现在不能直接使用openai的官方接口,所以用python做个接口转发

开始部署

可以直接下载文件,也可以直接拷贝代码,你们随意。

前端部署开始:

hbuliderx 新建项目
在这里插入图片描述选这个默认模板就可以
在这里插入图片描述
然后点下面的创建

一共需要改动两个文件
在这里插入图片描述
图片粘贴进去就可以,然后双击index.vue
右侧直接ctrl+A全选删掉
在这里插入图片描述
然后找到文件中的index.vue文件
在这里插入图片描述

把代码全选复制进去

代码如下

<template>
	<view >
		<scroll-view scroll-with-animation scroll-y="true" style="width: 100%;">
			<!-- 用来获取消息体高度 -->
			<view id="okk" scroll-with-animation>
				<!-- 消息 -->
				<view class="flex-column-start" v-for="(x,i) in msgList" :key="i">
					<!-- 用户消息 头像可选加入-->
					<view v-if="x.my" class="userinfo">
						<view class="flex justify-end" style="margin-right: 5%;">
							<view class="usermsg">
								<text style="word-break: break-all;">{{x.msg}}</text>
							</view>
						</view>
					</view>
					<!-- 机器人消息 -->
					<view v-if="!x.my" class="aiinfo">
						<view class="chat-img ">
							<image style="height: 75rpx;width: 75rpx;" src="../../static/openai.png" mode="aspectFit">
							</image>
						</view>
						<view class="flex" style="width: 500rpx;">
							<view class="aimsg" style="border-radius: 35rpx;background-color: #f9f9f9;">
								<text style="word-break: break-all;">{{x.msg}}</text>
							</view>
						</view>
					</view>
				</view>
				<!-- 防止消息底部被遮 -->
				<view style="height: 130rpx;">
				</view>
			</view>
		</scroll-view>
		<!-- 底部导航栏 -->
		<view class="flex-column-center">
			<button @click="openpop" class="btn" style="margin-bottom: 20rpx;width: auto;" v-if="!apisucc">{{apibut}}</button>
			<view class="inpubut" v-if="apisucc">
				<input v-model="msg" class="dh-input" type="text" @confirm="sendMsg" confirm-type="search"
					placeholder-class="my-neirong-sm" placeholder="描述您的问题" />
				
				<button @click="sendMsg" :disabled="msgLoad" class="btn " >{{sentext}}</button>
			</view>
		</view>
		<uni-popup ref="popup" type="center">
			<view class="popcls">
				<view class="uni-textarea" style="width: 90%;margin: 20rpx 20rpx;border: 1px solid #000000;">
					<textarea style="width: 100%; " placeholder-style="color:#F76260" :placeholder="apiadj"
						v-model="api" />
				</view>
				<view style="display: flex;flex-direction: row;">
					<button style="margin: 10rpx;" type="primary" @click="apiset">确认</button>
					<button style="margin: 10rpx;" @click="clopop">取消</button>
				</view>
			</view>
		</uni-popup>
	</view>
</template>

<script>


	export default {
		data() {
			return {
				apiurl:'https://flask-wpp.run',
				apisucc:false,
				apibut: '需要先进行API配置才能使用',
				sentext: '先配置api',
				apiadj: '在此输入你的APIKEY',
				api: '',
				msgLoad: true,
				anData: {},
				animationData: {},
				showTow: false,
				msgList: [{
					my: false,
					msg: "你好呀,想问什么就问吧"
				}],
				msgContent: "",
				msg: ""
			}
		},

		onLoad() {
			try {
				const value = uni.getStorageSync('sk');
				if (value) {
					console.log(value);
					this.api = value
					this.apiset()

				}
			} catch (e) {
				// error
				console.log(e);
			}
			uni.request({
				url:this.apiurl,
			
				method:'GET',
				success: (res) => {
					console.log(res);
					this.apiadj = res.data
				}})
			
		},

		methods: {
			setsklocal(apikey) {
				uni.setStorage({
					key: 'sk',
					data: apikey,
					success: function(res) {
						console.log('success', res);
					}
				});
			},
			clopop() {
				this.$refs.popup.close('center')
			},
			openpop() {
				this.$refs.popup.open('center')
			},
			apiset() {
				this.$refs.popup.close('center')
				this.apibut = 'api检测中'
				
				let data = JSON.stringify({
					msg: "你好",
					openaikey: this.api
				})
				uni.request({
					url:this.apiurl+'/message',
					data:data,
					method:'POST',
					success: (res) => {
						console.log('suc',res,res.data.code)
						
						if (res.data.code == 200){
							
							this.apibut = '连接成功',
							this.apisucc = true
							this.sentext = '发送'
							this.msgLoad = false
							this.setsklocal(this.api)
						}else{
							this.apibut = '连接失败,请检查apikey后重试'
						}
					},
				})			
				
			},
			sendMsg() {
				// 消息为空不做任何操作
				if (this.msg == "") {
					return 0;
				}
				if (this.msgLoad == true) {
					this.$u.toast('请先配置api再进行使用')
					return 0
				}
				this.sentext = '请求中'
				this.msgList.push({
					"msg": this.msg,
					"my": true
				})
				this.msgContent += ('YOU:' + this.msg + "\n")
				console.log(this.msgContent);
				this.msgLoad = true
				// 清除消息
				this.msg = ""
				let data = JSON.stringify({
					msg: this.msgContent,
					openaikey: this.api
				})
				uni.request({
					url:this.apiurl+'/message',
					data:data,
					method:'POST',
					success: (res) => {
						if (res.data.code == 200){
							let text = res.data.resmsg.replace("openai:", "").replace("openai:", "")
								.replace(/^\n|\n$/g, "")
							console.log(text);
							this.msgList.push({
								"msg": text,
								"my": false
							})
							this.msgContent += (text + "\n")
							this.msgLoad = false
							this.sentext = '发送'
						}else{
							this.apibut = '连接失败,请检查apikey后重试'
							this.apisucc = false
						}
					},
				})
			},
		}
	}
</script>

<style>
	.userinfo {
		animation: oneshow 0.8s ease 1;
		display: flex;
		flex-direction: column;
		align-items: flex-end;
		padding-right: 20rpx;
	}

	.usermsg {
		margin-left: 20rpx;
		padding: 17rpx 20rpx;
		border-radius: 35rpx;
	}

	.aiinfo {
		display: flex;
		flex-direction: row;
		align-items: center;
		margin-left: 20rpx;
		margin-top: 20rpx;
		animation: oneshow 0.8s ease 1;
	}

	.chat-img {
		border-radius: 50%;
		width: 100rpx;
		height: 100rpx;
		background-color: #f7f7f7;
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
	}

	.aimsg {
		display: flex;
		flex-direction: column;
		justify-content: center;
		margin-left: 20rpx;
		padding: 17rpx 20rpx;
	}

	.flex-column-center {
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		position: fixed;
		bottom: 0px;
		width: 100%;
	}

	.inpubut {
		display: flex;
		flex-direction: row;
		justify-content: space-around;
		align-items: center;
		background-color: #f9f9f9;
		width: 100%;
		height: 110rpx;
		font-size: 40rpx;
	}

	.dh-input {
		width: 90%;
		height: 80rpx;
		border-radius: 100rpx;
		padding-left: 40rpx;
		margin-left: 20rpx;

		background-color: #f0f0f0;
	}

	.my-neirong-sm {
		font-size: 23rpx;
		color: #616161;
	}

	.btn {
		height: 90rpx;
		width: 35%;
		background-color: cornflowerblue;
		color: #ffffff;
		border-radius: 2500px;

	}

	.popcls {
		width: 80vw;
		height: 40vh;
		background: white;
		border-radius: 20rpx;
		display: flex;
		flex-direction: column;
		justify-items: center;
		align-items: center;



	}
</style>

然后需要一个popup弹窗的组件
组件下载地址: popup组件下载
下载界面选择右侧这个导入项目
在这里插入图片描述
然后到现在,前端基本完事了。

开始弄后端的代码。

后端部署

先登录阿里云 阿里云官网
然后找到函数计算界面
在这里插入图片描述
进去之后新建应用
在这里插入图片描述
找到flask创建
在这里插入图片描述
然后选择直接部署,点击创建
在这里插入图片描述
创建之后点最下面的flask字样
在这里插入图片描述
出来的界面点这个函数代码
在这里插入图片描述右侧这里有一个上传zip包
在这里插入图片描述
弹出的上传对话框中把文件放上去

下载文件中有一个zip压缩包
在这里插入图片描述

之后应该是这个样子,这里的index.py就是主入口文件了

在这里插入图片描述
代码源码如下:

from flask import Flask,request
import requests
import json

app = Flask(__name__)


@app.route('/')
def hello_world():  # put application's code here
    
    return '在此输入apikey 示例:sk-s5S5BoVMLBD3btLsD'

@app.route('/message',methods = ['POST'])
def mess():
    sk = request.json.get('openaikey')
    msg = request.json.get('msg')
    print(sk,msg)
    req = requests.post('https://api.openai.com/v1/completions',
                        json={"prompt": msg, "max_tokens": 2048, "model": "text-davinci-003"}, headers={
            'content-type': 'application/json', 'Authorization': 'Bearer ' + sk})
    print(req.status_code)
    if req.status_code == 200:

        reqdic = json.loads(req.text)
        print(reqdic)
        aa = reqdic['choices'][0]['text']
        res = {
            "resmsg":aa,
            "code":200
        }
        return res
    else:
        reqdic = json.loads(req.text)
        err = reqdic['error']['message']
        res = {
            "resmsg":err,
            "code":412
        }
        return res


if __name__ == '__main__':
    app.run()

点击上方的部署代码
在这里插入图片描述

然后在界面的右侧有个url字样,点一下复制图标就复制下来了
在这里插入图片描述
复制下来的类似这样的域名:https://flask-web-frawork-gsq-vugsgvxsae.cn-hangzhou.fcapp.run

之后去到小程序的后台开发设置界面,这个填到接口请求域名的位置
然后在uniapp代码中第65行的位置,把这个域名复制进去
在这里插入图片描述
之后就是运行在这里插入图片描述

就是这个样子了:
在这里插入图片描述
点击下面配置apikey,然后配置之后会自动检测key是否准确,准确后就可以发送消息进行回复了
在这里插入图片描述

如果想要变现,就自己想办法加广告吧,比如加个次数,发送10次之后,弹出广告什么什么的,就看你们表现了
想要文件的记得叫我

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

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

相关文章

javassist学习

Java 字节码以二进制的形式存储在 .class 文件中&#xff0c;每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法&#xff0c;或者是修改已有的方法&#xff0c;并且不需要对字节码方面有深…

第29届中国国际广告节,酷开科技喜提三奖

第29届中国国际广告节&#xff0c;酷开科技喜提三奖 12月21日至12月23日&#xff0c;在风景如画的鹭岛厦门&#xff0c;第29届中国国际广告节于厦门国际会展中心隆重举行。经过几十年的高歌前行&#xff0c;中国国际广告节业已成为业界的盛会&#xff0c;更是中国广告业发展的…

(十)VUEElement

一、 VUE 1. 概述 Vue 是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。官网&#xff1a;https://cn.vuejs.org 2. 快速入门 &#…

CRM管理系统哪个好用?这五款CRM系统值得推荐

选择一款合适的CRM系统&#xff0c;可以有效解决企业生产经营中分散的数据、不规则的工作流程、缺乏客户服务、销售预测不准确、远程工作效率低、错误的客户沟通、几乎没有销售和市场合作、报告不足等方面的业务难题。 CRM系统的选型可以从以下方面考虑&#xff1a; 下面分享几…

Faster RCNN网络源码解读(Ⅺ) --- 预测结果后处理及预测过程(完结撒花)

目录 一、回顾以及本篇博客内容概述 二、代码解析 2.1 ROIHead类&#xff08;承接上篇博客的2.1节&#xff09; 2.1.1 初始化函数 __init__回顾 2.1.2 正向传播forward回顾及预测结果后处理 2.1.3 postprocess_detections 2.2 FasterRCNNBase类前向传播过程 2.3 Genera…

MySQL Workbench基本用法

MySQL Workbench相当于SQL语言的解释器 目录 1 打开 2 连接数据库 3 创建数据库 4 创建数据表 4.1 字段类型 4.2 字段选项 4.3 其他 5 操作表中的数据 5.1 添加 5.2 更改 5.3 删除 6 代码编辑器 7 保存sql代码 8 加载sql代码 1 打开 搜索MySQL …

滑动窗口题型

先看一个题目&#xff1a;题目描述 题目描述&#xff1a;给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 例如&#xff1a; 输入&#xff1a;s "ADOBECODE…

移动Web【rem、flexible、Less、vw / vh】

文章目录remflexibleLessvw / vhrem 网页效果 屏幕宽度不同&#xff0c;网页元素尺寸不同&#xff08;等比缩放&#xff09; px单位或百分比布局可以实现吗&#xff1f; px单位是绝对单位百分比布局特点宽度自适应&#xff0c;高度固定 适配方案 remvw / vh rem单位 相对单位…

Homekit智能家居DIY之智能通断开关

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

SQL SELECT DISTINCT 语句

SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

如何从零开始开发一个小程序

如何从零开始开发一个小程序开始申请账号开发设置开发工具新建小程序阅读文档模版语法项目架构开始编写基础语法wx:for循环wx:if判断页面导航自定义组件引用样式修改单行、多行省略flex布局grid布局发布开始 申请账号 小程序注册页 开发设置 登录 小程序后台 &#xff0c;…

【Vue2+Element ui通用后台】Mock.js

文章目录Mock.js首页数据调用mock数据并完成布局Mock.js Mock.js 官网 Mockjs Github地址 作用&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求 使用npm i mockjs进行安装&#xff0c;然后在 api 下新建 mock.js import Mock from mockjs// 定义mock请求拦截 Mock.mock…

【CPU是如何执行程序的?】

CPU是如何执行程序的&#xff1f;1、、硬件结构介绍1.1、CPU1.2、内存1.3、总线1.4、输入/输出设备二、程序执行的基本过程三、a11执行的详细过程现代计算机的基本结构为五个部分&#xff1a;CPU、内存、总线、输入/输出设备。或许你了解了这些概念&#xff0c;但是你知道a11在…

leetcode每日一题(python)2023-1.2 1801. 积压订单中的订单总数 (middle)

leetcode每日一题 &#x1f6a9; 学如逆水行舟&#xff0c;不进则退。 —— 《增广贤文》 题目描述&#xff1a; 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [price(i), amount(i), orderType(i)] 表示有 amount(i)( )笔类型为 orderType(i) 、价格为 pric…

没错,这是2023年开篇!!

不知不觉小G和Gopher们一起相伴着又走过了一个年头&#xff0c;迎来了2023年。回望这一年我们有遗憾&#xff1a;因疫情的原因没能和大家在线下2022 GopherChina大会相聚一堂我们也有快乐与成就&#xff1a;在经过一番调查、统计、分析后发布了《2022 Q2 GO开发者问卷调查结果》…

阿里、京东、百度“激战”互联网医疗

与衣食住行一样&#xff0c;医疗需求同样对人们的生存具有重要意义。医疗行业经过多年的发展&#xff0c;也已经发生了翻天覆地的变化。除了线下医疗日益完善之外&#xff0c;互联网医疗也随着互联网的飞速发展而实现了快速起飞。现如今&#xff0c;互联网医疗已经逐步成为了线…

沿全尺寸模型水平轴 MHK 涡轮机(DOE RM1)叶片性能表征计算(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 该存储库包括 MATLAB 脚本和输入文件示例&#xff0c;用于沿全尺寸模型水平轴 MHK 涡轮机叶片计算 3D AOA、CL 和 CD。该脚本是…

idea插件代码生成工具EasyCode

idea插件代码生成工具EasyCode1. EasyCode下载安装2. EasyCode配置模板2.1 配置路径2.2 配置文件2.2.1. controller.java2.2.2. entity.java2.2.3. mapper.java2.2.4. service.java2.2.5. serviceImpl.java2.2.6. mapper.xml3. 构建SpringBoot项目3.1 初始化数据库3.2 创建项目…

git push -u origin master报错(vscode)

Missing or invalid credentials. Error: connect ECONNREFUSED /run/user/1000/vscode-git-e10c66c0ac.sock at PipeConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) { errno: -111, code: ‘ECONNREFUSED’, syscall: ‘connect’, address: ‘/run/user/1000/…

Docker 镜像仓库的构建与镜像管理

目录 Docker 私有仓库 1. 简介 2. 构建 Docker 私有仓库 &#xff08;1&#xff09;部署环境 &#xff08;2&#xff09;服务端部署 &#xff08;3&#xff09;客户端配置 &#xff08;4&#xff09;私有镜像仓库测试 Dockerfile 1. 概述 2. Dockerfile 的组成 3. D…