基於酷Q的工作秘書機器人


代碼地址如下:
http://www.demodashi.com/demo/14617.html

環境准備

名稱 版本
Jdk 8
groovy 2.4.12
gradle 4.6
酷Q 5.12.3A
酷Q Http Api插件 4.6.2

環境安裝

  1. jdk安裝
  2. groovy安裝
  3. gradle安裝
  4. 酷Q下載后直接解壓
  5. 酷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)
    }
}
  • 代碼說明
  1. 酷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
        }
    }

目前上報消息只處理了消息類型,可以對私聊、群消息、討論組消息進行處理,本例直接對接了茉莉機器人,當私聊時或者在群、討論組@機器人時,會調用茉莉機器人的回答回復並@該用戶

  1. 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)
   }
  1. 消息發送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)
}

運行及打包

  1. 直接運行Application
  2. 使用gradle的bootJar task打包,然后java -jar 直接運行

運行效果

  1. 私聊

  2. 群聊

  3. 工作討論組

結束基於酷Q的工作秘書機器人

代碼地址如下:
http://www.demodashi.com/demo/14617.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM