页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

场景4:定时推送消息至飞书,包含:普通应用消息、群消息。

2 使用说明

2.1 加载扩展包

扩展包:飞书集成SmartbiPD_FeiShuCommon

扩展包部署详情请看文档:部署扩展包

注意:上传该扩展包时需进行系统升级。请勿在系统忙碌期间部署该扩展包。

...

2.2.1.8. 应用权限开通说明

需要给到应用配置以下权限:

权限名称

权限说明

使用场景

备注

contact:contact:readonly_as_app

以应用身份读取通讯录

用户同步,单点登录

新版这个权限已经取消

contact:department.organize:readonly

获取部门组织架构信息

用户同步,单点登录


contact:user.base:readonly

获取用户基本信息

用户同步,单点登录


contact:user.employee_id:readonly

获取用户user ID

用户同步,单点登录


contact:user.phone:readonly

获取用户手机号

用户同步,单点登录


im:message

获取与发送单聊、群组信息

推送消息


im:message:send_multi_depts

给一个或多个部门成员批量法消息

推送消息


im:message:send_multi_users

给多个用户批量发消息

推送消息


im:resource

获取与上传图片或文件资源

推送消息


contact:department.base:readonly

获取部门基础信息

用户同步(部门信息),单点登录


contact:user.employee:readonly

获取用户受雇信息

用户同步(用户状态)


contact:user.department:readonly

获取用户所属部门的 ID

用户同步


contact:user.email:readonly

获取用户邮箱信息

用户同步(email邮箱扩展属性)



2.2.1.9. 版本与管理

每一次修改应用信息,都要创建版本并发布后才能生效。

...

如下步骤,新建任务,并将定制提供的脚本粘贴到代码编辑区。

保存后即可测试运行进行用户组同步。

任务代码如下:

connector.remoteInvoke("FeiShuCommonModule","syncFeiShuGroup",[]);


2.4.2. 配置同步用户任务

在Smartbi中创建定制任务

宏代码如下

connector.remoteInvoke("FeiShuCommonModule","syncFeiShuUser",[true]);


2.4.3. 执行同步用户组和用户

执行顺序:先执行用户组同步,然后再执行用户,因为在Smartbi中,用户是挂靠在用户组下的,如果先执行同步用户,可能该用户的用户组在Smartbi中不存在,导致同步异常;

...

保存后即可测试运行推送报表到飞书。

2.5.2.2. 任务脚本

// 推送资源报表到飞书,目前仅支持电子表格,web电子表格,url链接,页面,office分析报告,自主仪表盘资源

importPackage(Packages.smartbi.sdk.service.systemconfig);

/****************** 配置 - 开始******************/

// 必须配置:报表资源ID

var reportId = 'I8a8a8d2a018584b084b0fae2018584fde1d200a0';

// 必须配置:推送标题

var title = "消息标题";

// 可选配置:推送消息内容

var desc = "这是一段消息内容";

// 必须配置:接收者在Smartbi的用户,用户组或者角色id;

// 若配置的是用户,则type设置为"USER";若配置的是用户组,则type设置为"GROUP";若配置的是角色,则type设置为"ROLE";

// id需要配置对应的用户id,用户组id或者角色id

var sendUser = [

{type: "USER", id: "用户ID1"},

{type: "USER", id: "用户ID2"},

{type: "GROUP", id: "用户组ID"},

{type: "ROLE", id: "角色ID"}

];


/****************** 配置 - 结束******************/


var sendUrl = "";

var systemConfigService = new SystemConfigService(connector);

var urlConfig = systemConfigService.getSystemConfig("INTEGRATED_APPLICATION_ADDRESS");

if (urlConfig !== null && urlConfig.getLongValue() !== null && urlConfig.getLongValue() !== "") {

    sendUrl = urlConfig.getLongValue();

    if(!sendUrl.endsWith('/')){

     sendUrl = sendUrl+'/';

    }

sendUrl += "vision/feishu/openresource.jsp?feishu=true&sh=false&refresh=true&showtoolbar=false&showPath=false&iPad=true&sendTarget=auto&resid=" + reportId;

}

var sendSetting = {

reportId: reportId,

title: title,

sendUrl: sendUrl,

desc: desc,

sendUser: sendUser

};

connector.remoteInvoke("FeiShuCommonModule","sendInfoToFeiShu",[JSON.stringify(sendSetting)]);


2.5.2.3. 配置项说明

1、报表资源ID:配置需要推送的报表资源的id,配置之后,点击推送消息的“查看详情”可以直接跳转Smartbi,打开对应资源。

...

保存后即可测试运行把资源报表导出图片,然后推送图片到飞书。

2.5.3.2. 任务脚本

// 把资源报表导出图片,然后推送图片到飞书,目前仅支持电子表格、web电子表格

importPackage(Packages.smartbi.sdk.service.systemconfig);

/****************** 配置 - 开始******************/

// 必须配置:电子表格ID

var reportId = 'I8a8a8d2a018584b084b0fae2018584fde1d200a0';

// 必须配置:可配置推送标题

var title = "测试电子表格";

// 可选配置:推送消息内容

var desc = "这是一段消息内容";

// 必须配置:接收者在Smartbi的用户,用户组或者角色id。

// 若配置的是用户,则type设置为"USER"; 若配置的是用户组,则type设置为"GROUP"; 若配置的是角色,则type设置为"ROLE"

// id需要配置对应的用户id,用户组id或者角色id

var sendUser = [

{type: "USER", id: "用户ID1"},

{type: "USER", id: "用户ID2"},

{type: "GROUP", id: "用户组ID"},

{type: "ROLE", id: "角色ID"}

];

// 可选配置:导出电子表格的参数信息---------------------------------------------  

// 设置格式:{id:"OutputParameter.数据集ID.参数名称",value:参数真实值,displayValue:参数显示值},参数值可

// 以设置为固定值,变量,或者默认值,默认值写法:"$默认值$",例如如:{id:"OutputParameter.I2c9019810158fc12fc1224c00158fc2e21c50069.测试",value:"$默认值$",displayValue:"$默认值$"}

var reportParamSetting = [

   //{id:"OutputParameter.I8a8a9be9018671b671b6e610018671d0e80500e8.用户",value:"SCHEDULEADMIN",displayValue:"计划管理员"}//多个参数之间以逗号分隔

];

/****************** 配置 - 结束******************/


// 以下内容无需配置

var sendUrl = "";

var systemConfigService = new SystemConfigService(connector);

var urlConfig = systemConfigService.getSystemConfig("INTEGRATED_APPLICATION_ADDRESS");

if (urlConfig !== null && urlConfig.getLongValue() !== null && urlConfig.getLongValue() !== "") {

    sendUrl = urlConfig.getLongValue();

    if(!sendUrl.endsWith('/')){

     sendUrl = sendUrl+'/';

    }

sendUrl += "vision/feishu/openresource.jsp?feishu=true&sh=false&refresh=true&showtoolbar=false&showPath=false&iPad=true&sendTarget=auto&resid=" + reportId;

}

var sendPictureSetting = {

reportId: reportId,

title: title,

desc: desc,

sendUrl: sendUrl,

sendUser: sendUser,

reportParamSetting: reportParamSetting

};


connector.remoteInvoke("FeiShuCommonModule","sendPictureToFeishu",[JSON.stringify(sendPictureSetting)]);


2.5.3.3. 配置项说明

参考2.3.1,此处仅补充一处2.3.1没有的配置项:

...

保存后即可测试运行推送报表到飞书。

2.5.4.2. 任务脚本

importPackage(Packages.java.io);

importPackage(Packages.java.net);

importPackage(Packages.java.lang);

importPackage(Packages.smartbi.net.sf.json);

importPackage(Packages.smartbi.ext.feishu.common)


/****************************** 配置 开始 ******************************/

//机器人webhook

var webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/c2538dae-218f-41a8-abaf-6435a828258b";

//签名校验,如果不需要可以置空

var secret="NWswmBHaiQjHoDaIZ2dnbg";

//消息标题

var title="消息标题";

//消息内容

var content ="测试消息内容";

//按钮显示内容

var btnStr="打开报表"

//按钮打开的报表链接

var btnUrl="http://10.10.13.170:8080/smartbi/vision/feishu/openresource.jsp?feishu=true&sh=false&refresh=true&showtoolbar=false&showPath=false&iPad=true&resid=I297e289f017ccb5fcb5fe29e017ccb6a9ae50099";

/****************************** 配置 结束 ******************************/


var rtn = httpRequest(webhook, "POST",secret,title, content,btnStr,btnUrl);

logger.info("返回结果为:" + rtn);

 //发送消息

function httpRequest(requestUrl, requestMethod,secret, title, content, btnStr, btnUrl) {

    var httpUrlConn = null;

    var url = new URL(requestUrl);

    httpUrlConn = url.openConnection();

    httpUrlConn.setDoOutput(true);

    httpUrlConn.setDoInput(true);

    httpUrlConn.setUseCaches(false);

    // 设置请求方式(GET/POST)

    httpUrlConn.setRequestMethod(requestMethod);

    httpUrlConn.setRequestProperty("Content-Type", "application/json");

    httpUrlConn.setRequestProperty("Charset", "UTF-8");

    /****************** 拼接发送内容(包括签名) - 开始 *****************/

    var dataStr='{"msg_type": "interactive",'

    +'"card": {'+'"header": {"title": {"tag": "plain_text","content": "'+title+'"}},'

    +'"elements": ['

    +'{"tag": "div","text": {"tag": "lark_md","content": "'+content+'"}}';

    if(btnStr!=null && btnStr!=''){

        dataStr=dataStr+',{"actions": [{"tag": "button","text": {"tag": "lark_md","content":"'+btnStr+'"},"url": "'+btnUrl+'","type": "default"}],"tag": "action"}';

    }

    dataStr=dataStr+']}}';

    var jsonObj = JSONObject.fromString(dataStr);

    //如果秘钥不为空则视为需要签名

     if(secret!=null && secret!=''){

        var timestamp = parseInt(System.currentTimeMillis()/1000);

        var sign = FeiShuCommonModule.getInstance().GenSign(secret,timestamp);

        jsonObj.put("timestamp",""+timestamp);

        jsonObj.put("sign",sign);

    }

    logger.info("发送请求参数:" + jsonObj.toString());

    /******************拼接发送内容(包括签名) - 结束 *****************/

    

    httpUrlConn.connect();

    var writer = new OutputStreamWriter(httpUrlConn.getOutputStream());

    // 发送参数

    writer.write(jsonObj.toString());

    // 清理当前编辑器的左右缓冲区,并使缓冲区数据写入基础流

    writer.flush();

    // 将返回的输入流转换成字符串

    var inputStream = httpUrlConn.getInputStream();

    var inputStreamReader = new InputStreamReader(inputStream, "UTF-8");

    var bufferedReader = new BufferedReader(inputStreamReader);

    var str = null;

    var buffer = "";

    while ((str = bufferedReader.readLine()) !== null) {

        buffer += str;

    }

    bufferedReader.close();

    inputStreamReader.close();

    // 释放资源

    inputStream.close();

    httpUrlConn.disconnect();

    var jsonObject = buffer.toString();

    return jsonObject;

}


2.5.4.3. 配置项说明

webhook:机器人webhook,可在群设置中的机器人配置中找到(如下图);

...