1 需求场景
场景1:点击飞书应用图标,从飞书单点登录Smartbi首页。
场景2:同步飞书用户组、用户至Smartbi。
场景3:从Smartbi推送报表链接给指定的飞书群。
场景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,打开对应资源。
获取报表资源id的方式如下,右键点击需要推送的报表资源,点击属性,便可以看到节点id,节点id就是报表资源id:
2、推送标题:配置推送此消息时,显示的标题,如截图所示红框部分:
3、推送消息内容:配置推送此消息时,显示的消息内容,如截图所示红框部分:
4、推送消息接收者,在Smartbi中对应的用户id、用户组id或者角色id:配置消息的接收者,若配置的是用户,则type设置为"USER";若配置的是用户组,则type设置为"GROUP";若配置的是角色,则type设置为"ROLE",id需要配置对应的用户id,用户组id或者角色id,id可通过查询t_user(用户表)、t_group(用户组表)和t_role(角色表)获取。
...
打开计划-新建计划,绑定刚刚创建的任务设置定时时间即可;
2.5.3. 定时推送电子表格带图的应用消息
通过任务脚本,定时推送带图的应用消息(标题、消息内容、报表导出图片、报表访问链接)到被推送用户的飞书上;
说明:导出的图片按任务任务的执行账号对报表执行导出,如果推送的报表资源对不同用户有不同数据权限,请使用2.45.2的普通应用消息进行推送。
2.5.3.1. 操作步骤
...
保存后即可测试运行把资源报表导出图片,然后推送图片到飞书。
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.23.2,此处仅补充一处21,此处仅补充一处2.23.2没有的配置项:1没有的配置项:
可选配置,导出电子表格的参数信息,这项配置项可以用于配置以什么参数来导出电子表格。参数id的获取方式参考下方说明:
右键点击目标电子表格,点击“血统分析”,打开数据集:
按以下操作,即可获取参数id:
而参数的真实值和显示值,可以通过“系统运维-全局资源定义-参数定义-打开参数-预览备选值”来获取:
...
2.
...
5.3.4. 配置相关计划定时推送
请参考2.45.2.4
...
2.
...
5.4. 定时推送自定义机器人消息(群消息)
通过计划任务定时向飞书推送群消息。
...
2.
...
5.4.1. 操作步骤
(1)飞书自定义机器人配置
打开群设置:
进入群机器人:
添加自定义机器人:
配置webhook:
其中webhook地址需要在Smartbi中使用;
其中webhook地址需要在smartbi中使用;如果需要设置签名,签名秘钥需复制到Smartbi中使用;
如果需要设置签名,签名秘钥需复制到smartbi中使用;
(2)新建任务,并将定制提供的脚本粘贴到代码编辑区。
保存后即可测试运行推送报表到飞书。
...
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 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,可在群设置中的机器人配置中找到(如下图);
Secret:签名秘钥,可在群设置中的机器人配置中找到(如下图),如果没设置签名校验,可设置空;
title:消息标题;
content:消息内容;
btnStr:按钮显示内容;
btnUrl:按钮打开的报表链接;
...
2.
...
5.4.4. 配置相关计划定时推送
请参考2.45.2.4
...
2.
...
5.5. 定时推送电子表格导出文件或图片到用户或群
导出电子表格文件或图片推送给用户或者推送给应用机器人有权限的群;
...
2.
...
5.5.1. 操作步骤
如果要推送到群,需要按如下步骤配置:
...
1、飞书后台管理配置应用机器人,参考 2.2.1.6
2、在群里添加smartbi应用对应的机器人:
...
- 新建任务,并将定制提供的脚本粘贴到代码编辑区,根据实际情况调整脚本配置内容:
...
3、新建任务,并将定制提供的脚本粘贴到代码编辑区,根据实际情况调整脚本配置内容:
2.5.5.2. 任务脚本
...
2.
...
5.5.3. 配置项说明
脚本的配置项说明具体可参考脚本中的注释
...
2.
...
5.5.4. 使用效果
1、推送pdf文件消息到群的效果(脚本配置项uploadType = "file"):
2、推送png带图片的富文本消息到群的效果(图片可预览,脚本配置项uploadType = "img"):
3、推送png文件消息到群的效果(图片当做文件发送,脚本配置项uploadType = "file"):
...
3. 常见问题
...
3.1. 配置飞书系统选项报错
问题:配置系统选项-飞书集成时,如果提示无法获取token
解决方案:如果报错为【UnknownHostException: open.feishu.cn】,如下图,请检查服务器是否做了网络访问限制,导致服务器无法正常访问飞书的接口,开放飞书网络访问限制即可;
...