{"id":9695181,"url":"https://github.com/eryajf/ChatGPT-DingTalk","last_synced_at":"2025-08-26T06:31:42.975Z","repository":{"id":64489593,"uuid":"576072728","full_name":"eryajf/chatgpt-dingtalk","owner":"eryajf","description":"🎒 钉钉 \u0026 🤖 GPT-3.5 让你的工作效率直接起飞 🚀 私聊群聊方式、单聊串聊模式、角色扮演、图片创作 🚀","archived":false,"fork":false,"pushed_at":"2024-11-26T15:12:13.000Z","size":430,"stargazers_count":2111,"open_issues_count":25,"forks_count":386,"subscribers_count":22,"default_branch":"main","last_synced_at":"2024-12-22T06:18:58.637Z","etag":null,"topics":["chatgpt","chatgpt-api","connect-ai","dingtalk","dingtalk-robot","go","go-gpt","golang","openai"],"latest_commit_sha":null,"homepage":"https://wiki.eryajf.net","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eryajf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://wiki.eryajf.net/reward/"]}},"created_at":"2022-12-09T00:15:23.000Z","updated_at":"2024-12-17T10:36:00.000Z","dependencies_parsed_at":"2024-12-13T09:03:33.410Z","dependency_job_id":"5712b759-3678-4a24-ba25-3ef609f32eea","html_url":"https://github.com/eryajf/chatgpt-dingtalk","commit_stats":{"total_commits":267,"total_committers":21,"mean_commits":"12.714285714285714","dds":"0.43071161048689144","last_synced_commit":"fcef5d62a3ef3f47ad418aee122fac580bf17c41"},"previous_names":["eryajf/chatgpt-dingtalk","eryajf/dingtalk-openai","connectai-e/dingtalk-openai"],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eryajf%2Fchatgpt-dingtalk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eryajf%2Fchatgpt-dingtalk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eryajf%2Fchatgpt-dingtalk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eryajf%2Fchatgpt-dingtalk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eryajf","download_url":"https://codeload.github.com/eryajf/chatgpt-dingtalk/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231011326,"owners_count":18314773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatgpt","chatgpt-api","connect-ai","dingtalk","dingtalk-robot","go","go-gpt","golang","openai"],"created_at":"2024-05-15T12:02:07.570Z","updated_at":"2025-08-26T06:31:42.960Z","avatar_url":"https://github.com/eryajf.png","language":"Go","funding_links":["https://wiki.eryajf.net/reward/"],"categories":["Go"],"sub_categories":[],"readme":"\u003cp align='center'\u003e\n\u003cbr\u003e\n    🚀 ChatGPT DingTalk 🚀\n\u003c/p\u003e\n\n\u003cp align='center'\u003e🌉 基于GO语言实现的钉钉集成ChatGPT机器人 🌉\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Auth](https://img.shields.io/badge/Auth-eryajf-ff69b4)](https://github.com/eryajf)\n[![Go Version](https://img.shields.io/github/go-mod/go-version/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk)\n[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/pulls)\n[![GitHub Pull Requests](https://img.shields.io/github/stars/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/stargazers)\n[![HitCount](https://views.whatilearened.today/views/github/eryajf/chatgpt-dingtalk.svg)](https://github.com/eryajf/chatgpt-dingtalk)\n[![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/eryajf/chatgpt-dingtalk)](https://hub.docker.com/r/eryajf/chatgpt-dingtalk)\n[![Docker Pulls](https://img.shields.io/docker/pulls/eryajf/chatgpt-dingtalk)](https://hub.docker.com/r/eryajf/chatgpt-dingtalk)\n[![GitHub license](https://img.shields.io/github/license/eryajf/chatgpt-dingtalk)](https://github.com/eryajf/chatgpt-dingtalk/blob/main/LICENSE)\n\n\u003c/div\u003e\n\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\"\nwidth=\"800\"  height=\"3\"\u003e\n\n\u003c/div\u003e\u003cbr\u003e\n\n\u003ca href='https://wiki.eryajf.net' target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n    \u003cimg src='https://user-images.githubusercontent.com/33259379/223607306-2ac836a2-7ce5-4a12-a16e-bec40b22d8d6.png' alt='' /\u003e\n\u003c/a\u003e\n\n---\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n**目录**\n\n- [前言](#%E5%89%8D%E8%A8%80)\n- [功能介绍](#%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D)\n- [使用前提](#%E4%BD%BF%E7%94%A8%E5%89%8D%E6%8F%90)\n- [使用教程](#%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B)\n  - [第一步，部署应用](#%E7%AC%AC%E4%B8%80%E6%AD%A5%E9%83%A8%E7%BD%B2%E5%BA%94%E7%94%A8)\n    - [docker 部署](#docker-%E9%83%A8%E7%BD%B2)\n    - [二进制部署](#%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2)\n  - [第二步，添加应用](#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E6%B7%BB%E5%8A%A0%E5%BA%94%E7%94%A8)\n- [亮点特色](#%E4%BA%AE%E7%82%B9%E7%89%B9%E8%89%B2)\n  - [与机器人私聊](#%E4%B8%8E%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%A7%81%E8%81%8A)\n  - [帮助列表](#%E5%B8%AE%E5%8A%A9%E5%88%97%E8%A1%A8)\n  - [切换模式](#%E5%88%87%E6%8D%A2%E6%A8%A1%E5%BC%8F)\n  - [查询余额](#%E6%9F%A5%E8%AF%A2%E4%BD%99%E9%A2%9D)\n  - [日常问题](#%E6%97%A5%E5%B8%B8%E9%97%AE%E9%A2%98)\n  - [通过内置 prompt 聊天](#%E9%80%9A%E8%BF%87%E5%86%85%E7%BD%AE-prompt-%E8%81%8A%E5%A4%A9)\n  - [生成图片](#%E7%94%9F%E6%88%90%E5%9B%BE%E7%89%87)\n  - [支持 gpt-4](#%E6%94%AF%E6%8C%81-gpt-4)\n- [本地开发](#%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91)\n- [配置文件说明](#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E)\n- [常见问题](#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)\n- [进群交流](#%E8%BF%9B%E7%BE%A4%E4%BA%A4%E6%B5%81)\n- [感谢](#%E6%84%9F%E8%B0%A2)\n- [赞赏](#%E8%B5%9E%E8%B5%8F)\n- [高光时刻](#%E9%AB%98%E5%85%89%E6%97%B6%E5%88%BB)\n- [Star 历史](#star-%E5%8E%86%E5%8F%B2)\n- [贡献者列表](#%E8%B4%A1%E7%8C%AE%E8%80%85%E5%88%97%E8%A1%A8)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## 前言\n\n本项目可以助你将 GPT 机器人集成到钉钉群聊当中。当前默认模型为`gpt-3.5`，支持`gpt-4`以及`gpt-4o-mini`。同时支持 Azure-OpenAI。\n\n\u003e - `📢 注意`：当下部署以及配置流程都已非常成熟，文档和 issue 中基本都覆盖到了，因此不再回答任何项目安装部署与配置使用上的问题，如果完全不懂，可考虑通过 **[邮箱](mailto:eryajf@163.com)** 联系我进行付费的技术支持。\n\u003e\n\u003e - `📢 注意`：这个项目所有的功能，都汇聚在[使用指南](./docs/userGuide.md)中，请务必仔细阅读，以体验其完整精髓。\n\n🥳 **欢迎关注我的其他开源项目：**\n\n\u003e - [Go-Ldap-Admin](https://github.com/eryajf/go-ldap-admin)：🌉 基于 Go+Vue 实现的 openLDAP 后台管理项目。\n\u003e - [learning-weekly](https://github.com/eryajf/learning-weekly)：📝 周刊内容以运维技术和 Go 语言周边为主，辅以 GitHub 上优秀项目或他人优秀经验。\n\u003e - [HowToStartOpenSource](https://github.com/eryajf/HowToStartOpenSource)：🌈 GitHub 开源项目维护协同指南。\n\u003e - [read-list](https://github.com/eryajf/read-list)：📖 优质内容订阅，阅读方为根本\n\u003e - [awesome-github-profile-readme-chinese](https://github.com/eryajf/awesome-github-profile-readme-chinese)：🦩 优秀的中文区个人主页搜集\n\n🚜 我还创建了一个项目 **[awesome-chatgpt-answer](https://github.com/eryajf/awesome-chatgpt-answer)** ：记录那些问得好，答得妙的时刻，欢迎提交你与 ChatGPT 交互过程中遇到的那些精妙对话。\n\n⚗️ openai 官方提供了一个 **[状态页](https://status.openai.com/)** 来呈现当前 openAI 服务的状态，同时如果有问题发布公告也会在这个页面，如果你感觉它有问题了，可以在这个页面看看。\n\n**赞助商**\n\n[![](https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20241231_214509.webp)](https://gpt302.saaslink.net/fGvlvo/)\n\n\u003e [302.AI](https://gpt302.saaslink.net/fGvlvo) 是一个按需付费的一站式企业级AI应用平台，开放平台，开源生态。\n\u003e\n\u003e - [点击注册](https://gpt302.saaslink.net/fGvlvo): 立即获得 1PTC(1PTC=1 美金，约为 7 人民币)代币。\n\u003e - 集合了最新最全的AI模型和品牌，包括但不限于语言模型、图像模型、声音模型、视频模型。\n\u003e - 在基础模型上进行深度应用开发，做到让小白用户都可以零门槛上手使用，无需学习成本。\n\u003e - 零月费，所有功能按需付费，全面开放，做到真正的门槛低，上限高。\n\u003e - 创新的使用模式，管理和使用分离，面向团队和中小企业，一人管理，多人使用。\n\u003e - 所有AI能力均提供API接入，所有应用开源支持自行定制（进行中）。\n\u003e - 强大的开发团队，每周推出2-3个新应用，平台功能每日更新。\n\n## 功能介绍\n\n- 🚀 帮助菜单：通过发送 `帮助` 将看到帮助列表，[🖼 查看示例](#%E5%B8%AE%E5%8A%A9%E5%88%97%E8%A1%A8)\n- 🥷 私聊：支持与机器人单独私聊(无需艾特)，[🖼 查看示例](#%E4%B8%8E%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%A7%81%E8%81%8A)\n- 💬 群聊：支持在群里艾特机器人进行对话\n- 🙋 单聊模式：每次对话都是一次新的对话，没有历史聊天上下文联系\n- 🗣 串聊模式：带上下文理解的对话模式\n- 🎨 图片生成：通过发送 `#图片`关键字开头的内容进行生成图片，[🖼 查看示例](#%E7%94%9F%E6%88%90%E5%9B%BE%E7%89%87)\n- 🎭 角色扮演：支持场景模式，通过 `#周报` 的方式触发内置 prompt 模板 [🖼 查看示例](#%E9%80%9A%E8%BF%87%E5%86%85%E7%BD%AEprompt%E8%81%8A%E5%A4%A9)\n- 🧑‍💻 频率限制：通过配置指定，自定义单个用户单日最大对话次数\n- 💵 余额查询：通过发送 `余额` 关键字查询当前 key 所剩额度，[🖼 查看示例](#%E6%9F%A5%E8%AF%A2%E4%BD%99%E9%A2%9D)\n- 🔗 自定义 api 域名：通过配置指定，解决国内服务器无法直接访问 openai 的问题\n- 🪜 添加代理：通过配置指定，通过给应用注入代理解决国内服务器无法访问的问题\n- 👐 默认模式：支持自定义默认的聊天模式，通过配置化指定\n- 📝 查询对话：通过发送`#查对话 username:xxx`查询 xxx 的对话历史，可在线预览，可下载到本地\n- 👹 白名单机制：通过配置指定，支持指定群组名称和用户名称作为白名单，从而实现可控范围与机器人对话\n- 💂‍♀️ 管理员机制：通过配置指定管理员，部分敏感操作，以及一些应用配置，管理员有权限进行操作\n- ㊙️ 敏感词过滤：通过配置指定敏感词，提问时触发，则不允许提问，回答的内容中触发，则以 🚫 代替\n- 🚇 stream 模式：指定钉钉的 stream 模式，目前钉钉已全量开放该功能，项目也默认以此模式启动\n\n## 使用前提\n\n- 有 Openai 账号，并且创建好`api_key`，注册相关事项可以参考[此文章](https://juejin.cn/post/7173447848292253704) 。访问[这里](https://beta.openai.com/account/api-keys)，申请个人秘钥。\n- 在钉钉开发者后台创建应用，在应用的消息推送功能块添加机器人，将消息接收模式指定为 stream 模式。\n\n## 使用教程\n\n### 第一步，部署应用\n\n#### docker 部署\n\n推荐你使用 docker 快速运行本项目。\n\n```\n第一种：基于环境变量运行\n# 运行项目\n$ docker run -itd --name chatgpt -p 8090:8090 \\\n  -v ./data:/app/data --add-host=\"host.docker.internal:host-gateway\" \\\n  -e LOG_LEVEL=\"info\" -e APIKEY=换成你的key -e BASE_URL=\"\" \\\n  -e MODEL=\"gpt-3.5-turbo\" -e SESSION_TIMEOUT=600 \\\n  -e MAX_QUESTION_LENL=2048 -e MAX_ANSWER_LEN=2048 -e MAX_TEXT=4096 \\\n  -e HTTP_PROXY=\"http://host.docker.internal:15732\" \\\n  -e DEFAULT_MODE=\"单聊\" -e MAX_REQUEST=0 -e PORT=8090 \\\n  -e SERVICE_URL=\"你当前服务外网可访问的URL\" -e CHAT_TYPE=\"0\" \\\n  -e ALLOW_GROUPS=a,b -e ALLOW_OUTGOING_GROUPS=a,b -e ALLOW_USERS=a,b -e DENY_USERS=a,b -e VIP_USERS=a,b -e ADMIN_USERS=a,b -e APP_SECRETS=\"xxx,yyy\" \\\n  -e SENSITIVE_WORDS=\"aa,bb\" -e RUN_MODE=\"http\" \\\n  -e AZURE_ON=\"false\" -e AZURE_API_VERSION=\"\" -e AZURE_RESOURCE_NAME=\"\" \\\n  -e AZURE_DEPLOYMENT_NAME=\"\" -e AZURE_OPENAI_TOKEN=\"\" \\\n  -e DINGTALK_CREDENTIALS=\"your_client_id1:secret1,your_client_id2:secret2\" \\\n  -e HELP=\"欢迎使用本工具\\n\\n你可以查看：[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)\\n\\n这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/)\n  ，觉得不错你可以来波素质三连.\"  \\\n  --restart=always  registry.cn-hangzhou.aliyuncs.com/eryajf/chatgpt-dingtalk\n```\n\n\u003e 运行命令中映射的配置文件参考下边的[配置文件说明](#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E)。\n\n- `📢 注意：`如果使用 docker 部署，那么 PORT 参数不需要进行任何调整。\n- `📢 注意：`ALLOW_GROUPS,ALLOW_USERS,DENY_USERS,VIP_USERS,ADMIN_USERS 参数为数组，如果需要指定多个，可用英文逗号分割。outgoing 机器人模式下这些参数无效。\n- `📢 注意：`如果服务器节点本身就在国外或者自定义了`BASE_URL`，那么就把`HTTP_PROXY`参数留空即可。\n- `📢 注意：`如果使用 docker 部署，那么 proxy 地址可以直接使用如上方式部署，`host.docker.internal`会指向容器所在宿主机的 IP，只需要更改端口为你的代理端口即可。参见：[Docker 容器如何优雅地访问宿主机网络](https://wiki.eryajf.net/pages/674f53/)\n\n```\n第二种：基于配置文件挂载运行\n# 复制配置文件，根据自己实际情况，调整配置里的内容\n$ cp config.example.yml config.yml  # 其中 config.example.yml 从项目的根目录获取\n\n# 运行项目\n$ docker run -itd --name chatgpt -p 8090:8090  -v `pwd`/config.yml:/app/config.yml --restart=always  registry.cn-hangzhou.aliyuncs.com/eryajf/chatgpt-dingtalk\n```\n\n其中配置文件参考下边的配置文件说明。\n\n```\n第三种：使用 docker compose 运行\n$ wget https://raw.githubusercontent.com/eryajf/chatgpt-dingtalk/main/docker-compose.yml\n\n$ vim docker-compose.yml # 编辑 APIKEY 等信息\n\n$ docker compose up -d\n```\n\n之前部署完成之后还有一个配置 Nginx 的步骤，现在将模式默认指定为 stream 模式，因此不再需要配置 Nginx。\n\n#### 二进制部署\n\n如果你想通过命令行直接部署，可以直接下载 release 中的[压缩包](https://github.com/eryajf/chatgpt-dingtalk/releases) ，请根据自己系统以及架构选择合适的压缩包，下载之后直接解压运行。\n\n下载之后，在本地解压，即可看到可执行程序，与配置文件：\n\n```sh\n$ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz\n$ cd chatgpt-dingtalk-v0.0.4-darwin-arm64\n$ cp config.example.yml  config.yml\n$ ./chatgpt-dingtalk  # 直接运行\n\n# 如果要守护在后台运行\n$ nohup ./chatgpt-dingtalk \u0026\u003e run.log \u0026\n$ tail -f run.log\n```\n\n### 第二步，添加应用\n\n钉钉官方在 2023 年 5 月份全面推出了 stream 模式，因此这里也推荐大家直接使用这个模式，其他 HTTP 的仍旧支持，只不过不再深入研究，因此下边的文档也以 stream 模式的配置流程来介绍。\n\n创建步骤参考文档：[企业内部应用](https://open.dingtalk.com/document/orgapp/create-orgapp)，或者根据如下步骤进行配置。\n\n1. 创建应用。\n    \u003cdetails\u003e\n      \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230604_192719.png\"\u003e\n    \u003c/details\u003e\n\n   \u003e `📢 注意：`可能现在创建机器人的时候名字为`chatgpt`会被钉钉限制，请用其他名字命名。\n\n   在`基础信息` --\u003e `应用信息`当中能够获取到机器人的`AppKey`和`AppSecret`。\n\n2. 配置机器人。\n\u003cdetails\u003e\n  \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n  \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230604_193103.png\"\u003e\n\u003c/details\u003e\n\n3. 发布机器人。\n    \u003cdetails\u003e\n      \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n      \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230604_193314.png\"\u003e\n    \u003c/details\u003e\n\n   点击`版本管理与发布`，然后点击`上线`，这个时候就能在钉钉的群里中添加这个机器人了。\n\n4. 群聊添加机器人。\n\u003cdetails\u003e\n  \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n  \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20221209_163724.png\"\u003e\n\u003c/details\u003e\n\n## 亮点特色\n\n### 与机器人私聊\n\n`2023-03-08`补充，我发现也可以不在群里艾特机器人聊天，还可点击机器人，然后点击发消息，通过与机器人直接对话进行聊天：\n\n\u003e 由 [@Raytow](https://github.com/Raytow) 同学发现，在机器人自动生成的测试群里无法直接私聊机器人，在其他群里单独添加这个机器人，然后再点击就可以跟它私聊了。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://user-images.githubusercontent.com/33259379/223607306-2ac836a2-7ce5-4a12-a16e-bec40b22d8d6.png\"\u003e\n\u003c/details\u003e\n\n### 帮助列表\n\n\u003e 艾特机器人发送空内容或者帮助，会返回帮助列表。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230216_221253.png\"\u003e\n\u003c/details\u003e\n\n### 切换模式\n\n\u003e 发送指定关键字，可以切换不同的模式。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230215_184655.png\"\u003e\n\u003c/details\u003e\n\n\u003e 📢 注意：串聊模式下，群里每个人的聊天上下文是独立的。\n\u003e 📢 注意：默认对话模式为单聊，因此不必发送单聊即可进入单聊模式，而要进入串聊，则需要发送串聊关键字进行切换，当串聊内容超过最大限制的时候，你可以发送重置，然后再次进入串聊模式。\n\n### 查询余额\n\n\u003e 艾特机器人发送 `余额` 二字，会返回当前 key 对应的账号的剩余额度以及可用日期。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230304_222522.jpg\"\u003e\n\u003c/details\u003e\n\n### 日常问题\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20221209_163739.png\"\u003e\n\u003c/details\u003e\n\n### 通过内置 prompt 聊天\n\n\u003e 发送模板两个字，会返回当前内置支持的 prompt 列表。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230323_152703.jpg\"\u003e\n\u003c/details\u003e\n\n\u003e 如果你发现有比较优秀的 prompt，欢迎 PR。注意：一些与钉钉使用场景不是很匹配的，就不要提交了。\n\n### 生成图片\n\n\u003e 发送以 `#图片`开头的内容，将会触发绘画能力，图片生成之后，将会保存在程序根目录下的`images目录`下。\n\u003e\n\u003e 如果你绘图没有思路，可以在[这里](https://www.clickprompt.org/zh-CN/)以及[这里](https://lexica.art/)找到一些不错的 prompt。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230323_150547.jpg\"\u003e\n\u003c/details\u003e\n\n### 支持 gpt-4\n\n如果你的账号通过了官方的白名单，那么可以将模型配置为：`gpt-4-0314`、`gpt-4`或`gpt-4o-mini`，目前 gpt-4 的余额查询以及图片生成功能暂不可用，可能是接口限制，也可能是其他原因，等我有条件的时候，会对这些功能进行测试验证。\n\n\u003e 以下是 gpt-3.5 与 gpt-4 对数学计算方面的区别。\n\n\u003cdetails\u003e\n    \u003csummary\u003e🖼 点我查看示例图\u003c/summary\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230330_180308.jpg\"\u003e\n\u003c/details\u003e\n\n感谢[@PIRANHACHAN](https://github.com/PIRANHACHAN)同学提供的 gpt-4 的 key，使得项目在 gpt-4 的对接上能够进行验证测试，达到了可用状态。\n\n## 本地开发\n\n```sh\n# 获取项目\n$ git clone https://github.com/eryajf/chatgpt-dingtalk.git\n\n# 进入项目目录\n$ cd chatgpt-dingtalk\n\n# 复制配置文件，根据个人实际情况进行配置\n$ cp config.example.yml config.yml\n\n# 启动项目\n$ go run main.go\n```\n\n## 配置文件说明\n\n```yaml\n# 应用的日志级别，info or debug\nlog_level: \"info\"\n# 运行模式，http 或者 stream ，强烈建议你使用stream模式，通过此链接了解：https://open.dingtalk.com/document/isvapp/stream\nrun_mode: \"stream\"\n# openai api_key,如果你是用的是azure，则该配置项可以留空或者直接忽略\napi_key: \"xxxxxxxxx\"\n# 如果你使用官方的接口地址 https://api.openai.com，则留空即可，如果你想指定请求url的地址，可通过这个参数进行配置，注意需要带上 http 协议，如果你是用的是azure，则该配置项可以留空或者直接忽略\nbase_url: \"\"\n# 指定模型，默认为 gpt-3.5-turbo , 可选参数有： \"gpt-4-32k-0613\", \"gpt-4-32k-0314\", \"gpt-4-32k\", \"gpt-4-0613\", \"gpt-4-0314\", \"gpt-4\", \"gpt-3.5-turbo-16k-0613\", \"gpt-3.5-turbo-16k\", \"gpt-3.5-turbo-0613\", \"gpt-3.5-turbo-0301\", \"gpt-3.5-turbo\"，如果使用gpt-4，请确认自己是否有接口调用白名单，如果你是用的是azure，则该配置项可以留空或者直接忽略\nmodel: \"gpt-3.5-turbo\"\n# 指定绘画模型，默认为 dall-e-2 , 可选参数有：\"dall-e-2\"， \"dall-e-3\"\nimage_model: \"dall-e-2\"\n# 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文\nsession_timeout: 600\n# 最大问题长度\nmax_question_len: 2048\n# 最大回答长度\nmax_answer_len: 2048\n# 最大上下文文本长度，通常该参数可设置为与模型Token限制相同\nmax_text: 4096\n# 指定请求时使用的代理，如果为空，则不使用代理，注意需要带上 http 协议 或 socks5 协议，如果你是用的是azure，则该配置项可以留空或者直接忽略\nhttp_proxy: \"\"\n# 指定默认的对话模式，可根据实际需求进行自定义，如果不设置，默认为单聊，即无上下文关联的对话模式\ndefault_mode: \"单聊\"\n# 单人单日请求次数上限，默认为0，即不限制\nmax_request: 0\n# 指定服务启动端口，默认为 8090，一般在二进制宿主机部署时，遇到端口冲突时使用，如果run_mode为stream模式，则可以忽略该配置项\nport: \"8090\"\n# 指定服务的地址，就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址)，用于生成图片时给钉钉做渲染，最新版本中将图片上传到了钉钉服务器，理论上你可以忽略该配置项，如果run_mode为stream模式，则可以忽略该配置项\nservice_url: \"http://xxxxxx\"\n# 限定对话类型 0：不限 1：只能单聊 2：只能群聊\nchat_type: \"0\"\n# 哪些群组可以进行对话（仅在chat_type为0、2时有效），如果留空，则表示允许所有群组，如果要限制，则列表中写群ID（ConversationID）\n# 群ID，可在群组中 @机器人 群ID 来查看日志获取，例如日志会输出：[🙋 企业内部机器人 在『测试』群的ConversationID为: \"cidrabcdefgh1234567890AAAAA\"]，获取后可填写该参数并重启程序\nallow_groups: []\n# 哪些普通群（使用outgoing机器人）可以进行对话，如果留空，则表示允许所有群组，如果要限制，则列表中写群ID（ConversationID）\n# 群ID，可在群组中 @机器人 群ID 来查看日志获取，例如日志会输出：[🙋 outgoing机器人 在『测试』群的ConversationID为: \"cidrabcdefgh1234567890AAAAA\"]，获取后可填写该参数并重启程序\n# 如果不想支持outgoing机器人功能，这里可以随意设置一个内部群组，例如：cidrabcdefgh1234567890AAAAA；或随意一个字符串，例如：disabled\n# 建议该功能默认关闭：除非你必须要用到outgoing机器人\nallow_outgoing_groups: []\n# 以下 allow_users、deny_users、vip_users、admin_users 配置中填写的是用户的userid，outgoing机器人模式下不适用这些配置\n# 比如 [\"1301691029702722\",\"1301691029702733\"]，这个信息需要在钉钉管理后台的通讯录当中获取：https://oa.dingtalk.com/contacts.htm#/contacts\n# 哪些用户可以进行对话，如果留空，则表示允许所有用户，如果要限制，则列表中写用户的userid\nallow_users: []\n# 哪些用户不可以进行对话，如果留空，则表示允许所有用户（如allow_user有配置，需满足相应条件），如果要限制，则列表中写用户的userid，黑名单优先级高于白名单\ndeny_users: []\n# 哪些用户可以进行无限对话，如果留空，则表示只允许管理员（如max_request配置为0，则允许所有人）\n# 如果要针对指定VIP用户放开限制（如max_request配置不为0），则列表中写用户的userid\nvip_users: []\n# 指定哪些人为此系统的管理员，如果留空，则表示没有人是管理员，如果要限制，则列表中写用户的userid\n# 注意：如果下边的app_secrets为空，以及使用outgoing的方式配置机器人，这两种情况下，都表示没有人是管理员\nadmin_users: []\n# 钉钉机器人在应用信息中的AppSecret，为了校验回调的请求是否合法，如果留空，将会忽略校验，则该接口将会存在其他人也能随意调用的安全隐患，因此强烈建议配置正确的secret，如果你的服务对接给多个机器人，这里可以配置多个机器人的secret\napp_secrets: []\n# 敏感词，提问时触发，则不允许提问，回答的内容中触发，则以 🚫 代替\nsensitive_words: []\n# 帮助信息，放在配置文件，可供自定义\nhelp: \"### 发送信息\\n\\n若您想给机器人发送信息，有如下两种方式：\\n\\n1. **群聊：** 在机器人所在群里 **@机器人** 后边跟着要提问的内容。\\n\\n2. **私聊：** 点击机器人的 **头像** 后，再点击 **发消息。** \\n\\n### 系统指令\\n\\n系统指令是一些特殊的词语，当您向机器人发送这些词语时，会触发对应的功能。\\n\\n**📢 注意：系统指令，即只发指令，没有特殊标识，也没有内容。**\\n\\n以下是系统指令详情：\\n\\n|    指令    |                     描述                     |                             示例                             |\\n| :--------: | :------------------------------------------: | :----------------------------------------------------------: |\\n|  **单聊**  | 每次对话都是一次新的对话，没有聊天上下文联系 | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **串聊**  |            带上下文联系的对话模式            | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **重置**  |        重置上下文模式，回归到默认模式        | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **余额**  |        查询机器人所用OpenAI账号的余额        | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230304_222522.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **模板**  |           查看应用内置的prompt模板           | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193827.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **图片**  |           查看如何根据提示生成图片           | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_194125.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n| **查对话** |            获取指定人员的对话历史            | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193938.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n|  **帮助**  |                 获取帮助信息                 | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202336.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n\\n\\n### 功能指令\\n\\n除去系统指令，还有一些功能指令，功能指令是直接与应用交互，达到交互目的的一种指令。\\n\\n**📢 注意：功能指令，一律以 #+关键字 为开头，通常需要在关键字后边加个空格，然后再写描述或参数。**\\n\\n以下是功能指令详情\\n\\n| 指令 | 说明 | 示例 |\\n| :--: | :--: | :--: |\\n|  **#图片**  |          根据提示咒语生成对应图片          | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230323_150547.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e |\\n| **#域名**     | 查询域名相关信息     |  \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202620.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#证书**     | 查询域名证书相关信息     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202706.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#Linux命令**     | 根据自然语言描述生成对应命令     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_214947.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#解释代码**     | 分析一段代码的功能或含义     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_215242.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#正则**     | 根据自然语言描述生成正则     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_220222.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#周报**     | 应用周报的prompt     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_214335.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n| **#生成sql**     | 根据自然语言描述生成sql语句     | \u003cdetails\u003e\u003cbr /\u003e\u003csummary\u003e预览\u003c/summary\u003e\u003cbr /\u003e\u003cimg src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_221325.jpg'\u003e\u003cbr /\u003e\u003c/details\u003e    |\\n\\n如上大多数能力，都是依赖prompt模板实现，如果你有更好的prompt，欢迎提交PR。\\n\\n### 友情提示\\n\\n使用 **串聊模式** 会显著加快机器人所用账号的余额消耗速度，因此，若无保留上下文的需求，建议使用 **单聊模式。** \\n\\n即使有保留上下文的需求，也应适时使用 **重置** 指令来重置上下文。\\n\\n### 项目地址\\n\\n本项目已在GitHub开源，[查看源代码](https://github.com/eryajf/chatgpt-dingtalk)。\"\n\n# Azure OpenAI 配置\n# 例如你的示例请求为： curl https://eryajf.openai.azure.com/openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-03-15-preview 那么对应配置如下，如果配置完成之后还是无法正常使用，请新建应用，重新配置回调试试看\nazure_on: false # 如果是true，则会走azure的openai接口\nazure_resource_name: \"eryajf\" # 对应你的主个性域名\nazure_deployment_name: \"gpt-35-turbo\" # 对应的是 /deployments/ 后边跟着的这个值\nazure_api_version: \"2023-03-15-preview\" # 对应的是请求中的 api-version 后边的值\nazure_openai_token: \"xxxxxxx\"\n\n# 钉钉应用鉴权凭据信息，支持多个应用。通过请求时候鉴权来识别是来自哪个机器人应用的消息\n# 设置credentials 之后，即具备了访问钉钉平台绝大部分 OpenAPI 的能力；例如上传图片到钉钉平台，提升图片体验，结合 Stream 模式简化服务部署\n# client_id 对应钉钉平台 AppKey/SuiteKey；client_secret 对应 AppSecret/SuiteSecret\ncredentials:\n  - client_id: \"put-your-client-id-here\"\n    client_secret: \"put-your-client-secret-here\"\n```\n\n## 常见问题\n\n如何更好地使用 ChatGPT：这里有[许多案例](https://github.com/f/awesome-chatgpt-prompts)可供参考。\n\n`🗣 重要重要` 一些常见的问题，我单独开 issue 放在这里：[👉 点我 👈](https://github.com/eryajf/chatgpt-dingtalk/issues/44)，可以查看这里辅助你解决问题，如果里边没有，请对历史 issue 进行搜索(不要提交重复的 issue)，也欢迎大家补充。\n\n## 进群交流\n\n我创建了一个钉钉的交流群，欢迎进群交流。\n\n![](https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230405_191425.jpg)\n\n## 感谢\n\n这个项目能够成立，离不开这些开源项目：\n\n- [go-resty/resty](https://github.com/go-resty/resty)\n- [patrickmn/go-cache](https://github.com/patrickmn/go-cache)\n- [solywsh/chatgpt](https://github.com/solywsh/chatgpt)\n- [xgfone/ship](https://github.com/xgfone/ship)\n- [avast/retry-go](https://github.com/avast/retry-go)\n- [sashabaranov/go-openapi](https://github.com/sashabaranov/go-openai)\n- [charmbracelet/log](https://github.com/charmbracelet/log)\n\n## 赞赏\n\n如果觉得这个项目对你有帮助，你可以请作者[喝杯咖啡 ☕️](https://wiki.eryajf.net/reward/)\n\n## 高光时刻\n\n\u003e 本项目曾在 | [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-25](https://github.com/bonfy/github-trending/blob/master/2023-03-25.md#go) | [2023-03-26](https://github.com/bonfy/github-trending/blob/master/2023-03-26.md#go) | [2023-03-27](https://github.com/bonfy/github-trending/blob/master/2023-03-27.md#go) | [2023-03-29](https://github.com/bonfy/github-trending/blob/master/2023-03-29.md#go), 这些天里，登上 GitHub Trending。而且还在持续登榜中，可见最近 openai 的热度。\n\u003e ![image_20230316_114915](https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230316_114915.jpg)\n\n## Star 历史\n\n[![Star History Chart](https://api.star-history.com/svg?repos=ConnectAI-E/Dingtalk-OpenAI\u0026type=Date)](https://star-history.com/#ConnectAI-E/Dingtalk-OpenAI\u0026Date)\n\n## 贡献者列表\n\n\u003cdiv align=\"center\"\u003e\n\u003c!-- readme: collaborators,contributors -start --\u003e\n\u003ctable\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/eryajf\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/33259379?v=4\" width=\"75;\" alt=\"eryajf\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003e二丫讲梵\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/Leizhenpeng\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/50035229?v=4\" width=\"75;\" alt=\"Leizhenpeng\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eRiverRay\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/DDMeaqua\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/110169811?v=4\" width=\"75;\" alt=\"DDMeaqua\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eNull\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/ffinly\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/29793346?v=4\" width=\"75;\" alt=\"ffinly\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eFinly\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/FrankCheungDev\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/22819074?v=4\" width=\"75;\" alt=\"FrankCheungDev\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eFrank Cheung\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/b3nguang\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/121670274?v=4\" width=\"75;\" alt=\"b3nguang\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003e本光\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/ronething\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/28869910?v=4\" width=\"75;\" alt=\"ronething\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eAshing Zheng\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/laorange\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/68316902?v=4\" width=\"75;\" alt=\"laorange\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003e辣橙\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/chzealot\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/22822?v=4\" width=\"75;\" alt=\"chzealot\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003e金喜@DingTalk\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/WinMin\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/18380453?v=4\" width=\"75;\" alt=\"WinMin\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eSwing\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/suyunkai\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/82149368?v=4\" width=\"75;\" alt=\"suyunkai\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eNull\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/stoneflying\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/38101022?v=4\" width=\"75;\" alt=\"stoneflying\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eStoneflying\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/cnmill\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/21098695?v=4\" width=\"75;\" alt=\"cnmill\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eMill Peng\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/little-huang\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/53588889?v=4\" width=\"75;\" alt=\"little-huang\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eLittle_huang\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/iblogc\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/3283023?v=4\" width=\"75;\" alt=\"iblogc\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eIblogc\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/wangbooth\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/18130585?v=4\" width=\"75;\" alt=\"wangbooth\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eWangBooth\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/fantasticmao\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/20675747?v=4\" width=\"75;\" alt=\"fantasticmao\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eMao Mao\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/luoxufeiyan\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/6621172?v=4\" width=\"75;\" alt=\"luoxufeiyan\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eHugh Gao\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n        \u003ca href=\"https://github.com/AydenLii\"\u003e\n            \u003cimg src=\"https://avatars.githubusercontent.com/u/90502440?v=4\" width=\"75;\" alt=\"AydenLii\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eAydenLii\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n    \u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\u003c!-- readme: collaborators,contributors -end --\u003e\n\u003c/div\u003e\n\n---\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feryajf%2FChatGPT-DingTalk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feryajf%2FChatGPT-DingTalk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feryajf%2FChatGPT-DingTalk/lists"}