Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dinglog-spring-boot-started
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
VCC
dinglog-spring-boot-started
Commits
47f50c3c
Commit
47f50c3c
authored
Dec 15, 2020
by
tf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
log init ok
parents
Changes
27
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
1282 additions
and
0 deletions
+1282
-0
.gitignore
.gitignore
+64
-0
pom.xml
pom.xml
+103
-0
BootStrap.java
src/main/java/cn/quantgroup/vcc/dinglog/BootStrap.java
+17
-0
DingLogBackConfig.java
...a/cn/quantgroup/vcc/dinglog/config/DingLogBackConfig.java
+39
-0
WebHookSecurityConfig.java
.../quantgroup/vcc/dinglog/config/WebHookSecurityConfig.java
+38
-0
DemoConfig.java
src/main/java/cn/quantgroup/vcc/dinglog/demo/DemoConfig.java
+44
-0
DemoProperties.java
...n/java/cn/quantgroup/vcc/dinglog/demo/DemoProperties.java
+33
-0
DemoService.java
...main/java/cn/quantgroup/vcc/dinglog/demo/DemoService.java
+37
-0
MsgTypeEnum.java
...ain/java/cn/quantgroup/vcc/dinglog/enums/MsgTypeEnum.java
+33
-0
DingTalkAppenderAsync.java
...quantgroup/vcc/dinglog/logback/DingTalkAppenderAsync.java
+98
-0
DingTalkAppenderSync.java
.../quantgroup/vcc/dinglog/logback/DingTalkAppenderSync.java
+146
-0
ContentActionCardMore.java
...a/cn/quantgroup/vcc/dinglog/mo/ContentActionCardMore.java
+98
-0
ContentActionCardSingle.java
...cn/quantgroup/vcc/dinglog/mo/ContentActionCardSingle.java
+74
-0
ContentLink.java
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentLink.java
+53
-0
ContentMarkDown.java
...in/java/cn/quantgroup/vcc/dinglog/mo/ContentMarkDown.java
+37
-0
ContentText.java
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentText.java
+21
-0
MsgAt.java
src/main/java/cn/quantgroup/vcc/dinglog/mo/MsgAt.java
+36
-0
MsgBase.java
src/main/java/cn/quantgroup/vcc/dinglog/mo/MsgBase.java
+17
-0
DingLogBackProperties.java
...ntgroup/vcc/dinglog/properties/DingLogBackProperties.java
+31
-0
WebHookSecurityProperties.java
...oup/vcc/dinglog/properties/WebHookSecurityProperties.java
+96
-0
WebHookServiceImpl.java
...cn/quantgroup/vcc/dinglog/service/WebHookServiceImpl.java
+73
-0
HttpClientUitl.java
...n/java/cn/quantgroup/vcc/dinglog/util/HttpClientUitl.java
+0
-0
HttpUtil.java
src/main/java/cn/quantgroup/vcc/dinglog/util/HttpUtil.java
+52
-0
WebHookSignUtil.java
.../java/cn/quantgroup/vcc/dinglog/util/WebHookSignUtil.java
+25
-0
spring.factories
src/main/resources/META-INF/spring.factories
+3
-0
application.properties
src/main/resources/application.properties
+1
-0
BootStrapTests.java
src/test/java/cn/quantgroup/vcc/dinglog/BootStrapTests.java
+13
-0
No files found.
.gitignore
0 → 100644
View file @
47f50c3c
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Example user template template
### Example user template
# IntelliJ project files
out
gen
/mvnw.cmd
/mvnw
/.mvn/
pom.xml
0 → 100644
View file @
47f50c3c
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.5.8.RELEASE
</version>
<!--<version>2.2.6.RELEASE</version>-->
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>
cn.quantgroup.vcc
</groupId>
<artifactId>
dinglog-spring-boot-started
</artifactId>
<version>
0.0.2-SNAPSHOT
</version>
<name>
dinglog-spring-boot-started
</name>
<description>
dinglog project for Spring Boot
</description>
<properties>
<java.version>
1.8
</java.version>
</properties>
<dependencies>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.41
</version>
</dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-lang3
</artifactId>
<version>
3.8.1
</version>
</dependency>
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-io
</artifactId>
<version>
1.3.2
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
com.aliyun
</groupId>
<artifactId>
alibaba-dingtalk-service-sdk
</artifactId>
<version>
1.0.1
</version>
<exclusions>
<exclusion>
<groupId>
log4j
</groupId>
<artifactId>
log4j
</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<!--<version>2.2.6.RELEASE</version>-->
<optional>
true
</optional>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-autoconfigure
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
<exclusions>
<exclusion>
<groupId>
org.junit.vintage
</groupId>
<artifactId>
junit-vintage-engine
</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
ch.qos.logback
</groupId>
<artifactId>
logback-core
</artifactId>
<!--<version>1.2.3</version>-->
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpclient
</artifactId>
<version>
4.5.6
</version>
</dependency>
</dependencies>
<!--<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
</project>
src/main/java/cn/quantgroup/vcc/dinglog/BootStrap.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.ComponentScan
;
/*@SpringBootApplication
@EnableConfigurationProperties
public class BootStrap {
public static void main(String[] args) {
SpringApplication.run(BootStrap.class, args);
}
}*/
src/main/java/cn/quantgroup/vcc/dinglog/config/DingLogBackConfig.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
config
;
import
cn.quantgroup.vcc.dinglog.demo.DemoService
;
import
cn.quantgroup.vcc.dinglog.logback.DingTalkAppenderSync
;
import
cn.quantgroup.vcc.dinglog.properties.DingLogBackProperties
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @Describe:
* @Created by tangfeng 2020-12-15 15:00
*/
@Configuration
@EnableConfigurationProperties
({
DingLogBackProperties
.
class
})
@ConditionalOnProperty
(
prefix
=
"dinglog.logback"
,
name
=
"isopen"
,
havingValue
=
"true"
,
matchIfMissing
=
true
)
public
class
DingLogBackConfig
{
/*@Autowired
private DingLogBackProperties dingLogBackProperties;
@Autowired
private WebHookSecurityProperties webHookSecurityProperties;
@Bean(name = "dingTalkAppenderSync")
public DingTalkAppenderSync dingTalkAppenderSync(){
return new DingTalkAppenderSync(dingLogBackProperties,webHookSecurityProperties);
}*/
}
src/main/java/cn/quantgroup/vcc/dinglog/config/WebHookSecurityConfig.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
config
;
import
cn.quantgroup.vcc.dinglog.logback.DingTalkAppenderSync
;
import
cn.quantgroup.vcc.dinglog.properties.DingLogBackProperties
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
import
cn.quantgroup.vcc.dinglog.service.WebHookServiceImpl
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @Describe:
* @Created by tangfeng 2020-07-07 19:56
*/
@Configuration
@EnableConfigurationProperties
(
value
=
{
WebHookSecurityProperties
.
class
})
@ConditionalOnProperty
(
matchIfMissing
=
true
)
public
class
WebHookSecurityConfig
{
@Autowired
private
WebHookSecurityProperties
webHookSecurityProperties
;
@Bean
(
name
=
"webHook"
)
public
WebHookServiceImpl
demoService
(){
return
new
WebHookServiceImpl
(
webHookSecurityProperties
);
}
/*@Bean(name = "dingTalkAppenderSync")
@ConditionalOnMissingBean(DingTalkAppenderSync.class)
public DingTalkAppenderSync dingTalkAppenderSync(){
return new DingTalkAppenderSync(webHookSecurityProperties);
}*/
}
src/main/java/cn/quantgroup/vcc/dinglog/demo/DemoConfig.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
demo
;
import
cn.quantgroup.vcc.dinglog.logback.DingTalkAppenderSync
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @Describe: 把demoService
* @Created by tangfeng 2020-05-06 16:40
*/
@Configuration
@EnableConfigurationProperties
({
DemoProperties
.
class
,
WebHookSecurityProperties
.
class
})
@ConditionalOnProperty
(
prefix
=
"demo"
,
name
=
"isopen"
,
//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
//即 demo.isopen=true 与havingValue = "true" 是否匹配
havingValue
=
"true"
,
//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
matchIfMissing
=
true
)
public
class
DemoConfig
{
@Autowired
private
DemoProperties
demoProperties
;
@Autowired
private
WebHookSecurityProperties
webHookSecurityProperties
;
@Bean
(
name
=
"demo"
)
@ConditionalOnMissingBean
(
DemoService
.
class
)
public
DemoService
demoService
(){
return
new
DemoService
(
demoProperties
,
webHookSecurityProperties
);
}
/*@Bean(name = "dintlog")
@ConditionalOnMissingBean(DingTalkAppenderSync.class)
public DingTalkAppenderSync dingTalkAppenderSync(){
return new DingTalkAppenderSync(webHookSecurityProperties);
}*/
}
src/main/java/cn/quantgroup/vcc/dinglog/demo/DemoProperties.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
demo
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
/**
* @Describe: 定义demo的配置文件属性
* @Created by tangfeng 2020-05-06 16:24
*/
@ConfigurationProperties
(
prefix
=
"demo1"
)
public
class
DemoProperties
{
/**
* 可以设置默认值,引用方不配置,则使用该默认值,若配置,则覆盖默认值
*/
private
String
sayWhat
=
"hello"
;
private
String
toWho
;
public
String
getSayWhat
()
{
return
sayWhat
;
}
public
void
setSayWhat
(
String
sayWhat
)
{
this
.
sayWhat
=
sayWhat
;
}
public
String
getToWho
()
{
return
toWho
;
}
public
void
setToWho
(
String
toWho
)
{
this
.
toWho
=
toWho
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/demo/DemoService.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
demo
;
import
cn.quantgroup.vcc.dinglog.demo.DemoProperties
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
/**
* @Describe: 定义demo的函数实现
* @Created by tangfeng 2020-05-06 16:39
*/
public
class
DemoService
{
/**
* 配置的属性
*/
private
DemoProperties
demoProperties
;
private
WebHookSecurityProperties
webHookSecurityProperties
;
/**
* 构造器
*/
public
DemoService
(
DemoProperties
demoProperties
)
{
this
.
demoProperties
=
demoProperties
;
}
public
DemoService
(
DemoProperties
demoProperties
,
WebHookSecurityProperties
webHookSecurityProperties
)
{
this
.
webHookSecurityProperties
=
webHookSecurityProperties
;
this
.
demoProperties
=
demoProperties
;
}
/**
* 可注入实现的函数
*/
public
String
say
()
{
return
demoProperties
.
getSayWhat
()
+
"! "
+
demoProperties
.
getToWho
()+
"====="
+
webHookSecurityProperties
.
getAccessToken
();
}
}
src/main/java/cn/quantgroup/vcc/dinglog/enums/MsgTypeEnum.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
enums
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 10:16
*/
public
enum
MsgTypeEnum
{
TEXT
(
"text"
,
"text文本消息"
),
LINK
(
"link"
,
""
),
MARKDOWN
(
"markdown"
,
""
),
ACTION_CARD_ALL
(
"actionCard"
,
""
),
ACTION_CARD_SIGLE
(
"actionCard"
,
""
),
FEED_CARD
(
"feedCard"
,
""
),
;
private
String
type
;
private
String
desc
;
MsgTypeEnum
(
String
type
,
String
desc
)
{
this
.
type
=
type
;
this
.
desc
=
desc
;
}
public
String
getType
()
{
return
type
;
}
public
String
getDesc
()
{
return
desc
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/logback/DingTalkAppenderAsync.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
logback
;
import
ch.qos.logback.classic.spi.ILoggingEvent
;
import
ch.qos.logback.core.Layout
;
import
ch.qos.logback.core.UnsynchronizedAppenderBase
;
import
com.dingtalk.api.DefaultDingTalkClient
;
import
com.dingtalk.api.DingTalkClient
;
import
com.dingtalk.api.request.OapiRobotSendRequest
;
/**
* @Describe:
* @Created by tangfeng 2020-12-14 14:50
*/
public
class
DingTalkAppenderAsync
extends
UnsynchronizedAppenderBase
<
ILoggingEvent
>
{
Layout
<
ILoggingEvent
>
layout
;
//自定义配置
String
printString
;
public
Layout
<
ILoggingEvent
>
getLayout
()
{
return
layout
;
}
public
void
setLayout
(
Layout
<
ILoggingEvent
>
layout
)
{
this
.
layout
=
layout
;
}
public
String
getPrintString
()
{
return
printString
;
}
public
void
setPrintString
(
String
printString
)
{
this
.
printString
=
printString
;
}
@Override
public
void
start
(){
/**
* 这里可以做些初始化判断 比如layout不能为null
*/
if
(
layout
==
null
)
{
addWarn
(
"Layout was not defined"
);
}
/**
* 或者写入数据库 或者redis时 初始化连接等等
*/
super
.
start
();
}
@Override
public
void
stop
()
{
/**
* 释放相关资源,如数据库连接,redis线程池等等
*/
System
.
out
.
println
(
"logback-stop方法被调用"
);
if
(!
isStarted
())
{
return
;
}
super
.
stop
();
}
@Override
public
void
append
(
ILoggingEvent
event
)
{
if
(
event
==
null
||
!
isStarted
()){
return
;
}
/**
* 自定义日志输出的逻辑
* 比如 操作数据库 redis kafka
* 当然,我的本质目的是发钉钉消息
*/
/*System.out.print("获取输出值---"+event.getFormattedMessage());
System.out.println("格式化输出日志:"+printString + ":" + layout.doLayout(event));
System.out.println("============================================== MyLogbackAppender要发消息了");*/
//发钉钉消息: 具体处理逻辑,参考钉钉的文档,此处暂不实现
//后续计划会开发一个 dingtalk-log-springboot-start 包
try
{
OapiRobotSendRequest
.
Text
text
=
new
OapiRobotSendRequest
.
Text
();
text
.
setContent
(
"这是一个测试"
);
//https://oapi.dingtalk.com/robot/send?access_token=
String
accessToken
=
"{填入自己钉钉群自定义机器人的 webhook token}"
;
String
tokenURL
=
"https://oapi.dingtalk.com/robot/send?access_token="
.
concat
(
accessToken
);
DingTalkClient
client
=
new
DefaultDingTalkClient
(
tokenURL
);
OapiRobotSendRequest
request
=
new
OapiRobotSendRequest
();
request
.
setMsgtype
(
"text"
);
request
.
setText
(
text
);
//OapiRobotSendResponse response = client.execute(request);
}
catch
(
Exception
e
)
{
}
}
}
src/main/java/cn/quantgroup/vcc/dinglog/logback/DingTalkAppenderSync.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
logback
;
import
ch.qos.logback.classic.Level
;
import
ch.qos.logback.classic.encoder.PatternLayoutEncoder
;
import
ch.qos.logback.classic.spi.LoggingEvent
;
import
ch.qos.logback.core.AppenderBase
;
import
cn.quantgroup.vcc.dinglog.demo.DemoProperties
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
import
com.alibaba.fastjson.JSONObject
;
import
com.dingtalk.api.DefaultDingTalkClient
;
import
com.dingtalk.api.DingTalkClient
;
import
com.dingtalk.api.request.OapiRobotSendRequest
;
import
com.dingtalk.api.response.OapiRobotSendResponse
;
import
org.apache.commons.lang3.StringUtils
;
/**
* @Describe:
* @Created by tangfeng 2020-12-14 14:50
*/
public
class
DingTalkAppenderSync
extends
AppenderBase
<
LoggingEvent
>
{
PatternLayoutEncoder
encoder
;
//WebHookSecurityProperties webHookSecurityProperties;
@Override
public
void
start
()
{
if
(
this
.
encoder
==
null
)
{
//name : logback.xml 中 appender 标签 配置的name值
addError
(
"No encoder set for the appender named ["
+
name
+
"]."
);
return
;
}
super
.
start
();
}
@Override
public
void
stop
()
{
//释放相关资源,如数据库连接,redis线程池等等
System
.
out
.
println
(
"stop方法被调用"
);
if
(!
isStarted
())
{
return
;
}
super
.
stop
();
}
@Override
protected
void
append
(
LoggingEvent
eventObject
)
{
Level
level
=
eventObject
.
getLevel
();
/**
* 指定只有 error 级别的日志,才发消息
* 后续可以根据配置指定,此处暂不实现
*/
//System.out.println("test2:" + JSONObject.toJSONString(webHookSecurityProperties));
String
loggerName
=
eventObject
.
getLoggerName
();
System
.
out
.
println
(
"loggerName:"
+
loggerName
+
"=========appenderName"
+
name
);
if
(
level
.
ERROR
.
levelInt
==
level
.
levelInt
)
{
//Map<String, String> appenderNameToken = webHookSecurityProperties.getAppenderNameToken();
String
accessToken
=
null
;
/*for (Map.Entry<String, String> entry : appenderNameToken.entrySet()) {
if (entry.getKey().equals(name)) {
accessToken = entry.getValue();
}
}*/
if
(
StringUtils
.
isEmpty
(
accessToken
))
{
System
.
out
.
println
(
"没有匹配的name和token"
);
return
;
}
//System.out.println("DingTalkAppenderSync============================================== 要发钉钉消息了");
/**
* 发钉钉消息的逻辑,参看钉钉文档,暂不实现
* 后续计划会开发一个 dingtalk-log-springboot-start 包
*/
try
{
OapiRobotSendRequest
.
Text
text
=
new
OapiRobotSendRequest
.
Text
();
text
.
setContent
(
"告警任务:验证日志输出同时发钉钉消息"
);
//https://oapi.dingtalk.com/robot/send?access_token=030bcf64f152dd8d53b5da9c3dd92a0bcb1c2269f41a3ba584b060339bcc6f74
//String accessToken = "{填入自己钉钉群自定义机器人的 webhook token}";
String
tokenURL
=
"https://oapi.dingtalk.com/robot/send?access_token="
.
concat
(
accessToken
);
DingTalkClient
client
=
new
DefaultDingTalkClient
(
tokenURL
);
OapiRobotSendRequest
request
=
new
OapiRobotSendRequest
();
request
.
setMsgtype
(
"text"
);
request
.
setText
(
text
);
OapiRobotSendResponse
response
=
client
.
execute
(
request
);
System
.
out
.
println
(
JSONObject
.
toJSONString
(
response
));
}
catch
(
Exception
e
)
{
}
}
}
/*public DingTalkAppenderSync(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
public DingTalkAppenderSync(DingLogBackProperties dingLogBackProperties) {
this.dingLogBackProperties = dingLogBackProperties;
}
public DingTalkAppenderSync(WebHookSecurityProperties webHookSecurityProperties) {
this.webHookSecurityProperties = webHookSecurityProperties;
}
public DingTalkAppenderSync(PatternLayoutEncoder encoder, DingLogBackProperties dingLogBackProperties, WebHookSecurityProperties webHookSecurityProperties) {
this.encoder = encoder;
this.dingLogBackProperties = dingLogBackProperties;
this.webHookSecurityProperties = webHookSecurityProperties;
}*/
public
PatternLayoutEncoder
getEncoder
()
{
return
encoder
;
}
public
void
setEncoder
(
PatternLayoutEncoder
encoder
)
{
this
.
encoder
=
encoder
;
}
/*public DingTalkAppenderSync(WebHookSecurityProperties webHookSecurityProperties) {
this.webHookSecurityProperties = webHookSecurityProperties;
}
public WebHookSecurityProperties getWebHookSecurityProperties() {
return webHookSecurityProperties;
}
public void setWebHookSecurityProperties(WebHookSecurityProperties webHookSecurityProperties) {
this.webHookSecurityProperties = webHookSecurityProperties;
}*/
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentActionCardMore.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
import
java.util.List
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 13:57
*/
public
class
ContentActionCardMore
{
/**
* title : 乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身
* text :  ### 乔布斯 20 年前想打造的苹果咖啡厅 Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划
* btnOrientation : 0
* btns : [{"title":"内容不错","actionURL":"https://www.dingtalk.com/"},{"title":"不感兴趣","actionURL":"https://www.dingtalk.com/"}]
*/
/**
* 首屏会话透出的展示内容
*/
private
String
title
;
/**
* markdown格式的消息
*/
private
String
text
;
private
String
btnOrientation
;
/**
* 按钮
*/
private
List
<
BtnContent
>
btns
;
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getText
()
{
return
text
;
}
public
void
setText
(
String
text
)
{
this
.
text
=
text
;
}
public
String
getBtnOrientation
()
{
return
btnOrientation
;
}
public
void
setBtnOrientation
(
String
btnOrientation
)
{
this
.
btnOrientation
=
btnOrientation
;
}
public
List
<
BtnContent
>
getBtns
()
{
return
btns
;
}
public
void
setBtns
(
List
<
BtnContent
>
btns
)
{
this
.
btns
=
btns
;
}
public
static
class
BtnContent
{
/**
* title : 内容不错
* actionURL : https://www.dingtalk.com/
*/
/**
* 按钮标题
*/
private
String
title
;
/**
* 按钮跳转URL
*/
private
String
actionURL
;
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getActionURL
()
{
return
actionURL
;
}
public
void
setActionURL
(
String
actionURL
)
{
this
.
actionURL
=
actionURL
;
}
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentActionCardSingle.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 13:57
*/
public
class
ContentActionCardSingle
{
/**
* title : 乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身
* text(markdown ) :
* "
* ### 乔布斯 20 年前想打造的苹果咖啡厅
* Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
* "btnOrientation": "0",
* "singleTitle" : "阅读全文",
* "singleURL" : "https://www.dingtalk.com/"
*/
/**
* 首屏会话透出的展示内容
*/
private
String
title
;
/**
* markdown格式的消息
*/
private
String
text
;
private
String
btnOrientation
;
private
String
singleTitle
;
private
String
singleURL
;
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getText
()
{
return
text
;
}
public
void
setText
(
String
text
)
{
this
.
text
=
text
;
}
public
String
getBtnOrientation
()
{
return
btnOrientation
;
}
public
void
setBtnOrientation
(
String
btnOrientation
)
{
this
.
btnOrientation
=
btnOrientation
;
}
public
String
getSingleTitle
()
{
return
singleTitle
;
}
public
void
setSingleTitle
(
String
singleTitle
)
{
this
.
singleTitle
=
singleTitle
;
}
public
String
getSingleURL
()
{
return
singleURL
;
}
public
void
setSingleURL
(
String
singleURL
)
{
this
.
singleURL
=
singleURL
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentLink.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 13:53
*/
public
class
ContentLink
{
/**
* text : 这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林
* title : 时代的火车向前开
* picUrl :
* messageUrl : https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI
*/
private
String
text
;
private
String
title
;
private
String
picUrl
;
private
String
messageUrl
;
public
String
getText
()
{
return
text
;
}
public
void
setText
(
String
text
)
{
this
.
text
=
text
;
}
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getPicUrl
()
{
return
picUrl
;
}
public
void
setPicUrl
(
String
picUrl
)
{
this
.
picUrl
=
picUrl
;
}
public
String
getMessageUrl
()
{
return
messageUrl
;
}
public
void
setMessageUrl
(
String
messageUrl
)
{
this
.
messageUrl
=
messageUrl
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentMarkDown.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 13:56
*/
public
class
ContentMarkDown
{
/**
* title : 杭州天气
* text : #### 杭州天气 @150XXXXXXXX
> 9度,西北风1级,空气良89,相对温度73%
> 
> ###### 10点20分发布 [天气](https://www.dingtalk.com)
*/
private
String
title
;
private
String
text
;
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getText
()
{
return
text
;
}
public
void
setText
(
String
text
)
{
this
.
text
=
text
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/ContentText.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 10:13
*/
public
class
ContentText
extends
MsgBase
{
/**
* "我就是我, 是不一样的烟火@156xxxx8827"
*/
private
String
content
;
public
String
getContent
()
{
return
content
;
}
public
void
setContent
(
String
content
)
{
this
.
content
=
content
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/MsgAt.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
import
java.util.List
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 10:13
*/
public
class
MsgAt
{
/**
* 发送消息@的人手机号
*/
private
List
<
String
>
atMobiles
;
/**
* 是否@ 所有人
*/
private
boolean
isAtAll
;
public
List
<
String
>
getAtMobiles
()
{
return
atMobiles
;
}
public
void
setAtMobiles
(
List
<
String
>
atMobiles
)
{
this
.
atMobiles
=
atMobiles
;
}
public
boolean
isAtAll
()
{
return
isAtAll
;
}
public
void
setAtAll
(
boolean
atAll
)
{
isAtAll
=
atAll
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/mo/MsgBase.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
mo
;
/**
* @Describe:
* @Created by tangfeng 2020-07-09 10:12
*/
public
class
MsgBase
{
private
String
msgType
;
public
String
getMsgType
()
{
return
msgType
;
}
public
void
setMsgType
(
String
msgType
)
{
this
.
msgType
=
msgType
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/properties/DingLogBackProperties.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
properties
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
/**
* @Describe:
* @Created by tangfeng 2020-12-15 14:56
*/
@ConfigurationProperties
(
prefix
=
"dinglog.logback"
)
public
class
DingLogBackProperties
{
private
String
accessToken
;
private
String
appenderName
;
public
String
getAccessToken
()
{
return
accessToken
;
}
public
void
setAccessToken
(
String
accessToken
)
{
this
.
accessToken
=
accessToken
;
}
public
String
getAppenderName
()
{
return
appenderName
;
}
public
void
setAppenderName
(
String
appenderName
)
{
this
.
appenderName
=
appenderName
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/properties/WebHookSecurityProperties.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
properties
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
java.util.List
;
import
java.util.Map
;
/**
* @Describe:
* @Created by tangfeng 2020-07-07 17:45
*/
@ConfigurationProperties
(
prefix
=
"dinglog.webhook.security"
)
public
class
WebHookSecurityProperties
{
/**
* 业务关键词
*/
private
String
keyWords
;
//private Map<String,String> appenderNameToken;
/**
* 签名的秘钥
*/
private
String
signSecret
;
/**
* ip段
*/
private
String
ipSegments
;
/**
* robot token
*/
private
String
accessToken
;
/**
* robot send url
*/
private
String
url
=
"https://oapi.dingtalk.com/robot/send"
;
public
String
getKeyWords
()
{
return
keyWords
;
}
public
void
setKeyWords
(
String
keyWords
)
{
this
.
keyWords
=
keyWords
;
}
public
String
getSignSecret
()
{
return
signSecret
;
}
public
void
setSignSecret
(
String
signSecret
)
{
this
.
signSecret
=
signSecret
;
}
public
String
getIpSegments
()
{
return
ipSegments
;
}
public
void
setIpSegments
(
String
ipSegments
)
{
this
.
ipSegments
=
ipSegments
;
}
public
String
getAccessToken
()
{
return
accessToken
;
}
public
void
setAccessToken
(
String
accessToken
)
{
this
.
accessToken
=
accessToken
;
}
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
/*public Map<String, String> getAppenderNameToken() {
return appenderNameToken;
}
public void setAppenderNameToken(Map<String, String> appenderNameToken) {
this.appenderNameToken = appenderNameToken;
}*/
@Override
public
String
toString
()
{
return
"WebHookSecurityProperties{"
+
"keyWords='"
+
keyWords
+
'\''
+
", signSecret='"
+
signSecret
+
'\''
+
", ipSegments='"
+
ipSegments
+
'\''
+
", accessToken='"
+
accessToken
+
'\''
+
", url='"
+
url
+
'\''
+
'}'
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/service/WebHookServiceImpl.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
service
;
import
cn.quantgroup.vcc.dinglog.properties.WebHookSecurityProperties
;
import
cn.quantgroup.vcc.dinglog.util.HttpClientUitl
;
import
cn.quantgroup.vcc.dinglog.util.HttpUtil
;
import
cn.quantgroup.vcc.dinglog.util.WebHookSignUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.Assert
;
import
org.springframework.util.StringUtils
;
import
java.nio.file.WatchEvent
;
/**
* @Describe:
* @Created by tangfeng 2020-07-07 19:58
*/
public
class
WebHookServiceImpl
{
Logger
log
=
LoggerFactory
.
getLogger
(
WebHookServiceImpl
.
class
);
private
WebHookSecurityProperties
webHookSecurityProperties
;
public
WebHookServiceImpl
()
{
}
public
WebHookServiceImpl
(
WebHookSecurityProperties
webHookSecurityProperties
)
{
this
.
webHookSecurityProperties
=
webHookSecurityProperties
;
}
/**
* 发送json串消息
*/
public
boolean
sendDingMsg
(
String
json
)
throws
Exception
{
try
{
String
sendUrl
=
getSendUrl
();
//String s = HttpUtil.doPost(sendUrl,null);
String
s
=
HttpClientUitl
.
doGet
(
"http://talos-vcc.liangkebang.net/ex/login/getVccToken?phone=17346526631&systemKey=vcc&loginFrom=159860"
);
System
.
out
.
println
(
s
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
System
.
out
.
println
(
"发出的消息内容是:"
+
json
+
"________"
+
JSONObject
.
toJSONString
(
webHookSecurityProperties
));
log
.
info
(
"json:{},webHookProperties:{}"
,
json
,
webHookSecurityProperties
.
toString
());
return
true
;
}
private
String
getSendUrl
()
throws
Exception
{
checkWebHookPreoperties
();
String
url
=
webHookSecurityProperties
.
getUrl
().
concat
(
"?access_token="
).
concat
(
webHookSecurityProperties
.
getAccessToken
());
long
timeStamp
=
System
.
currentTimeMillis
();
String
signPath
=
null
;
if
(!
StringUtils
.
isEmpty
(
webHookSecurityProperties
.
getSignSecret
()))
{
String
sign
=
WebHookSignUtil
.
sign
(
timeStamp
,
webHookSecurityProperties
.
getSignSecret
());
signPath
=
String
.
format
(
"×tamp=%s&sign=%s"
,
timeStamp
,
sign
);
}
if
(!
StringUtils
.
isEmpty
(
signPath
))
{
url
=
url
.
concat
(
signPath
);
}
return
url
;
}
private
void
checkWebHookPreoperties
(){
Assert
.
notNull
(
webHookSecurityProperties
.
getAccessToken
(),
"accessToken is null"
);
}
}
src/main/java/cn/quantgroup/vcc/dinglog/util/HttpClientUitl.java
0 → 100644
View file @
47f50c3c
This diff is collapsed.
Click to expand it.
src/main/java/cn/quantgroup/vcc/dinglog/util/HttpUtil.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
util
;
import
org.apache.http.client.ClientProtocolException
;
import
org.apache.http.client.entity.UrlEncodedFormEntity
;
import
org.apache.http.client.methods.CloseableHttpResponse
;
import
org.apache.http.client.methods.HttpGet
;
import
org.apache.http.client.methods.HttpPost
;
import
org.apache.http.client.methods.HttpRequestBase
;
import
org.apache.http.impl.client.CloseableHttpClient
;
import
org.apache.http.impl.client.HttpClients
;
import
org.apache.http.message.BasicNameValuePair
;
import
org.apache.http.util.EntityUtils
;
import
java.io.IOException
;
import
java.nio.charset.Charset
;
import
java.util.ArrayList
;
import
java.util.Map
;
import
java.util.Set
;
/**
* @Describe:
* @Created by tangfeng 2020-07-07 17:01
*/
public
class
HttpUtil
{
public
static
String
doGet
(
String
url
)
throws
Exception
{
HttpGet
httpGet
=
new
HttpGet
(
url
);
return
execute
(
httpGet
);
}
public
static
String
doPost
(
String
url
,
Map
<
String
,
String
>
param
)
throws
Exception
{
HttpPost
httpPost
=
new
HttpPost
(
url
);
ArrayList
<
BasicNameValuePair
>
arrayList
=
new
ArrayList
<
BasicNameValuePair
>();
Set
<
String
>
keySet
=
param
.
keySet
();
for
(
String
key
:
keySet
)
{
arrayList
.
add
(
new
BasicNameValuePair
(
key
,
param
.
get
(
key
)));
}
httpPost
.
setEntity
(
new
UrlEncodedFormEntity
(
arrayList
));
return
execute
(
httpPost
);
}
private
static
String
execute
(
HttpRequestBase
request
)
throws
IOException
,
ClientProtocolException
{
CloseableHttpClient
httpClient
=
HttpClients
.
createDefault
();
CloseableHttpResponse
response
=
httpClient
.
execute
(
request
);
if
(
200
==
response
.
getStatusLine
().
getStatusCode
())
{
return
EntityUtils
.
toString
(
response
.
getEntity
(),
Charset
.
forName
(
"utf-8"
));
}
else
{
System
.
out
.
println
(
EntityUtils
.
toString
(
response
.
getEntity
(),
Charset
.
forName
(
"utf-8"
)));
}
return
""
;
}
}
src/main/java/cn/quantgroup/vcc/dinglog/util/WebHookSignUtil.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
.
util
;
import
org.apache.commons.codec.binary.Base64
;
import
javax.crypto.Mac
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.net.URLEncoder
;
/**
* @Describe:
* @Created by tangfeng 2020-07-08 15:41
*/
public
class
WebHookSignUtil
{
public
static
String
sign
(
Long
timestamp
,
String
secret
)
throws
Exception
{
String
stringToSign
=
timestamp
+
"\n"
+
secret
;
Mac
mac
=
Mac
.
getInstance
(
"HmacSHA256"
);
mac
.
init
(
new
SecretKeySpec
(
secret
.
getBytes
(
"UTF-8"
),
"HmacSHA256"
));
byte
[]
signData
=
mac
.
doFinal
(
stringToSign
.
getBytes
(
"UTF-8"
));
String
sign
=
URLEncoder
.
encode
(
new
String
(
Base64
.
encodeBase64
(
signData
)),
"UTF-8"
);
return
sign
;
}
}
src/main/resources/META-INF/spring.factories
0 → 100644
View file @
47f50c3c
#-------starter自动装配,多个以逗号隔开---------
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.quantgroup.vcc.dinglog.demo.DemoConfig
src/main/resources/application.properties
0 → 100644
View file @
47f50c3c
src/test/java/cn/quantgroup/vcc/dinglog/BootStrapTests.java
0 → 100644
View file @
47f50c3c
package
cn
.
quantgroup
.
vcc
.
dinglog
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
class
BootStrapTests
{
@Test
void
contextLoads
()
{
}
}
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