環境准備
名稱 | 版本 |
---|---|
Jdk | 8 |
groovy | 2.4.12 |
gradle | 4.6 |
酷Q | 5.12.3A |
酷Q Http Api插件 | 4.6.2 |
環境安裝
- jdk安裝
- groovy安裝
- gradle安裝
- 酷Q下載后直接解壓
- 酷Q Http插件安裝
將io.github.richardchien.coolqhttpapi.cpk文件復制到酷Q根目錄下的app目錄下,注意插件的json配置,通過CQA.exe啟動輸入你的機器人QQ號
本例配置,酷Q home/app/io.github.richardchien.coolqhttpapi.cpk/config.json,使用的時候把json注釋去掉,這里只是用於屬性說明
{
"general": {
"host": "0.0.0.0",
// 機器人接收消息接口
"post_url": "http://127.0.0.1:6666/coolQ"
},
// key為機器人qq號
"2743046799": {
// 酷Q消息接收token
"access_token": "Mgep4rV49rM8Jf",
// 酷Q接收消息端口
"port": 5700
}
}
項目結構
該項目使用groovy開發,基於spring-boot,使用grandle構建,開發ide為IntelliJ IDEA
-
代碼結構
-
配置說明
i. 配置文件
server:
# web端口
port: 6666
logging:
level:
org.springframework.*: info
org.apache.http.*: error
org.hibernate.*: error
com.github.*: debug
spring:
gson:
field-naming-policy: lower_case_with_underscores
secretary:
# 酷Q配置
cool:
# 消息發送地址 酷Q運行主機及json配置的端口
url: http://192.168.2.86:5700
# 消息token
token: Mgep4rV49rM8Jf
# 用於jira&gitlab webhooks消息發送
# 工作群/討論組id 1575716762
groupId: 1575716762
# 群類型 discuss/group
groupType: discuss
# 茉莉機器人配置
itpk:
url: http://i.itpk.cn
apiKey: f5c89b45e875434b4be5d1bd54266db6
apiSecret: 3xj9lxqied51
# jira用戶名和qq關系
# 通過經辦人jira帳號綁定對應人工作QQ號
# 沒用到jira的webhooks可以忽略
jira:
Admin: 412810549
lisi: 410571470
wangwu: 1579231853
zhaoliu: 1786370596
ii. retrofit配置
@Configuration
class RetrofitConfig {
@Value("\${secretary.cool.url}")
String coolQUrl
@Value("\${secretary.itpk.url}")
String itpkUrl
@Autowired
Gson gson
@Bean
Retrofit cool() {
new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(this.gson))
.baseUrl(this.coolQUrl)
.build()
}
@Bean
Retrofit itpk() {
new Retrofit.Builder().baseUrl(this.itpkUrl).build()
}
@Bean
CoolQApi coolQApi() {
this.cool().create(CoolQApi.class)
}
@Bean
ItpkApi itpkApi() {
this.itpk().create(ItpkApi.class)
}
}
- 代碼說明
- 酷Q上報接口CoolQController
@PostMapping
def receive(HttpServletRequest request) {
String json = request.getReader().lines().collect(Collectors.joining("\n"))
log.debug(json)
def type = this.gson.fromJson(json, TypeReq.class)
switch (type.getPostType()) {
case POST_TYPE_MESSAGE:
// 只處理私聊/群消息/討論組消息
switch (type.getMessageType()) {
case MESSAGE_TYPE_PRIVATE:
def req = this.gson.fromJson(json, PrivateMessageReq.class)
return new MessageResp(this.itpkComponent.message(req.getLegalMessage()))
case MESSAGE_TYPE_GROUP:
def req = this.gson.fromJson(json, GroupMessageReq.class)
if (req.needReply()) {
return new MessageResp(this.itpkComponent.message(req.getLegalMessage()))
}
break
case MESSAGE_TYPE_DISCUSS:
def req = this.gson.fromJson(json, DiscussMessageReq.class)
if (req.needReply()) {
return new MessageResp(this.itpkComponent.message(req.getLegalMessage()))
}
break
default:
log.warn("暫時不支持的消息類型{}", type.getMessageType())
break
}
break
default:
log.warn("暫時不支持的推送消息類型{}", type.getPostType())
break
}
}
目前上報消息只處理了消息類型,可以對私聊、群消息、討論組消息進行處理,本例直接對接了茉莉機器人,當私聊時或者在群、討論組@機器人時,會調用茉莉機器人的回答回復並@該用戶
- jira webhooks接口JiraController
@PostMapping
void jira(HttpServletRequest request) {
String json = request.getReader().lines().collect(Collectors.joining("\n"))
log.debug(json)
def jiraVo = this.gson.fromJson(json, JiraVo.class)
this.sendMessageComponent.sendJiraMsg(jiraVo.user(), jiraVo.message())
}
收到jira觸發的動作,調用酷Q的http接口發送消息通知對應的經辦人
3. gitlab webhooks接口GitlabController
通知開發人員及時合並代碼盡量避免沖突
4. 酷Q消息發送組件SendMessageComponent
消息發送api
/**
* 發送jira消息
* @param key jira帳號
* @param message 消息內容
*/
void sendJiraMsg(String key, String message) {
SendAllMessageReq req = new SendAllMessageReq()
req.setId(this.groupType, this.groupId)
req.setMessage(Optional.ofNullable(this.atUserPrefix(key)).orElse("") + message)
req.setAutoEscape(false)
this.sendMsg(req)
}
/**
* 發送gitlab消息通知
* @param message 消息內容
*/
void sendGitlabMsg(String message) {
SendAllMessageReq req = new SendAllMessageReq()
req.setId(this.groupType, this.groupId)
req.setMessage(message)
req.setAutoEscape(true)
this.sendMsg(req)
}
private void sendMsg(SendAllMessageReq req) {
try {
def execute = this.coolQApi.sendMsg(this.header(), req).execute()
log.debug(this.gson.toJson(execute.body()))
} catch (Exception e) {
log.debug(e.getMessage(), e)
}
}
/**
* qq @指定用戶
* @param key jira帳號
* @return CQ碼
*/
private String atUserPrefix(String key) {
return String.format("[CQ:at,qq=%s] ", this.group.get(key))
}
/**
* 酷Q消息發送token
* @return token
*/
private String header() {
return String.format("Token %s", this.token)
}
- 消息發送http客戶端 使用的retrofit
interface CoolQApi {
/**
* 群消息發送
* @param header token
* @param req 消息內容
* @return 應答
*/
@POST("/send_group_msg")
@Headers("Content-Type:application/json")
Call<CoolResp> sendGroupMsg(@Header("Authorization") String header, @Body SendGroupMessageReq req)
/**
* 討論組消息發送
* @param header token
* @param req 消息內容
* @return 應答
*/
@POST("/send_discuss_msg")
@Headers("Content-Type:application/json")
Call<CoolResp> sendDiscussMsg(@Header("Authorization") String header, @Body SendDiscussMessageReq req)
/**
* 私人消息發送
* @param header token
* @param req 消息內容
* @return 應答
*/
@POST("/send_private_msg")
@Headers("Content-Type:application/json")
Call<CoolResp> sendPrivateMsg(@Header("Authorization") String header, @Body SendPrivateMessageReq req)
/**
* 發送消息
* @param header token
* @param req 消息內容
* @return 應答
*/
@POST("/send_msg")
@Headers("Content-Type:application/json")
Call<CoolResp> sendMsg(@Header("Authorization") String header, @Body SendAllMessageReq req)
}
運行及打包
- 直接運行Application
- 使用gradle的bootJar task打包,然后java -jar 直接運行
運行效果
-
私聊
-
群聊
-
工作討論組
結束基於酷Q的工作秘書機器人
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權