zoukankan      html  css  js  c++  java
  • 基于酷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("
    "))
            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("
    "))
           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大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    go install
    web网络安全系统
    Web图片分享系统
    web图库网站
    web视频播放网站
    web商业银行管理平台
    web科技管理信息平台
    web工艺品销售平台
    web房产网站
    感谢!
  • 原文地址:https://www.cnblogs.com/demodashi/p/10474132.html
Copyright © 2011-2022 走看看