ChatGPT Dingtalk

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

功能简介

支持在钉钉群聊中添加机器人,通过@机器人进行聊天交互。
提问支持单聊与串聊两种模式,通过@机器人发关键字切换。

使用前提

有Openai账号,并且创建好api_key,注册相关事项可以参考此文章 。访问这里,申请个人秘钥。


目录

前言

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

s="line">📢 注意:当下部署以及配置流程都已非常成熟,文档和issue中基本都覆盖到了,因此不再回答任何项目安装部署与配置使用上的问题,如果完全不懂,可考虑通过 邮箱 联系我进行付费的技术支持。

  • 📢 注意:这个项目所有的功能,都汇聚在使用指南中,请务必仔细阅读,以体验其完整精髓。

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

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

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

    功能介绍

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

    使用前提

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

    使用教程

    第一步,创建机器人

    方案一:outgoing类型机器人

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

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

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

    🖼 点我查看示例图

    📢 注意

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

    方案二:企业内部应用

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

    1. 创建机器人。

      🖼 点我查看示例图

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

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

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

      🖼 点我查看示例图

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

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

    3. 发布机器人。

      🖼 点我查看示例图

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

    4. 群聊添加机器人。

      🖼 点我查看示例图

    第二步,部署应用

    docker部署

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

    第一种:基于环境变量运行
    # 运行项目
    $ docker run -itd --name chatgpt -p 8090:8090 \
      -v ./data:/app/data --add-host="host.docker.internal:host-gateway" \
      -e LOG_LEVEL="info" -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 PORT=8090 \
      -e SERVICE_URL="你当前服务外网可访问的URL" -e CHAT_TYPE="0" \
      -e ALLOW_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" \
      -e AZURE_ON="false" -e AZURE_API_VERSION="" -e AZURE_RESOURCE_NAME="" \
      -e AZURE_DEPLOYMENT_NAME="" -e AZURE_OPENAI_TOKEN="" \
      -e HELP="欢迎使用本工具\n\n你可以查看:[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)\n\n这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/)
      ,觉得不错你可以来波素质三连."  \
      --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest

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

    • 📢 注意:如果使用docker部署,那么PORT参数不需要进行任何调整。
    • 📢 注意:ALLOW_GROUPS,ALLOW_USERS,DENY_USERS,VIP_USERS,ADMIN_USERS 参数为数组,如果需要指定多个,可用英文逗号分割。outgoing机器人模式下这些参数无效。
    • 📢 注意:如果服务器节点本身就在国外或者自定义了BASE_URL,那么就把HTTP_PROXY参数留空即可。
    • 📢 注意:如果使用docker部署,那么proxy地址可以直接使用如上方式部署,host.docker.internal会指向容器所在宿主机的IP,只需要更改端口为你的代理端口即可。参见:Docker容器如何优雅地访问宿主机网络
    第二种:基于配置文件挂载运行
    # 复制配置文件,根据自己实际情况,调整配置里的内容
    $ cp config.example.yml config.yml  # 其中 config.example.yml 从项目的根目录获取
    
    # 运行项目
    $ docker run -itd --name chatgpt -p 8090:8090  -v `pwd`/config.yml:/app/config.yml --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

    部署完成之后,通过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代理步骤是个可选步骤,你也可以直接通过服务器外网IP:PORT作为回调地址。

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

    $ curl --location --request POST 'http://chat.eryajf.net/' \
      --header 'Content-type: application/json' \
      -d '{
        "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"
    }'

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

    📢 注意: 如果配置文件中app_secret不为空,那么这里curl请求将会校验失败,理论上只要服务能够正常被访问,那么直接在钉钉管理后台配置回调就可以了,如果想通过curl进行调试,则注意需把对应配置项留空。

    二进制部署

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

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

    $ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz
    $ cd chatgpt-dingtalk-v0.0.4-darwin-arm64
    $ cp config.example.yml  config.yml # 然后根据情况调整配置文件内容,宿主机如遇端口冲突,可通过调整config.yml中的port参数自定义服务端口
    $ ./chatgpt-dingtalk  # 直接运行
    
    # 如果要守护在后台运行
    $ nohup ./chatgpt-dingtalk &> run.log &
    $ tail -f run.log

    亮点特色

    与机器人私聊

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

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

    🖼 点我查看示例图

    帮助列表

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

    🖼 点我查看示例图

    切换模式

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

    🖼 点我查看示例图

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

    查询余额

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

    🖼 点我查看示例图

    日常问题

    🖼 点我查看示例图

    通过内置prompt聊天

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

    🖼 点我查看示例图

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

    生成图片

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

    如果你绘图没有思路,可以在这里以及这里找到一些不错的prompt。

    🖼 点我查看示例图

    支持 gpt-4

    如果你的账号通过了官方的白名单,那么可以将模型配置为:gpt-4-0314gpt-4,目前gpt-4的余额查询以及图片生成功能暂不可用,可能是接口限制,也可能是其他原因,等我有条件的时候,会对这些功能进行测试验证。

    以下是gpt-3.5与gpt-4对数学计算方面的区别。

    🖼 点我查看示例图

    感谢@PIRANHACHAN同学提供的gpt-4的key,使得项目在gpt-4的对接上能够进行验证测试,达到了可用状态。

    本地开发

    # 获取项目
    $ git clone https://github.com/eryajf/chatgpt-dingtalk.git
    
    # 进入项目目录
    $ cd chatgpt-dingtalk
    
    # 复制配置文件,根据个人实际情况进行配置
    $ cp config.example.yml config.yml
    
    # 启动项目
    $ go run main.go

    配置文件说明

    # 应用的日志级别,info or debug
    log_level: "info"
    # openai api_key
    api_key: "xxxxxxxxx"
    # 如果你使用官方的接口地址 https://api.openai.com,则留空即可,如果你想指定请求url的地址,可通过这个参数进行配置,注意需要带上 http 协议
    base_url: ""
    # 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-0301", "gpt-3.5-turbo",如果使用gpt-4,请确认自己是否有接口调用白名单
    model: "gpt-3.5-turbo"
    # 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
    session_timeout: 600
    # 指定请求时使用的代理,如果为空,则不使用代理,注意需要带上 http 协议 或 socks5 协议
    http_proxy: ""
    # 指定默认的对话模式,可根据实际需求进行自定义,如果不设置,默认为单聊,即无上下文关联的对话模式
    default_mode: "单聊"
    # 单人单日请求次数上限,默认为0,即不限制
    max_request: 0
    # 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用
    port: "8090"
    # 指定服务的地址,就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址),用于生成图片时给钉钉做渲染
    service_url: "http://chat.eryajf.net"
    # 限定对话类型 0:不限 1:只能单聊 2:只能群聊
    chat_type: "0"
    # 哪些群组可以进行对话,如果留空,则表示允许所有群组,如果要限制,则写群组的名称,比如 ["aa","bb"]
    # 对话聊天时,如下三个满足其一即可通过校验
    allow_groups:
      - "学无止境"
    # 以下 allow_users、deny_users、vip_users、admin_users 配置中填写的是用户的userid,outgoing机器人模式下不适用这些配置
    # 比如 ["1301691029702722","1301691029702733"],这个信息需要在钉钉管理后台的通讯录当中获取:https://oa.dingtalk.com/contacts.htm#/contacts
    # 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的userid
    allow_users: []
    # 哪些用户不可以进行对话,如果留空,则表示允许所有用户(如allow_user有配置,需满足相应条件),如果要限制,则列表中写用户的userid,黑名单优先级高于白名单
    deny_users: []
    # 哪些用户可以进行无限对话,如果留空,则表示只允许管理员(如max_request配置为0,则允许所有人)
    # 如果要针对指定VIP用户放开限制(如max_request配置不为0),则列表中写用户的userid
    vip_users: []
    # 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
    # 注意:如果下边的app_secrets为空,以及使用outgoing的方式配置机器人,这两种情况下,都表示没有人是管理员
    admin_users: []
    # 钉钉机器人在应用信息中的AppSecret,为了校验回调的请求是否合法,如果留空,将会忽略校验,则该接口将会存在其他人也能随意调用的安全隐患,因此强烈建议配置正确的secret,如果你的服务对接给多个机器人,这里可以配置多个机器人的secret
    app_secrets: []
    # 帮助信息,放在配置文件,可供自定义
    help: "欢迎使用本工具\n\n你可以查看:[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)\n\n这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/),觉得不错你可以来波素质三连."
    
    # Azure OpenAI 配置
    # 例如 curl https://forkway-test.openai.azure.com/openai/deployments/test-dev/chat/completions\?api-version\=2023-03-15-preview \
    # azure_api_version: "2023-03-15-preview"
    # azure_resource_name: "forkway-test"
    # azure_deployment_name: "test-dev"
    azure_on: false # 如果是true,则会走azure的openai接口
    azure_api_version: "2023-03-15-preview"
    azure_resource_name: "xxxx"
    azure_deployment_name: "xxxx"
    azure_openai_token: "xxxx"
    

    常见问题

    如何更好地使用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 | 2023-03-27 | 2023-03-29, 这些天里,登上GitHub Trending。而且还在持续登榜中,可见最近openai的热度。
    image_20230316_114915

    贡献者列表

    eryajf
    二丫讲梵
    ffinly
    Finly
    Leizhenpeng
    RiverRay
    laorange
    辣橙
    AydenLii
    AydenLii
    luoxufeiyan
    Hugh Gao
    fantasticmao
    Mao Mao
    iblogc
    Iblogc
    cnmill
    Mill Peng
    WinMin
    Swing
    作者:Jeebiz  创建时间:2023-04-09 23:11
    最后编辑:Jeebiz  更新时间:2023-12-28 16:43