ChatGPT Dingtalk

[![Auth](https://img.shields.io/badge/Auth-eryajf-ff69b4)](https://github.com/eryajf) [![Go Version](https://img.shields.io/github/go-mod/go-version/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk) [![GitHub Pull Requests](https://img.shields.io/github/issues-pr/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/pulls) [![GitHub Pull Requests](https://img.shields.io/github/stars/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/stargazers) [![HitCount](https://views.whatilearened.today/views/github/eryajf/chatgpt-dingtalk.svg)](https://github.com/eryajf/chatgpt-dingtalk) [![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/eryajf/chatgpt-dingtalk)](https://hub.docker.com/r/eryajf/chatgpt-dingtalk) [![Docker Pulls](https://img.shields.io/docker/pulls/eryajf/chatgpt-dingtalk)](https://hub.docker.com/r/eryajf/chatgpt-dingtalk) [![GitHub license](https://img.shields.io/github/license/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/blob/main/LICENSE)

🌉 在钉钉群聊中添加ChatGPT机器人 🌉


**目录** - [前言](#%E5%89%8D%E8%A8%80) - [功能简介](#%E5%8A%9F%E8%83%BD%E7%AE%80%E4%BB%8B) - [使用前提](#%E4%BD%BF%E7%94%A8%E5%89%8D%E6%8F%90) - [使用教程](#%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B) - [第一步,先创建机器人](#%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%85%88%E5%88%9B%E5%BB%BA%E6%9C%BA%E5%99%A8%E4%BA%BA) - [第二步,部署应用](#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E9%83%A8%E7%BD%B2%E5%BA%94%E7%94%A8) - [亮点特色](#%E4%BA%AE%E7%82%B9%E7%89%B9%E8%89%B2) - [与机器人单聊](#%E4%B8%8E%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8D%95%E8%81%8A) - [帮助列表](#%E5%B8%AE%E5%8A%A9%E5%88%97%E8%A1%A8) - [切换模式](#%E5%88%87%E6%8D%A2%E6%A8%A1%E5%BC%8F) - [查询余额](#%E6%9F%A5%E8%AF%A2%E4%BD%99%E9%A2%9D) - [日常问题](#%E6%97%A5%E5%B8%B8%E9%97%AE%E9%A2%98) - [通过内置prompt聊天](#%E9%80%9A%E8%BF%87%E5%86%85%E7%BD%AEprompt%E8%81%8A%E5%A4%A9) - [生成图片](#%E7%94%9F%E6%88%90%E5%9B%BE%E7%89%87) - [本地开发](#%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91) - [配置文件说明](#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E) - [常见问题](#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) - [高光时刻](#%E9%AB%98%E5%85%89%E6%97%B6%E5%88%BB) - [赞赏](#%E8%B5%9E%E8%B5%8F) ## 前言 本项目可以助你将GPT机器人集成到钉钉群聊当中。当前默认模型为 gpt-3.5。 > 🥳 **欢迎关注我的其他开源项目:** > > - [Go-Ldap-Admin](https://github.com/eryajf/go-ldap-admin):🌉 基于Go+Vue实现的openLDAP后台管理项目。 > - [learning-weekly](https://github.com/eryajf/learning-weekly):📝 周刊内容以运维技术和Go语言周边为主,辅以GitHub上优秀项目或他人优秀经验。 > - [HowToStartOpenSource](https://github.com/eryajf/HowToStartOpenSource):🌈 GitHub开源项目维护协同指南。 > - [read-list](https://github.com/eryajf/read-list):📖 优质内容订阅,阅读方为根本 > - [awesome-github-profile-readme-chinese](https://github.com/eryajf/awesome-github-profile-readme-chinese):🦩 优秀的中文区个人主页搜集 🚜 我还创建了一个项目[awesome-chatgpt-answer](https://github.com/eryajf/awesome-chatgpt-answer):记录那些问得好,答得妙的时刻,欢迎提交你与ChatGPT交互过程中遇到的那些精妙对话。 ⚗️ openai官方提供了一个[状态页](https://status.openai.com/)来呈现当前openAI服务的状态,同时如果有问题发布公告也会在这个页面,如果你感觉它有问题了,可以在这个页面看看。 ## 功能简介 - 支持在钉钉群聊中添加机器人,通过@机器人进行聊天交互。 - 提问支持单聊与串聊两种模式,通过@机器人发关键字切换。 - 支持添加代理,通过配置化指定。 - 支持自定义api域名,通过配置化指定。 - 支持自定义指定的模型,通过配置化指定。 - 支持自定义默认的聊天模式,通过配置化指定。 - 支持自定义单个用户单日对话次数,通过配置化指定。 - 支持生成图片,通过发送 `#图片`关键字开头的内容进行生成。 - 支持通过内置prompt进行对话。欢迎提交你认为不错的prompt,请通过编辑[此文件](https://github.com/eryajf/chatgpt-dingtalk/blob/main/prompt.yml)来提交PR。 ## 使用前提 * 有Openai账号,并且创建好`api_key`,注册相关事项可以参考[此文章](https://juejin.cn/post/7173447848292253704) 。访问[这里](https://beta.openai.com/account/api-keys),申请个人秘钥。 * 在钉钉开发者后台创建机器人,配置应用程序回调。 ## 使用教程 ### 第一步,先创建机器人 创建步骤参考文档:[企业内部开发机器人](https://open.dingtalk.com/document/robots/enterprise-created-chatbot),或者根据如下步骤进行配置。 1. 创建机器人。 ![image_20221209_163616](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20221209_163616.png) > `📢 注意1:`可能现在创建机器人的时候名字为`chatgpt`会被钉钉限制,请用其他名字命名。 > `📢 注意2:`第四步骤点击创建应用的时候,务必选择使用旧版,从而创建旧版机器人。 步骤比较简单,这里就不赘述了。 2. 配置机器人回调接口。 ![image_20221209_163652](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20221209_163652.png) 创建完毕之后,点击机器人开发管理,然后配置将要部署的服务所在服务器的出口IP,以及将要给服务配置的域名。 3. 发布机器人。 ![image_20221209_163709](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20221209_163709.png) 点击版本管理与发布,然后点击上线,这个时候就能在钉钉的群里中添加这个机器人了。 4. 群聊添加机器人。 ![image_20221209_163724](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20221209_163724.png) ### 第二步,部署应用 你可以使用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://host.docker.internal:15732" -e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e SERVICE_URL="你当前服务外网可访问的URL" --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest ``` `📢 注意:`如果使用docker部署,那么proxy地址可以直接使用如上方式部署,`host.docker.internal`会指向容器所在宿主机的IP,只需要更改端口为你的代理端口即可。参见:[Docker容器如何优雅地访问宿主机网络](https://wiki.eryajf.net/pages/674f53/) 运行命令中映射的配置文件参考下边的配置文件说明。 ``` 第二种:基于配置文件挂载运行 # 复制配置文件,根据自己实际情况,调整配置里的内容 $ 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代理本服务: ```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://localhost:8090; } } ``` 部署完成之后,就可以在群里艾特机器人进行体验了。 Nginx配置完毕之后,可以先手动请求一下,通过服务日志输出判断服务是否正常可用: ```sh $ curl --location --request POST 'http://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中的[压缩包](https://github.com/eryajf/chatgpt-dingtalk/releases) ,请根据自己系统以及架构选择合适的压缩包,下载之后直接解压运行。 下载之后,在本地解压,即可看到可执行程序,与配置文件: ```sh $ 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 # 然后根据情况调整配置文件内容 $ ./chatgpt-dingtalk # 直接运行 # 如果要守护在后台运行 $ nohup ./chatgpt-dingtalk &> run.log & $ tail -f run.log ``` ## 亮点特色 ### 与机器人单聊 `2023-03-08`补充,我发现也可以不在群里艾特机器人聊天,还可点击机器人,然后点击发消息,通过与机器人直接对话进行聊天: > 由 [@Raytow](https://github.com/Raytow) 同学发现,在机器人自动生成的测试群里无法直接私聊机器人,在其他群里单独添加这个机器人,然后再点击就可以跟它私聊了。 ![image](https://user-images.githubusercontent.com/33259379/223607306-2ac836a2-7ce5-4a12-a16e-bec40b22d8d6.png) ### 帮助列表 > 艾特机器人发送空内容或者帮助,会返回帮助列表。 ![image_20230216_221253](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230216_221253.png) ### 切换模式 > 发送指定关键字,可以切换不同的模式。 ![image_20230215_184655](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230215_184655.png) > 📢 注意:串聊模式下,群里每个人的聊天上下文是独立的。 > 📢 注意:默认对话模式为单聊,因此不必发送单聊即可进入单聊模式,而要进入串聊,则需要发送串聊关键字进行切换,当串聊内容超过最大限制的时候,你可以发送重置,然后再次进入串聊模式。 ### 查询余额 > 艾特机器人发送 `余额` 二字,会返回当前key对应的账号的剩余额度以及可用日期。 ![image_20230304_222522](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230304_222522.jpg) ### 日常问题 ![image_20221209_163739](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20221209_163739.png) ### 通过内置prompt聊天 > 发送模板两个字,会返回当前内置支持的prompt列表。 ![image_20230323_152703](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230323_152703.jpg) > 如果你发现有比较优秀的prompt,欢迎PR。注意:一些与钉钉使用场景不是很匹配的,就不要提交了。 ### 生成图片 > 发送以 `#图片`开头的内容,将会触发绘画能力,图片生成之后,将会保存在程序根目录下的`images目录`下。 > > 如果你绘图没有思路,可以在[这里 https://www.clickprompt.org/zh-CN/](https://www.clickprompt.org/zh-CN/)以及[这里 https://lexica.art/](https://lexica.art/)找到一些不错的prompt。 ![image_20230323_150547](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230323_150547.jpg) ## 本地开发 ```sh # 获取项目 $ git clone https://github.com/eryajf/chatgpt-dingtalk.git # 进入项目目录 $ cd chatgpt-dingtalk # 复制配置文件,根据个人实际情况进行配置 $ cp config.dev.json config.json # 启动项目 $ go run main.go ``` ## 配置文件说明 ```json { "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,即不限制 "service_url": "" // 指定服务的地址,就是当前服务可供外网访问的地址,用于生成图片时给钉钉渲染 } ``` ## 常见问题 如何更好地使用ChatGPT:这里有[许多案例](https://github.com/f/awesome-chatgpt-prompts)可供参考。 `🗣 重要重要` 一些常见的问题,我单独开issue放在这里:[👉点我👈](https://github.com/eryajf/chatgpt-dingtalk/issues/44),可以查看这里辅助你解决问题,如果里边没有,请对历史issue进行搜索(不要提交重复的issue),也欢迎大家补充。 ## 高光时刻 > 本项目曾在 | [2022-12-12](https://github.com/bonfy/github-trending/blob/master/2022/2022-12-12.md#go) | [2022-12-18](https://github.com/bonfy/github-trending/blob/master/2022/2022-12-18.md#go) | [2022-12-19](https://github.com/bonfy/github-trending/blob/master/2022/2022-12-19.md#go) | [2022-12-20](https://github.com/bonfy/github-trending/blob/master/2022/2022-12-20.md#go) | [2023-02-09](https://github.com/bonfy/github-trending/blob/master/2023-02-09.md#go) | [2023-02-10](https://github.com/bonfy/github-trending/blob/master/2023-02-10.md#go) | [2023-02-11](https://github.com/bonfy/github-trending/blob/master/2023-02-11.md#go) | [2023-02-12](https://github.com/bonfy/github-trending/blob/master/2023-02-12.md#go) | [2023-02-13](https://github.com/bonfy/github-trending/blob/master/2023-02-13.md#go) | [2023-02-14](https://github.com/bonfy/github-trending/blob/master/2023-02-14.md#go) | [2023-02-15](https://github.com/bonfy/github-trending/blob/master/2023-02-15.md#go) | [2023-03-04](https://github.com/bonfy/github-trending/blob/master/2023-03-04.md#go) | [2023-03-05](https://github.com/bonfy/github-trending/blob/master/2023-03-05.md#go) | [2023-03-19](https://github.com/bonfy/github-trending/blob/master/2023-03-19.md#go) | [2023-03-22](https://github.com/bonfy/github-trending/blob/master/2023-03-22.md#go) | [2023-03-23](https://github.com/bonfy/github-trending/blob/master/2023-03-23.md#go), 这些天里,登上GitHub Trending。而且还在持续登榜中,可见最近openai的热度。 > ![image_20230316_114915](https://cdn.staticaly.com/gh/eryajf/tu/main/img/image_20230316_114915.jpg) ## 赞赏 如果觉得这个项目对你有帮助,你可以请作者[喝杯咖啡 ☕️](https://wiki.eryajf.net/reward/)