标题: 谁能帮虎绿林写个使用ChatGPT API的机器人
时间: 2023-03-08发布,2023-03-08修改
编程语言不限,需要实现用户隔离(不同用户拥有不同会话),不需要实现模型选择(固定为gpt-3.5-turbo模型即可),也不需要设置prompt。
我可以提供测试key(内信我,我发给你)。
和虎绿林网站交互的部分可以参考我的js代码:
https://github.com/hu60t/hu60wap6/blob/master/src/tpl/jhin/js/chatgpt/chatgpt.js#L933
https://gitee.com/hu60t/hu60wap6/blob/master/src/tpl/jhin/js/chatgpt/chatgpt.js#L933
5楼和6楼有关于技术方案的建议。
『回复列表(30|隐藏机器人聊天)』
最简单的技术方案是把我的 chatgpt.js (基于浏览器)改写成 nodejs 版。这样就不需要重写和虎绿林交互的部分,只需要把和网页交互的部分(sendRequest
和readReply
函数)替换成和ChatGPT API交互即可。ChatGPT API应该可以直接返回markdown格式文本,所以你就完全不需要引入用于html转markdown的外部js库。
当然如果你的PHP很好,并且熟悉虎绿林程序,也可以写一个直接连接虎绿林数据库进行操作的版本。如果你决定用PHP写,就可以直接调用虎绿林提供的@消息
、聊天室和论坛操作函数。
如果你不想轮询数据库,还可以参考这个微信推送服务,它通过连接 ali canal 服务获取实时@消息
推送。
https://github.com/hu60t/hu60wap6/blob/master/src/service/wechat-push.php
我想用Go
来实现一个守护进程。是不是用到以下3个 API就够了?
@消息
APIhttps://hu60.cn/q.php/<sid>/msg.index.@.no.json?_origin=*&_json=compact&_content=json
https://api.openai.com/v1/chat/completions
https://hu60.cn/q.php/bbs.newreply.<topicId>.json
https://hu60.cn/q.php/addin.chat.<chatName>.json
@cherrydra,你还需要登录(获取sid)和读取帖子内容。从 msg.index.@.no.json?_content=json
里得到的JSON格式很难转换为纯文本,所以最方便的方法是用readTopicContent
再读取一次纯文本。
或者如果你不想多次读取,还可以使用msg.index.@.no.json?_content=text
直接获取纯文本的消息,但这样一来你就需要用正则表达式去解析纯文本中的回复地址,类似这样:
"@Curtion 在 帖子“ChatGPT机器人的切换会话功能丢失”的16楼 https://hu60.cn/q.php/bbs.topic.104616.json?floor=16#16 @你:\n\n@老虎会游泳,会话功能回来了,据说是因为对部分功能实时维护做的临时改动\r\n红米K30 Pro(变焦版)"
读取帖子内容:
// 读取帖子内容
async function readTopicContent(path) {
let url = hu60BaseUrl + path.replace('{$BID}', 'json')
.replace(/#.*$/s, '') // 去掉锚链接
.replace(
/\?|$/s, // 注意主题帖的@链接不含问号
'?_origin=*&_json=compact&_content=text&pageSize=1&'
);
let response = await fetch(url);
return await response.json();
}
登录:
// 登录虎绿林
async function login(relogin) {
let formData = new FormData();
formData.append('type', '1'); // 用户名登录
formData.append('name', localStorage.hu60User);
formData.append('pass', localStorage.hu60Pwd);
formData.append('go', '1');
let response = await fetch(hu60Url + 'user.login.json?_origin=*&_json=compact', {
body: formData,
method: "post",
redirect: "manual" // 不自动重定向
});
let result = await response.json();
if (!result.success) {
throw result.notice;
}
hu60BaseUrl = hu60Url + result.sid + '/';
}
@胡椒舰长,不过我们确实可以把 https://github.com/hu60t/hu60wap6/blob/master/src/service/wechat-push.php 改造一下,让它使用stream_socket_send发送到websocket服务推送。