钉钉群机器人对接maxkb方法(java版,可调整钉钉消息格式)

java项目在钉钉官方有一个demo,可以先直接下载测试,后续自己可以迁移到项目里

  1. 企业机器人发送群聊消息 教程 demo地址
    企业机器人发送群聊消息 教程 demo地址
    需要用到钉钉appKey,appSecret,robotcode


  2. maxkb请求问答
    需要用到下面两个接口

  3. demo需要调整的地方



    我这里是调整了markdown格式,根据自己的需要调整,getMes()是我封装的向maxkb发送请求的方法
    企业机器人发送消息的消息类型
    别忘了修改配置
    image

  4. 最后的效果

还有一些问题。钉钉的换行有点不整齐;图片的地址必须是公网能访问的地址,内网存储的图片即使实在内网环境里,钉钉也无法显示;回答有一点慢;

如何调用的maxkb接口啊,我看钉钉企业微信可以和机器人单聊,我用的那个模板

我当时是这个样子

public String getMes(String mes) {
        String chatId = null;
        // 根据应用id,获取会话id
        String res1 = HttpRequest.get("http://192.168.0.48:8080/api/application/c5db0a36-7df5-11ef-a829-fe8fe793d99d/chat/open")
                .header("Authorization", "application-f6ea8f77a206dd33e8ad3960208de4c4")
                .timeout(20000)//超时,毫秒
                .execute().body();
        R<String> r = JSONUtil.toBean(res1, R.class);
        if (r.getCode() == R.SUCCESS) {
            chatId = r.getData();
        }

        RequestBodyParam requestBodyParam = new RequestBodyParam(mes, false, false);

        // 发起会话
        String res2 = HttpRequest.post("http://192.168.0.48:8080/api/application/chat_message/" + chatId)
                .header("Authorization", "application-f6ea8f77a206dd33e8ad3960208de4c4")
                .body(JSONUtil.toJsonStr(requestBodyParam))
                .timeout(20000)//超时,毫秒
                .execute().body();

        // 回答结果
        R respon = JSONUtil.toBean(res2, R.class);
        Object data = respon.getData();
        String jsonString = JSONUtil.toJsonStr(data);
        ResponParam responParam = JSONUtil.toBean(jsonString, ResponParam.class);

        // 替换minio图片地址为外网地址(需要先对minio地址配置内网穿透)
        String content = responParam.getContent();
//        String replace = content.replace(INWEB, OUTWEB);

        return content;
    }

请求头的是要创建api key



application_id就是

拿到的data


填到

返回结果 content字段就是回答内容,maxkb的这边是用 Unicode显示的,你可以用在线工具检查一下,idea里是可以正常看的

您好,我是本地化dokcer部署的MaxKB,使用MaxKB自带的API文档测试的时候,所有都是200,然后信息为未登录,我不太确定哪边没登录


先调用下面的这个接口

上面的authorize要填


谢谢老哥

我想请教一下,您的代码里R.java具体是什么内容

自定定义的返回类

package org.example;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 响应信息主体
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class R<T> implements Serializable {

    /**
     * 成功
     */
    public static final int SUCCESS = 200;

    /**
     * 失败
     */
    public static final int FAIL = 500;

    private int code;

    private String msg;

    private T data;

    public static <T> R<T> ok() {
        return restResult(null, SUCCESS, "操作成功");
    }

    public static <T> R<T> ok(T data) {
        return restResult(data, SUCCESS, "操作成功");
    }

    public static <T> R<T> ok(String msg) {
        return restResult(null, SUCCESS, msg);
    }

    public static <T> R<T> ok(String msg, T data) {
        return restResult(data, SUCCESS, msg);
    }

    public static <T> R<T> fail() {
        return restResult(null, FAIL, "操作失败");
    }

    public static <T> R<T> fail(String msg) {
        return restResult(null, FAIL, msg);
    }

    public static <T> R<T> fail(T data) {
        return restResult(data, FAIL, "操作失败");
    }

    public static <T> R<T> fail(String msg, T data) {
        return restResult(data, FAIL, msg);
    }

    public static <T> R<T> fail(int code, String msg) {
        return restResult(null, code, msg);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static <T> R<T> warn(String msg) {
        return restResult(null, 601, msg);
    }

    /**
     * 返回警告消息
     *
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static <T> R<T> warn(String msg, T data) {
        return restResult(data, 601, msg);
    }

    private static <T> R<T> restResult(T data, int code, String msg) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setData(data);
        r.setMsg(msg);
        return r;
    }

    public static <T> Boolean isError(R<T> ret) {
        return !isSuccess(ret);
    }

    public static <T> Boolean isSuccess(R<T> ret) {
        return R.SUCCESS == ret.getCode();
    }
}

请问一下,我可以自己做一个页面对话机器人调用api接口吗

单次对话可以,但是不知道上下文有没有效果

您好,针对您的代码,部分位置比如:HttpRequest、JSONUtil、RequestBodyParam、ResponParam、getContent()都标红,您是否还写了其他类文件或添加了其他的pom支持。

添加了hultool的工具类,然后自己写一下返回对象的接受类

想了解一下您写的返回对象的接受类

@Data
@AllArgsConstructor
class RequestBodyParam {
    private String message;
    private Boolean reChat;
    private Boolean stream;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ResponParam implements Serializable {
    private String chatId;
    private String id;
    private Boolean operate;
    private String content;
    private Boolean isEnd;
}

2025-03-12 17:55:31.843 ERROR 17868 — [lk-Consumer-1-1] o.e.c.chatbot.ChatBotCallbackListener : send private message by robot error:SocketTimeoutException: Connect timed out

超时是maxkb的原因还是钉钉的原因呢

你在maxkb那部分的发送消息方法打断点看看呗,如果maxkb回消息了就说明maxkb没问题