Skip to content

dumpmemory/chatgpt-dingtalk

 
 

Repository files navigation

ChatGPT Dingtalk

Auth Go Version GitHub Pull Requests GitHub Pull Requests HitCount Docker Image Size (latest by date) Docker Pulls GitHub license

🌉 基于GO语言实现的钉钉集成ChatGPT机器人 🌉


目录

前言

本项目可以助你将GPT机器人集成到钉钉群聊当中。当前默认模型为 gpt-3.5。

🥳 欢迎关注我的其他开源项目:

🚜 我还创建了一个项目awesome-chatgpt-answer:记录那些问得好,答得妙的时刻,欢迎提交你与ChatGPT交互过程中遇到的那些精妙对话。

⚗️ openai官方提供了一个状态页来呈现当前openAI服务的状态,同时如果有问题发布公告也会在这个页面,如果你感觉它有问题了,可以在这个页面看看。

功能介绍

  • 🚀 帮助菜单:通过发送 帮助 将看到帮助列表,🖼 查看示例
  • 🥷 私聊:支持与机器人单独私聊(无需艾特),🖼 查看示例
  • 💬 群聊:支持在群里艾特机器人进行对话
  • 🙋 单聊模式:每次对话都是一次新的对话,没有历史聊天上下文联系
  • 🗣 串聊模式:带上下文理解的对话模式
  • 🎨 图片生成:通过发送 #图片关键字开头的内容进行生成图片,🖼 查看示例
  • 🎭 角色扮演:支持场景模式,通过 #周报 的方式触发内置prompt模板 🖼 查看示例
  • 🧑‍💻 频率限制:通过配置指定,自定义单个用户单日最大对话次数
  • 💵 余额查询:通过发送 余额 关键字查询当前key所剩额度,🖼 查看示例
  • 🔗 自定义api域名:通过配置指定,解决国内服务器无法直接访问openai的问题
  • 🪜 添加代理:通过配置指定,通过给应用注入代理解决国内服务器无法访问的问题
  • 👐 默认模式:支持自定义默认的聊天模式,通过配置化指定

使用前提

  • 有Openai账号,并且创建好api_key,注册相关事项可以参考此文章 。访问这里,申请个人秘钥。
  • 在钉钉开发者后台创建机器人,配置应用程序回调。

使用教程

第一步,创建机器人

方案一:outgoing类型机器人

钉钉群内的机器人有一个outgoing模式,当你创建机器人的时候,可以选择启用这个模式,然后直接配置回调地址,免去在管理后台创建应用的步骤,就可以直接投入使用。

官方文档:自定义机器人接入

但是这个模式貌似是部分开放的(目前来看貌似是部分人有创建这个类型的白名单),所以如果你在钉钉群聊中添加自定义机器人的时候,看到和我一样的信息,则说明无法使用这种方式:

image_20230325_162017

📢 注意

  • 如果你的和我一样,那么就只能放弃这种方案,往下看第二种对接方案。
  • 如果使用这种方案,那么就不能与机器人私聊对话,只能局限在群聊当中艾特机器人聊天。
  • 如果使用这种方案,则在群聊当中并不能达到真正的艾特发消息人的效果,因为这种机器人回调过来的关键信息为空。

方案二:企业内部应用

创建步骤参考文档:企业内部开发机器人,或者根据如下步骤进行配置。

  1. 创建机器人。 image_20221209_163616

    📢 注意1:可能现在创建机器人的时候名字为chatgpt会被钉钉限制,请用其他名字命名。 📢 注意2:第四步骤点击创建应用的时候,务必选择使用旧版,从而创建旧版机器人。

    步骤比较简单,这里就不赘述了。

  2. 配置机器人回调接口。 image_20221209_163652

    创建完毕之后,点击机器人开发管理,然后配置将要部署的服务所在服务器的出口IP,以及将要给服务配置的域名。

如果提示: 消息接收地址校验失败(请确保公网可访问该地址,如无有效SSL证书,可选择禁用证书校验),那么可以先输入一个https://,然后就能看到禁用https的选项了,选择禁用,然后再把地址改成http就好了。

  1. 发布机器人。 image_20221209_163709

    点击版本管理与发布,然后点击上线,这个时候就能在钉钉的群里中添加这个机器人了。

  2. 群聊添加机器人。

    image_20221209_163724

第二步,部署应用

docker部署

你可以使用docker快速运行本项目。

第一种:基于环境变量运行
# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090 --add-host="host.docker.internal:host-gateway" -e APIKEY=换成你的key -e BASE_URL="" -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http:https://host.docker.internal:15732" -e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e PORT=8090 -e SERVICE_URL="你当前服务外网可访问的URL" --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest

📢 注意:如果使用docker部署,那么PORT参数不需要进行任何调整。 📢 注意:如果服务器节点本身就在国外或者自定义了BASE_URL,那么就把HTTP_PROXY参数留空即可。 📢 注意:如果使用docker部署,那么proxy地址可以直接使用如上方式部署,host.docker.internal会指向容器所在宿主机的IP,只需要更改端口为你的代理端口即可。参见:Docker容器如何优雅地访问宿主机网络

运行命令中映射的配置文件参考下边的配置文件说明。

第二种:基于配置文件挂载运行
# 复制配置文件,根据自己实际情况,调整配置里的内容
$ cp config.dev.json config.json  # 其中 config.dev.json 从项目的根目录获取

# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090  -v `pwd`/config.json:/app/config.json --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest

其中配置文件参考下边的配置文件说明。

第三种:使用 docker compose 运行
$ wget https://raw.githubusercontent.com/eryajf/chatgpt-dingtalk/main/docker-compose.yml

$ nano docker-compose.yml # 编辑 APIKEY 等信息

$ docker compose up -d

注意,不论通过上边哪种docker方式部署,都需要配置Nginx代理,当然你直接通过服务器外网IP也可以。

部署完成之后,通过Nginx代理本服务:

server {
    listen       80;
    server_name  chat.eryajf.net;

    client_header_timeout 120s;
    client_body_timeout 120s;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http:https://localhost:8090;
    }
}

部署完成之后,就可以在群里艾特机器人进行体验了。

Nginx配置完毕之后,可以先手动请求一下,通过服务日志输出判断服务是否正常可用:

$ curl --location --request POST 'http:https://chat.eryajf.net/' \
  --header 'Content-type: application/json' \
  --data-raw '{
    "conversationId": "xxx",
    "atUsers": [
        {
            "dingtalkId": "xxx",
            "staffId":"xxx"
        }
    ],
    "chatbotCorpId": "dinge8a565xxxx",
    "chatbotUserId": "$:LWCP_v1:$Cxxxxx",
    "msgId": "msg0xxxxx",
    "senderNick": "eryajf",
    "isAdmin": true,
    "senderStaffId": "user123",
    "sessionWebhookExpiredTime": 1613635652738,
    "createAt": 1613630252678,
    "senderCorpId": "dinge8a565xxxx",
    "conversationType": "2",
    "senderId": "$:LWCP_v1:$Ff09GIxxxxx",
    "conversationTitle": "机器人测试-TEST",
    "isInAtList": true,
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx",
    "text": {
        "content": " 你好"
    },
    "msgtype": "text"
}'

如果手动请求没有问题,那么就可以在钉钉群里与机器人进行对话了。

二进制部署

如果你想通过命令行直接部署,可以直接下载release中的压缩包 ,请根据自己系统以及架构选择合适的压缩包,下载之后直接解压运行。

下载之后,在本地解压,即可看到可执行程序,与配置文件:

$ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz
$ cd chatgpt-dingtalk-v0.0.4-darwin-arm64
$ cp config.dev.json  config.json # 然后根据情况调整配置文件内容,宿主机如遇端口冲突,可通过调整config.json中的port参数自定义服务端口
$ ./chatgpt-dingtalk  # 直接运行

# 如果要守护在后台运行
$ nohup ./chatgpt-dingtalk &> run.log &
$ tail -f run.log

亮点特色

与机器人私聊

2023-03-08补充,我发现也可以不在群里艾特机器人聊天,还可点击机器人,然后点击发消息,通过与机器人直接对话进行聊天:

@Raytow 同学发现,在机器人自动生成的测试群里无法直接私聊机器人,在其他群里单独添加这个机器人,然后再点击就可以跟它私聊了。

image

帮助列表

艾特机器人发送空内容或者帮助,会返回帮助列表。

image_20230216_221253

切换模式

发送指定关键字,可以切换不同的模式。

image_20230215_184655

📢 注意:串聊模式下,群里每个人的聊天上下文是独立的。 📢 注意:默认对话模式为单聊,因此不必发送单聊即可进入单聊模式,而要进入串聊,则需要发送串聊关键字进行切换,当串聊内容超过最大限制的时候,你可以发送重置,然后再次进入串聊模式。

查询余额

艾特机器人发送 余额 二字,会返回当前key对应的账号的剩余额度以及可用日期。

image_20230304_222522

日常问题

image_20221209_163739

通过内置prompt聊天

发送模板两个字,会返回当前内置支持的prompt列表。

image_20230323_152703

如果你发现有比较优秀的prompt,欢迎PR。注意:一些与钉钉使用场景不是很匹配的,就不要提交了。

生成图片

发送以 #图片开头的内容,将会触发绘画能力,图片生成之后,将会保存在程序根目录下的images目录下。

如果你绘图没有思路,可以在这里 https://www.clickprompt.org/zh-CN/以及这里 https://lexica.art/找到一些不错的prompt。

image_20230323_150547

本地开发

# 获取项目
$ git clone https://github.com/eryajf/chatgpt-dingtalk.git

# 进入项目目录
$ cd chatgpt-dingtalk

# 复制配置文件,根据个人实际情况进行配置
$ cp config.dev.json config.json

# 启动项目
$ go run main.go

配置文件说明

{
    "api_key": "xxxxxxxxx",   // openai api_key
    "base_url": "api.openai.com", //  如果你想指定请求url的地址,可通过这个参数进行配置,默认为官方地址,不需要再添加 /v1
    "model": "gpt-3.5-turbo", // 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-32k-0314", "gpt-4-32k", "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-0301", "gpt-3.5-turbo", "text-davinci-003", "text-davinci-002", "text-curie-001", "text-babbage-001", "text-ada-001", "text-davinci-001", "davinci-instruct-beta", "davinci", "curie-instruct-beta", "curie", "ada", "babbage"
    "session_timeout": 600,   // 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
    "http_proxy": "",         // 指定请求时使用的代理,如果为空,则不使用代理
    "default_mode": "单聊",    // 默认对话模式,可根据实际场景自定义,如果不设置,默认为单聊
    "max_request": 0,    // 单人单日请求次数限制,默认为0,即不限制
    "port": "8090",     // 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用。
    "service_url": "" // 指定服务的地址,就是当前服务可供外网访问的地址,用于生成图片时给钉钉渲染
}

常见问题

如何更好地使用ChatGPT:这里有许多案例可供参考。

🗣 重要重要 一些常见的问题,我单独开issue放在这里:👉点我👈,可以查看这里辅助你解决问题,如果里边没有,请对历史issue进行搜索(不要提交重复的issue),也欢迎大家补充。

感谢

这个项目能够成立,离不开这些开源项目:

赞赏

如果觉得这个项目对你有帮助,你可以请作者喝杯咖啡 ☕️

高光时刻

本项目曾在 | 2022-12-12 | 2022-12-18 | 2022-12-19 | 2022-12-20 | 2023-02-09 | 2023-02-10 | 2023-02-11 | 2023-02-12 | 2023-02-13 | 2023-02-14 | 2023-02-15 | 2023-03-04 | 2023-03-05 | 2023-03-19 | 2023-03-22 | 2023-03-25 | 2023-03-26, 这些天里,登上GitHub Trending。而且还在持续登榜中,可见最近openai的热度。 image_20230316_114915

贡献者列表

dumpmemory
Null
eryajf
二丫讲梵
luoxufeiyan
Hugh Gao
iblogc
Iblogc
WinMin
Swing
laorange
辣橙

About

ChatGPT机器人在钉钉群聊中交互

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 97.8%
  • Dockerfile 1.3%
  • Makefile 0.9%