【分享】(暂已失效)Real-Coze-API, 也许是目前响应较快的Coze API

前言:

02/29更新:
现在暂时不能用了
​ 作者回复:“2/27测试,Coze开始校验前端url中的_signature,疑似Coze官方开始察觉异常流量
Coze的Signature包含了对url和body的签名,逆向可能还需要一段时间。”
​ 详见: 发送消息失败:We’ve detected unusual traffic from your network, so Coze is temporarily unavailable. · Issue #5 · CrazyCreativeDream/Real-Coze-API (github.com)

​ 今晚在群里看到赢驷佬的分享,迫不及待地部署试了一下,响应速度不错。于是水此一贴,同时想冲个2级,奉上部署流程~

项目链接:Real-Coze-API (喜欢的话希望可以给作者点个star)

亮点(作者原话):

​ 通过Coze原有PlayGround的API,逆向前端脚本,模拟请求,以实现将Coze的API暴露出来的功能。

流式效果:

role参数定义:

1: 机器人Assistant

2: 用户```User``

6: 知识库Knowledge

作者原话: 可能0为系统system身份,但是你可以直接在网页中预设里设置,不需要在ChatHistory中设置。ChatHistory最后一项的role最好是2用户,否则会出现奇怪的问题。

==============================================================================

部署流程:

本贴介绍的是本地部署,作者还支持部署到CloudFlareWorker,参见: 如何部署到CloudFlare

1. git clone 到本地

https://github.com/CrazyCreativeDream/Real-Coze-API.git

2. 准备环境配置.env

将项目根目录下的.example.env拷贝并重命名为.env(也是放在根目录)

非大陆地区需要配置代理,需要注意的是代理类型仅支持socks

3. 获取sessionid

进入Coze官网并登录后,F12进入开发者模式

应用/Application选项卡,于左侧菜单选择Cookie,在名称列中找到并选择sessionid,从下面的Cookie Value栏复制出你的id

最后,把值赋给项目根目录下.env文件中的session_id变量

具体如下图所示:

4. 下载Coze机器人配置

打开Coze机器人的配置页面(也就是发布机器人前添加各种插件的那个页面,Url类似: https://www.coze.com/space/一串数字/bot/一串数字)

靠,写到这的时候本来想截个图,结果上去就提示Our services are not available in your country or region,挂全局/无痕都进不去,不知道搞什么鬼。所以此处没有截图了,抱歉

F12进入开发者模式,把以下代码复制到控制台并按下回车(也可以使用作者的油猴脚本DownloadBotConfig.user.js)

(async function () {
    'use strict';
    if(!location.pathname.match(/\/space\/\d+\/bot\/\d+/g)) return;
    await new Promise((resolve) => {
        const interval = setInterval(() => {
            if (Object.values(document.querySelectorAll('span')).filter((span) => span.innerText === 'Publish')[0]) {
                clearInterval(interval)
                resolve()
            }
        }, 1000)
    })
    const PublishButtonSpan = Object.values(document.querySelectorAll('span')).filter((span) => span.innerText === 'Publish')[0]
    const PublishButton = PublishButtonSpan.parentElement
    const SaveButtonSpan = PublishButtonSpan.cloneNode(true)
    const SaveButton = PublishButton.cloneNode(true)
    SaveButtonSpan.innerText = 'Download'
    SaveButton.innerHTML = ''
    SaveButton.appendChild(SaveButtonSpan)
    PublishButton.parentElement.appendChild(SaveButton)
    const download = (content) => {
        const a = document.createElement('a')
        const blob = new Blob([content], { type: 'text/plain' })
        a.href = URL.createObjectURL(blob)
        a.download = 'config.json'
        a.click()
    }
    SaveButton.addEventListener('click', () => {
        const originSend = XMLHttpRequest.prototype.send
        XMLHttpRequest.prototype.send = function (body) {
            if (this._url === '/api/draftbot/update') {
                const data = JSON.parse(body)
                download(JSON.stringify(data, null, 4))
                XMLHttpRequest.prototype.send = originSend
            } else {
                return originSend.apply(this, arguments)
            }
        }

        setTimeout(() => {
            PublishButton.click()
        }, 1000);
    })

})();

之后视线回到页面,正常情况左上角 最右边会多出一个Download的按钮(如下图所示)

微信图片_20240225015504

如果使用的是油猴脚本,没看见按钮的话刷新一下页面就出来了

点击Download按钮,提示下载机器人配置config.json,放至项目根目录即可

5. 安装依赖

进入项目根目录,运行:

npm install

6. 运行(两种模式)

Command(命令行)模式:
npm run command
Server(API)模式:
npm run server

服务端口为项目根目录.env文件中的server_port变量,默认为8080

非流式请求url : http://127.0.0.1:8080

流式请求url: http://127.0.0.1:8080/?stream=true

对于流式请求的响应,作者有所说明:

continuefalse时,content内容可能不完整

根据作者的示例代码,可以"}"号作分割,再格式化为json取出内容

以上流程已经尽可能详细了,如有不便之处还望多包涵。
佬友们可以直接甩本贴link带你们的朋友一起造吧~

15 Likes

非常可以

思路不错,赞

谢谢佬分享,待会儿试试

这个好 但是貌似只支持文本消息

1 Like

very good

值得一提的是,coze本地的playground的限制次数很少

1 Like

学习一下

25 Likes

:cow::beer:

:+1:可以可以

学习

次数比机器人少多了

学习

学习一下

真不错!

26 Likes

部署到cf workers之后,能用vercel serverless去请求使用吗

真棒棒。

看看:eyes:

学习

抱歉 我还没试过部署到cfworker