Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dlink
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhaowei
dlink
Commits
ed64ff53
Unverified
Commit
ed64ff53
authored
Mar 26, 2022
by
aiwenmo
Committed by
GitHub
Mar 26, 2022
Browse files
Options
Browse Files
Download
Plain Diff
[Feature-211][alert-wechat] Add WeChat WebHook AlertType
[Feature-211][alert-wechat] Add WeChat WebHook AlertType
parents
be52b5e8
976b5369
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
183 additions
and
59 deletions
+183
-59
WeChatConstants.java
...src/main/java/com/dlink/alert/wechat/WeChatConstants.java
+8
-0
WeChatSender.java
...at/src/main/java/com/dlink/alert/wechat/WeChatSender.java
+95
-44
WeChatType.java
...chat/src/main/java/com/dlink/alert/wechat/WeChatType.java
+1
-1
WeChatSenderTest.java
...rc/test/java/com/dlink/alert/wechat/WeChatSenderTest.java
+31
-4
WeChatForm.tsx
dlink-web/src/pages/AlertInstance/components/WeChatForm.tsx
+48
-10
No files found.
dlink-alert/dlink-alert-wechat/src/main/java/com/dlink/alert/wechat/WeChatConstants.java
View file @
ed64ff53
...
...
@@ -22,6 +22,14 @@ public class WeChatConstants {
static
final
String
TOKEN_URL
=
"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={secret}"
;
static
final
String
WEBHOOK
=
"webhook"
;
static
final
String
WEBHOOK_TEMPLATE
=
"{\"msgtype\":\"{showType}\",\"{showType}\":{\"content\":\"{msg} \"}}"
;
static
final
String
KEYWORD
=
"keyword"
;
static
final
String
AT_ALL
=
"isAtAll"
;
static
final
String
CORP_ID
=
"corpId"
;
static
final
String
SECRET
=
"secret"
;
...
...
dlink-alert/dlink-alert-wechat/src/main/java/com/dlink/alert/wechat/WeChatSender.java
View file @
ed64ff53
package
com
.
dlink
.
alert
.
wechat
;
import
com.dlink.alert.AlertException
;
import
com.dlink.alert.AlertResult
;
import
com.dlink.alert.AlertSendResponse
;
import
com.dlink.alert.ShowType
;
...
...
@@ -45,17 +44,24 @@ public class WeChatSender {
private
final
String
weChatToken
;
private
final
String
sendType
;
private
final
String
showType
;
private
final
String
webhookUrl
;
private
final
String
KeyWord
;
private
final
Boolean
atAll
;
WeChatSender
(
Map
<
String
,
String
>
config
)
{
weChatAgentId
=
config
.
get
(
WeChatConstants
.
AGENT_ID
);
weChatUsers
=
config
.
get
(
WeChatConstants
.
USERS
);
String
weChatCorpId
=
config
.
get
(
WeChatConstants
.
CORP_ID
);
String
weChatSecret
=
config
.
get
(
WeChatConstants
.
SECRET
);
String
weChatTokenUrl
=
WeChatConstants
.
TOKEN_URL
;
weChatUserSendMsg
=
WeChatConstants
.
USER_SEND_MSG
;
sendType
=
config
.
get
(
WeChatConstants
.
SEND_TYPE
);
weChatAgentId
=
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
())?
""
:
config
.
get
(
WeChatConstants
.
AGENT_ID
);
atAll
=
Boolean
.
valueOf
(
config
.
get
(
WeChatConstants
.
AT_ALL
));
weChatUsers
=
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
())?(
atAll
&&
config
.
get
(
WeChatConstants
.
USERS
)
==
null
?
""
:
config
.
get
(
WeChatConstants
.
USERS
)):
config
.
get
(
WeChatConstants
.
USERS
);
String
weChatCorpId
=
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
())?
""
:
config
.
get
(
WeChatConstants
.
CORP_ID
);
String
weChatSecret
=
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
())?
""
:
config
.
get
(
WeChatConstants
.
SECRET
);
String
weChatTokenUrl
=
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
())?
""
:
WeChatConstants
.
TOKEN_URL
;
weChatUserSendMsg
=
WeChatConstants
.
USER_SEND_MSG
;
showType
=
config
.
get
(
WeChatConstants
.
SHOW_TYPE
);
requireNonNull
(
showType
,
WeChatConstants
.
SHOW_TYPE
+
" must not null"
);
webhookUrl
=
config
.
get
(
WeChatConstants
.
WEBHOOK
);
KeyWord
=
config
.
get
(
WeChatConstants
.
KEYWORD
);
if
(
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
()))
requireNonNull
(
webhookUrl
,
WeChatConstants
.
WEBHOOK
+
" must not null"
);
weChatTokenUrlReplace
=
weChatTokenUrl
.
replace
(
CORP_ID_REGEX
,
weChatCorpId
)
.
replace
(
SECRET_REGEX
,
weChatSecret
);
...
...
@@ -69,11 +75,27 @@ public class WeChatSender {
if
(
Asserts
.
isNotNullString
(
weChatUsers
))
{
userList
=
Arrays
.
asList
(
weChatUsers
.
split
(
","
));
}
String
data
=
markdownByAlert
(
title
,
content
);
String
msg
=
weChatUserSendMsg
.
replace
(
USER_REG_EXP
,
mkString
(
userList
))
.
replace
(
AGENT_ID_REG_EXP
,
weChatAgentId
).
replace
(
MSG_REG_EXP
,
data
)
.
replace
(
SHOW_TYPE_REGEX
,
showType
);
if
(
Asserts
.
isNullString
(
weChatToken
))
{
if
(
atAll
){
userList
.
add
(
"ALL"
);
}
String
data
=
""
;
if
(
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
()))
{
data
=
markdownByAlert
(
KeyWord
,
content
,
userList
);;
}
else
{
data
=
markdownByAlert
(
title
,
content
,
userList
);
}
String
msg
=
""
;
if
(
sendType
.
equals
(
WeChatType
.
APP
.
getValue
()))
{
msg
=
weChatUserSendMsg
.
replace
(
USER_REG_EXP
,
mkUserString
(
userList
))
.
replace
(
AGENT_ID_REG_EXP
,
weChatAgentId
).
replace
(
MSG_REG_EXP
,
data
)
.
replace
(
SHOW_TYPE_REGEX
,
showType
);
}
else
{
msg
=
WeChatConstants
.
WEBHOOK_TEMPLATE
.
replace
(
SHOW_TYPE_REGEX
,
showType
)
.
replace
(
MSG_REG_EXP
,
data
);
}
if
(
sendType
.
equals
(
WeChatType
.
APP
.
getValue
())
&&
Asserts
.
isNullString
(
weChatToken
))
{
alertResult
.
setMessage
(
"send we chat alert fail,get weChat token error"
);
alertResult
.
setSuccess
(
false
);
return
alertResult
;
...
...
@@ -81,8 +103,8 @@ public class WeChatSender {
String
enterpriseWeChatPushUrlReplace
=
""
;
if
(
sendType
.
equals
(
WeChatType
.
APP
.
getValue
()))
{
enterpriseWeChatPushUrlReplace
=
WeChatConstants
.
PUSH_URL
.
replace
(
TOKEN_REGEX
,
weChatToken
);
}
else
if
(
sendType
.
equals
(
WeChatType
.
APP
CHAT
.
getValue
()))
{
enterpriseWeChatPushUrlReplace
=
WeChatConstants
.
APP_CHAT_PUSH_URL
.
replace
(
TOKEN_REGEX
,
weChatToken
)
;
}
else
if
(
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
()))
{
enterpriseWeChatPushUrlReplace
=
webhookUrl
;
}
try
{
return
checkWeChatSendMsgResult
(
post
(
enterpriseWeChatPushUrlReplace
,
msg
));
...
...
@@ -112,7 +134,18 @@ public class WeChatSender {
}
}
private
static
String
mkString
(
Iterable
<
String
>
list
)
{
private
static
String
mkUserList
(
Iterable
<
String
>
list
)
{
StringBuilder
sb
=
new
StringBuilder
(
"["
);
for
(
String
name
:
list
)
{
sb
.
append
(
"\""
).
append
(
name
).
append
(
"\","
);
}
sb
.
deleteCharAt
(
sb
.
length
()
-
1
);
sb
.
append
(
"]"
);
return
sb
.
toString
();
}
private
static
String
mkUserString
(
Iterable
<
String
>
list
)
{
if
(
Asserts
.
isNull
(
list
))
{
return
null
;
}
...
...
@@ -129,22 +162,62 @@ public class WeChatSender {
return
sb
.
toString
();
}
private
String
markdownByAlert
(
String
title
,
String
content
)
{
/**
*@Author: zhumingye
*@date: 2022/3/26
*@Description: 将用户列表转换为<@用户名> </@用户名>的格式
* @param userList
* @return java.lang.String
*/
private
static
String
mkMarkDownAtUsers
(
List
<
String
>
userList
){
StringBuilder
builder
=
new
StringBuilder
();
if
(
Asserts
.
isNotNull
(
userList
))
{
userList
.
forEach
(
value
->
{
builder
.
append
(
"<@"
).
append
(
value
).
append
(
"> "
);
});
}
return
builder
.
toString
();
}
private
String
markdownByAlert
(
String
title
,
String
content
,
List
<
String
>
userList
)
{
String
result
=
""
;
if
(
showType
.
equals
(
ShowType
.
TABLE
.
getValue
()))
{
result
=
markdownTable
(
title
,
content
);
result
=
markdownTable
(
title
,
content
,
userList
,
sendType
);
}
else
if
(
showType
.
equals
(
ShowType
.
TEXT
.
getValue
()))
{
result
=
markdownText
(
title
,
content
);
result
=
markdownText
(
title
,
content
,
userList
,
sendType
);
}
return
result
;
}
private
static
String
markdownTable
(
String
title
,
String
content
)
{
private
static
String
markdownTable
(
String
title
,
String
content
,
List
<
String
>
userList
,
String
sendType
)
{
return
getMsgResult
(
title
,
content
,
userList
,
sendType
);
}
private
static
String
markdownText
(
String
title
,
String
content
,
List
<
String
>
userList
,
String
sendType
)
{
return
getMsgResult
(
title
,
content
,
userList
,
sendType
);
}
/**
*@Author: zhumingye
*@date: 2022/3/25
*@Description: 创建公共方法 用于创建发送消息文本
* @param title 发送标题
* @param content 发送内容
* @param sendType
* @return java.lang.String
*@throws
*/
private
static
String
getMsgResult
(
String
title
,
String
content
,
List
<
String
>
userList
,
String
sendType
)
{
List
<
LinkedHashMap
>
mapItemsList
=
JSONUtil
.
toList
(
content
,
LinkedHashMap
.
class
);
if
(
null
==
mapItemsList
||
mapItemsList
.
isEmpty
())
{
logger
.
error
(
"itemsList is null"
);
throw
new
RuntimeException
(
"itemsList is null"
);
}
String
markDownAtUsers
=
mkMarkDownAtUsers
(
userList
);
StringBuilder
contents
=
new
StringBuilder
(
200
);
for
(
LinkedHashMap
mapItems
:
mapItemsList
)
{
Set
<
Map
.
Entry
<
String
,
Object
>>
entries
=
mapItems
.
entrySet
();
...
...
@@ -160,34 +233,12 @@ public class WeChatSender {
}
contents
.
append
(
t
);
}
if
(
sendType
.
equals
(
WeChatType
.
CHAT
.
getValue
()))
{
contents
.
append
(
markDownAtUsers
);
}
return
contents
.
toString
();
}
private
static
String
markdownText
(
String
title
,
String
content
)
{
if
(
Asserts
.
isNotNullString
(
content
))
{
List
<
LinkedHashMap
>
mapItemsList
=
JSONUtil
.
toList
(
content
,
LinkedHashMap
.
class
);
if
(
null
==
mapItemsList
||
mapItemsList
.
isEmpty
())
{
logger
.
error
(
"itemsList is null"
);
throw
new
AlertException
(
"itemsList is null"
);
}
StringBuilder
contents
=
new
StringBuilder
(
100
);
contents
.
append
(
String
.
format
(
"`%s`%n"
,
title
));
for
(
LinkedHashMap
mapItems
:
mapItemsList
)
{
Set
<
Map
.
Entry
<
String
,
Object
>>
entries
=
mapItems
.
entrySet
();
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
entries
)
{
contents
.
append
(
WeChatConstants
.
MARKDOWN_QUOTE
);
contents
.
append
(
entry
.
getKey
()).
append
(
":"
).
append
(
entry
.
getValue
());
contents
.
append
(
WeChatConstants
.
MARKDOWN_ENTER
);
}
}
return
contents
.
toString
();
}
return
null
;
}
private
String
getToken
()
{
...
...
dlink-alert/dlink-alert-wechat/src/main/java/com/dlink/alert/wechat/WeChatType.java
View file @
ed64ff53
...
...
@@ -9,7 +9,7 @@ package com.dlink.alert.wechat;
public
enum
WeChatType
{
APP
(
1
,
"应用"
),
APP
CHAT
(
2
,
"群聊"
);
CHAT
(
2
,
"群聊"
);
private
final
int
code
;
private
final
String
value
;
...
...
dlink-alert/dlink-alert-wechat/src/test/java/com/dlink/alert/wechat/WeChatSenderTest.java
View file @
ed64ff53
...
...
@@ -23,6 +23,7 @@ import org.junit.Assert;
import
org.junit.Before
;
import
org.junit.Test
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -67,7 +68,7 @@ public class WeChatSenderTest {
+
",\"msgtype\":\"{showType}\",\"{showType}\":{\"content\":\"{msg}\"}}"
);
weChatConfig
.
put
(
WeChatConstants
.
USERS
,
"
USERS
"
);
weChatConfig
.
put
(
WeChatConstants
.
USERS
,
"
all
"
);
weChatConfig
.
put
(
WeChatConstants
.
TEAM_SEND_MSG
,
"msg"
);
weChatConfig
.
put
(
WeChatConstants
.
SHOW_TYPE
,
ShowType
.
TABLE
.
getValue
());
// default is "table"
weChatConfig
.
put
(
WeChatConstants
.
SEND_TYPE
,
WeChatType
.
APP
.
getValue
());
...
...
@@ -76,17 +77,43 @@ public class WeChatSenderTest {
@Test
public
void
testSend
WeChatTable
Msg
()
{
public
void
testSend
APPMarkDown
Msg
()
{
WeChatSender
weChatSender
=
new
WeChatSender
(
weChatConfig
);
AlertResult
alertResult
=
weChatSender
.
send
(
"
TABLE-TEST
"
,
contentTest
);
AlertResult
alertResult
=
weChatSender
.
send
(
"
Dlinky企微APP MarkDown方式 告警测试
"
,
contentTest
);
Assert
.
assertEquals
(
true
,
alertResult
.
getSuccess
());
}
@Test
public
void
testSend
WeChat
TextMsg
()
{
public
void
testSend
APP
TextMsg
()
{
weChatConfig
.
put
(
WeChatConstants
.
SHOW_TYPE
,
ShowType
.
TEXT
.
getValue
());
WeChatSender
weChatSender
=
new
WeChatSender
(
weChatConfig
);
AlertResult
alertResult
=
weChatSender
.
send
(
"Dlinky企微APP TEXT方式 告警测试"
,
contentTest
);
Assert
.
assertEquals
(
true
,
alertResult
.
getSuccess
());
}
@Test
public
void
testChatMarkDownMsg
()
throws
IOException
{
weChatConfig
.
put
(
WeChatConstants
.
WEBHOOK
,
"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8xxxxxxxxxxxxxxxxx6fe13396c"
);
weChatConfig
.
put
(
WeChatConstants
.
SEND_TYPE
,
WeChatType
.
CHAT
.
getValue
());
weChatConfig
.
put
(
WeChatConstants
.
USER_SEND_MSG
,
WeChatConstants
.
WEBHOOK_TEMPLATE
);
weChatConfig
.
put
(
WeChatConstants
.
SHOW_TYPE
,
ShowType
.
TABLE
.
getValue
());
weChatConfig
.
put
(
WeChatConstants
.
KEYWORD
,
"Dlinky企微WEBHOOK MarkDown方式 告警测试"
);
WeChatSender
weChatSender
=
new
WeChatSender
(
weChatConfig
);
AlertResult
alertResult
=
weChatSender
.
send
(
"TEXT-TEST"
,
contentTest
);
Assert
.
assertEquals
(
true
,
alertResult
.
getSuccess
());
}
@Test
public
void
testChatTextMsg
()
throws
IOException
{
weChatConfig
.
put
(
WeChatConstants
.
WEBHOOK
,
"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=822d17a1-d6e5-43c2-a566-4846fe13396c"
);
weChatConfig
.
put
(
WeChatConstants
.
SEND_TYPE
,
WeChatType
.
CHAT
.
getValue
());
weChatConfig
.
put
(
WeChatConstants
.
USER_SEND_MSG
,
WeChatConstants
.
WEBHOOK_TEMPLATE
);
weChatConfig
.
put
(
WeChatConstants
.
SHOW_TYPE
,
ShowType
.
TEXT
.
getValue
());
weChatConfig
.
put
(
WeChatConstants
.
KEYWORD
,
"Dlinky企微WEBHOOK TEXT方式 告警测试"
);
WeChatSender
weChatSender
=
new
WeChatSender
(
weChatConfig
);
AlertResult
alertResult
=
weChatSender
.
send
(
"TEXT-TEST"
,
contentTest
);
Assert
.
assertEquals
(
true
,
alertResult
.
getSuccess
());
}
}
dlink-web/src/pages/AlertInstance/components/WeChatForm.tsx
View file @
ed64ff53
...
...
@@ -54,6 +54,52 @@ const WeChatForm: React.FC<AlertInstanceFormProps> = (props) => {
>
<
Input
placeholder=
"请输入名称"
/>
</
Form
.
Item
>
<
Form
.
Item
name=
"sendType"
label=
"发送方式"
validateTrigger=
{
[
'onChange'
,
'onBlur'
]
}
rules=
{
[{
required
:
true
,
message
:
'请输入发送方式!'
}]
}
>
<
Radio
.
Group
defaultValue=
"应用"
>
<
Radio
value=
'应用'
>
应用
</
Radio
>
<
Radio
value=
'群聊'
>
群聊
</
Radio
>
</
Radio
.
Group
>
</
Form
.
Item
>
{
(
formVals
.
sendType
===
"群聊"
)
&&
<>
<
Form
.
Item
name=
"webhook"
label=
"WebHook地址"
rules=
{
[{
required
:
true
,
message
:
'请输入WebHook!'
,}]
}
>
<
Input
placeholder=
"请输入WebHook"
/>
</
Form
.
Item
>
<
Form
.
Item
name=
"keyword"
label=
"关键字"
>
<
Input
placeholder=
"请输入keyword"
/>
</
Form
.
Item
>
<
Form
.
Item
name=
"isAtAll"
validateTrigger=
{
[
'onChange'
,
'onBlur'
]
}
label=
"@所有人"
>
<
Switch
checkedChildren=
"启用"
unCheckedChildren=
"禁用"
defaultChecked=
{
formVals
.
isAtAll
}
/>
</
Form
.
Item
>
{
(
formVals
.
sendType
===
"群聊"
&&
formVals
.
isAtAll
===
false
)
&&
<
Form
.
Item
name=
"users"
label=
"被@用户"
rules=
{
[{
required
:
true
,
message
:
'请输入被@用户!多个逗号隔开!'
,}]
}
>
<
Input
placeholder=
"请输入被@用户ID(企微用户名全拼),多个逗号隔开!"
/>
</
Form
.
Item
>
}
</>
}
{
formVals
.
sendType
===
"应用"
&&
<>
<
Form
.
Item
name=
"corpId"
label=
"企业Id"
...
...
@@ -89,16 +135,8 @@ const WeChatForm: React.FC<AlertInstanceFormProps> = (props) => {
>
<
Input
placeholder=
"请输入代理ID"
/>
</
Form
.
Item
>
<
Form
.
Item
name=
"sendType"
label=
"发送方式"
rules=
{
[{
required
:
true
,
message
:
'请输入发送方式!'
}]
}
>
<
Radio
.
Group
>
<
Radio
value=
'应用'
>
应用
</
Radio
>
<
Radio
value=
'群聊'
>
群聊
</
Radio
>
</
Radio
.
Group
>
</
Form
.
Item
>
</>
}
<
Form
.
Item
name=
"showType"
label=
"展示方式"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment