Skip to content

Commit

Permalink
feat: add DingTalk(钉钉) tool for sending message to chat group bot via…
Browse files Browse the repository at this point in the history
… webhook (#2693)
  • Loading branch information
bowenliang123 authored Mar 12, 2024
1 parent f49b1af commit f82a64d
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 0 deletions.
1 change: 1 addition & 0 deletions api/core/tools/provider/_position.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@
- gaode
- wecom
- qrcode
- dingtalk
7 changes: 7 additions & 0 deletions api/core/tools/provider/builtin/dingtalk/_assets/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions api/core/tools/provider/builtin/dingtalk/dingtalk.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from core.tools.provider.builtin.dingtalk.tools.dingtalk_group_bot import DingTalkGroupBotTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController


class DingTalkProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
DingTalkGroupBotTool()
pass
13 changes: 13 additions & 0 deletions api/core/tools/provider/builtin/dingtalk/dingtalk.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
identity:
author: Bowen Liang
name: dingtalk
label:
en_US: DingTalk
zh_Hans: 钉钉
pt_BR: DingTalk
description:
en_US: DingTalk group robot
zh_Hans: 钉钉群机器人
pt_BR: DingTalk group robot
icon: icon.svg
credentials_for_provider:
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import base64
import hashlib
import hmac
import logging
import time
import urllib.parse
from typing import Any, Union

import httpx

from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool


class DingTalkGroupBotTool(BuiltinTool):
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
invoke tools
Dingtalk custom group robot API docs:
https://open.dingtalk.com/document/orgapp/custom-robot-access
"""
content = tool_parameters.get('content')
if not content:
return self.create_text_message('Invalid parameter content')

access_token = tool_parameters.get('access_token')
if not access_token:
return self.create_text_message('Invalid parameter access_token. '
'Regarding information about security details,'
'please refer to the DingTalk docs:'
'https://open.dingtalk.com/document/robots/customize-robot-security-settings')

sign_secret = tool_parameters.get('sign_secret')
if not sign_secret:
return self.create_text_message('Invalid parameter sign_secret. '
'Regarding information about security details,'
'please refer to the DingTalk docs:'
'https://open.dingtalk.com/document/robots/customize-robot-security-settings')

msgtype = 'text'
api_url = 'https://oapi.dingtalk.com/robot/send'
headers = {
'Content-Type': 'application/json',
}
params = {
'access_token': access_token,
}

self._apply_security_mechanism(params, sign_secret)

payload = {
"msgtype": msgtype,
"text": {
"content": content,
}
}

try:
res = httpx.post(api_url, headers=headers, params=params, json=payload)
if res.is_success:
return self.create_text_message("Text message sent successfully")
else:
return self.create_text_message(
f"Failed to send the text message, status code: {res.status_code}, response: {res.text}")
except Exception as e:
return self.create_text_message("Failed to send message to group chat bot. {}".format(e))

@staticmethod
def _apply_security_mechanism(params: dict[str, Any], sign_secret: str):
try:
timestamp = str(round(time.time() * 1000))
secret_enc = sign_secret.encode('utf-8')
string_to_sign = f'{timestamp}\n{sign_secret}'
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))

params['timestamp'] = timestamp
params['sign'] = sign
except Exception:
msg = "Failed to apply security mechanism to the request."
logging.exception(msg)
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
identity:
name: dingtalk_group_bot
author: Bowen Liang
label:
en_US: Send Group Message
zh_Hans: 发送群消息
pt_BR: Send Group Message
icon: icon.svg
description:
human:
en_US: Sending a group message on DingTalk via the webhook of group bot
zh_Hans: 通过钉钉的群机器人webhook发送群消息
pt_BR: Sending a group message on DingTalk via the webhook of group bot
llm: A tool for sending messages to a chat group on DingTalk(钉钉) .
parameters:
- name: access_token
type: secret-input
required: true
label:
en_US: access token
zh_Hans: access token
pt_BR: access token
human_description:
en_US: access_token in the group robot webhook
zh_Hans: 群自定义机器人webhook中access_token字段的值
pt_BR: access_token in the group robot webhook
form: form
- name: sign_secret
type: secret-input
required: true
label:
en_US: secret key for signing
zh_Hans: 加签秘钥
pt_BR: secret key for signing
human_description:
en_US: secret key for signing
zh_Hans: 加签秘钥
pt_BR: secret key for signing
form: form
- name: content
type: string
required: true
label:
en_US: content
zh_Hans: 消息内容
pt_BR: content
human_description:
en_US: Content to sent to the group.
zh_Hans: 群消息文本
pt_BR: Content to sent to the group.
llm_description: Content of the message
form: llm

0 comments on commit f82a64d

Please sign in to comment.