...
场景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 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,可在群设置中的机器人配置中找到(如下图);
...