最近ChatGPT非常火爆,听说要干掉程序员,写程序有嘴就行剩下的交给AI,作为程序员的我立马跳起来,打开搜索款,就是一顿劈里啪啦,我得看看究竟是何方神圣,竟然抢我饭碗。
映入眼帘的是这样一个场景。
瓦特?不让用!好家伙,这对于程序员来说不是事,立马化身米国人,就这么进来了,小Case嘛,谷歌账号登入,一顿操作猛如虎,最后卡在了手机号上,国内的用不了,最终靠机智解决手机号的问题,顺利的进来了。然后开心的用了起来,确实厉害,也确实震惊到我这个CV工程师了。既然这么厉害,就用你来出苦力了。脑海中有了绝妙的idea,就差一个程序员了,巧了么不是,刚好我就是程序员!决定用api搞点事情,搞个小程序用AI造福一下大众,调试的过程中发现频率有限制。这怎么玩,这不是逼我注册多个账号搞轮询吗?注册太麻烦了,那就求助万能的淘宝了。搞了10个号,开心的玩耍了起来。开心是开心,但不多,没几天我那一批号全被封了。我整个人都麻了,一顿操作等于白搭,网传可能是服务器ip的问题,轮询的问题,绑的黑卡,账号注册的问题,反正就是各种猜,没人知道具体原因,我也懒得知道了。痛失一笔巨款啊,我的账号费我的服务器费。为了保证我小程序的正常服务,我只能看看国内有没有这种api服务,让他们去封装好,我直接调就完了,还真让我找到了。确实好用,我都忍不住想分享给大家。
api非常齐全,费用也非常感人,Chatgpt一次调用0.4金币,1块对应1000金币,我滴妈简直不要钱。除了chatgpt还有其他的图像,音频,各种接口。这里我就不说了,文下有链接。闲聊结束了开始上硬货了,整合代码如下。
const axios = require('axios');
const crypto = require('crypto');
// 密钥信息获取与帮助文档:https://www.aigcaas.cn/article/16.html
const secret_id = '<请替换为自己的密钥信息: SecretId>' // 密钥信息
const secret_key = '<请替换为自己的密钥信息: SecretKey>' // 密钥信息
const application_name = 'chatgpt_chat' // 应用名称
const api_name = 'chat_com' // 接口名称
// 请求地址
const url = `https://api.aigcaas.cn/product/${application_name}/api/${api_name}`
// 构建请求头
const timestamp = Math.round(new Date() / 1000);
const nonce = 10000 + Math.round(Math.random() * 90000);
const hash = crypto.createHash('sha256');
hash.update(`${timestamp}${secret_key}${nonce}`);
const token = hash.digest('hex');
const headers = {
'SecretID': secret_id,
'Nonce': nonce,
'Token': token,
'Timestamp': timestamp,
'Content-Type': 'application/json'
}
// 构建请求 body
const data = {
"messages": ""
};
// 获取响应
axios({
method: 'post',
url: url,
headers: headers,
data : JSON.stringify(data),
})
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});
// 如果是流式响应,可以参考以下代码
// const response = await axios.post(url, {
// headers: headers,
// data : JSON.stringify(data),
// responseType: 'stream'
// });
//
// const stream = response.data
// stream.on('data', data => {
// data = data.toString()
// console.log(data)
// })
支持json和流式返回。文档中还有python和golang的具体可以去网站查看。我这里使用的云平台式laf,简直是前端开发的福音,3分钟你就会爱上他(文末有地址)也是目前为止我知道的唯一一个支持websocket的云开发平台。在微信小程序上面实现了流式返回的就是基于websocket,下面有小程序的码,欢迎体验,感受一下文字在你面前跳动的感觉。
具体的socket代码,laf的文档很详细,我这里简单写一下
import cloud from '@lafjs/cloud'
export async function main(ctx: FunctionContext) {
// 初始化 websocket user Map 列表
// 也可用数据库保存,本示例代码用的 Laf 云函数的全局缓存
let wsMap = cloud.shared.get("wsMap") // 获取 wsMap
if(!wsMap){
wsMap = new Map()
cloud.shared.set("wsMap", wsMap) // 设置 wsMap
}
// websocket 连接成功
if (ctx.method === "WebSocket:connection") {
const userId = generateUserId()
wsMap = cloud.shared.get("wsMap") // 获取 wsMap
wsMap.set(userId, ctx.socket);
cloud.shared.set("wsMap", wsMap) // 设置 wsMap
ctx.socket.send("连接成功,你的 userID 是:"+userId);
}
// websocket 消息事件
if (ctx.method === "WebSocket:message") {
const { data } = ctx.params;
//在这一块调用aigcaas的接口,并通过ctx.socket.send返回给小程序
console.log("接收到的信息:",data.toString());
const userId = getKeyByValue(wsMap, ctx.socket);
ctx.socket.send("服务端已接收到消息事件,你的 userID 是:"+userId);
}
// websocket 关闭消息
if (ctx.method === "WebSocket:close") {
wsMap = cloud.shared.get("wsMap") // 获取 wsMap
const userId = getKeyByValue(wsMap, ctx.socket);
wsMap.delete(userId);
cloud.shared.set("wsMap", wsMap) // 设置 wsMap
ctx.socket.send("服务端已接收到关闭事件消息,你的 userID 是:"+userId);
}
}
// 生成随机用户 ID
function generateUserId() {
return Math.random().toString(36).substring(2, 15);
}
// 遍历 userID
function getKeyByValue(map, value) {
for (const [key, val] of map.entries()) {
if (val === value) {
return key;
}
}
}
具体代码可以自己去调试一下,laf可以创建免费一个月的服务。
我的基于ChatGPT的小程序——AI麻瓜
API网站:
https://www.aigcaas.cn/index.html
laf 云开发
https://laf.run/