java快速构建飞书API消息推送、消息加急等功能

文章目录

  • 飞书机器人
    • 自定义机器人
    • 自定义应用机器人
  • 自定义应用发送消息
    • 普通文本 text
    • 富文本 post
    • 图片 image
    • 文件 file
    • 语音 audio
    • 视频 media
    • 消息卡片 interactive
    • 分享群名片 share_chat
    • 分享个人名片 share_user
  • 批量发送消息
  • 消息加急
    • 发送应用内加急
    • 发送短信加急
  • 发送电话加急
  • springboot核心代码实现

在这里插入图片描述

给指定用户或者会话一對一发送消息
支持文本、富文本、可交互的消息卡片、群名片、个人名片、图片、视频、音频、文件、表情包

飞书机器人

自定义机器人

在这里插入图片描述

自定义机器人是一种只能在当前群聊中使用的机器人。
你可以在 群设置>群机器人 面板中快捷创建一个自定义机器人,无需经过租户管理员审核,即可在当前群聊中通过调用webhook地址的方式完成消息推送。由于自定义机器人无需经过租户管理员审核即可使用,使用上的便捷性也限制了其使用范围:

  • 只能在被添加的群聊内使用,不能与机器人单聊
  • 只能对群聊进行单向的消息推送,不能调用飞书丰富的开放接口,获取任何用户、租户信息等
    在这里插入图片描述

自定义应用机器人

应用机器人需要在 开发者后台 中创建,申请发布并经过租户的应用管理员审核通过后,即可使用。在应用发布范围内的用户,可以直接与你创建的机器人单聊,或在 群设置>群机器人 面板中将这个机器人添加进群聊使用。应用机器人受本租户的应用管理员管控。在应用管理员进行权限审核后,应用机器人可以调用飞书丰富的开放接口,获取、使用用户和租户资源。
PS:应用机器人需要提前申请-管理员审核
在这里插入图片描述

自定义应用发送消息

普通文本 text

{"receive_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs","content": "{\"text\":\" test content\"}", // 文本内容"msg_type": "text"
}// 如果需要文本中进行换行,需要增加转义
{"receive_id": "oc_xxx","content": "{\"text\":\"firstline \\n second line  \"}","msg_type": "text"
}// 文本消息@用法说明,user_id字段需填入open_id,union_id 或 user_id来@指定人
{"receive_id": "oc_xxx","content": "{\"text\":\"<at user_id=\\\"ou_xxxxxxx\\\"></at> text content\"}","msg_type": "text"
}

在这里插入图片描述

富文本 post

富文本可以在一条消息中同时支持文字、At、图片、视频、超链接等元素。
一个富文本可分多个段落(由多个[]组成),每个段落可由多个元素组成,每个元素由tag和相应的字段描述组成。主要图片元素必须是独立的一个段落。

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"zh_cn\":{\"title\":\"我是一个标题\",\"content\":[[{\"tag\":\"text\",\"text\":\"第一行 :\"},{\"tag\":\"a\",\"href\":\"http://www.feishu.cn\",\"text\":\"超链接\"},{\"tag\":\"at\",\"user_id\":\"ou_1avnmsbv3k45jnk34j5\",\"user_name\":\"tom\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}],[{\"tag\":\"text\",\"text\":\"第二行:\"},{\"tag\":\"text\",\"text\":\"文本测试\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}]]}}","msg_type": "post"
}

在这里插入图片描述

图片 image

{"receive_id": "oc_xxx","content": "{\"image_key\": \"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}",// 图片Key,可通过 上传图片 接口获取image_key。"msg_type": "image"
}

文件 file

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"file_key\":\"file_v2_xxx\"}",// 文件Key,可通过上传文件接口获取文件的 file_key。"msg_type": "file"
}

语音 audio

{"receive_id": "oc_xxx","content": "{\"file_key\":\"file_v2_xxx\"}",// 语音文件Key,可通过上传文件接口获取音频文件的 file_key。"msg_type": "audio"
}

视频 media

{"receive_id": "oc_xxx","content": "{\"file_key\":\"file_v2_xxx\",\"image_key\":\"img_v2_xxx\"}",// 视频文件Key,可通过上传文件接口获取视频文件的 file_key。// 视频封面图片Key,可通过上传图片接口获取图片的image_key。"msg_type": "media"
}

消息卡片 interactive

务必注意content消息内容的构建!!

// 使用卡片JSON发送
{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"config\":{\"wide_screen_mode\":true},\"elements\":[{\"alt\":{\"content\":\"\",\"tag\":\"plain_text\"},\"img_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\",\"tag\":\"img\"},{\"tag\":\"div\",\"text\":{\"content\":\"你是否曾因为一本书而产生心灵共振,开始感悟人生?\\n你有哪些想极力推荐给他人的珍藏书单?\\n\\n加入 **4·23 飞书读书节**,分享你的**挚爱书单**及**读书笔记**,**赢取千元读书礼**!\\n\\n📬 填写问卷,晒出你的珍藏好书\\n😍 想知道其他人都推荐了哪些好书?马上[入群围观](https://open.feishu.cn/)\\n📝 用[读书笔记模板](https://open.feishu.cn/)(桌面端打开),记录你的心得体会\\n🙌 更有惊喜特邀嘉宾 4月12日起带你共读\",\"tag\":\"lark_md\"}},{\"actions\":[{\"tag\":\"button\",\"text\":{\"content\":\"立即推荐好书\",\"tag\":\"plain_text\"},\"type\":\"primary\",\"url\":\"https://open.feishu.cn/\"},{\"tag\":\"button\",\"text\":{\"content\":\"查看活动指南\",\"tag\":\"plain_text\"},\"type\":\"default\",\"url\":\"https://open.feishu.cn/\"}],\"tag\":\"action\"}],\"header\":{\"template\":\"turquoise\",\"title\":{\"content\":\"📚晒挚爱好书,赢读书礼金\",\"tag\":\"plain_text\"}}}","msg_type": "interactive"}// 使用卡片模板template_id发送
{"receive_id": "ou_7d8a6exxxxccs","msg_type": "interactive","content": "{\"type\": \"template\", \"data\": { \"template_id\": \"ctp_xxxxxxxxxxxx\", \"template_variable\": {\"article_title\": \"这是文章标题内容\"} } }"}

在这里插入图片描述

分享群名片 share_chat

{"receive_id": "oc_xxx","content": "{\"chat_id\":\"oc_xxx\"}", // 群ID,获取方式请参见群ID 说明。"msg_type": "share_chat"
}

分享个人名片 share_user

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"user_id\":\"ou_xxx\"}",// 只支持Open ID,且机器人必须对该用户可见,用户的Open ID获取方式请参见了解更多:如何获取 Open ID。"msg_type": "share_user"
}

批量发送消息

给多个用户或者多个部门中的成员发送消息。
注意事项:
应用需要启用机器人能力
接口权限说明:必须拥有获取与发送单聊、群组消息权限,或者以应用的身份发消息权限至少拥有一个批量发送消息权限:给用户发送需要拥有 给多个用户批量发消息 权限给部门成员发送需要拥有 给一个或多个部门的成员批量发消息 权限
通过该接口发送的消息 不支持更新以及回复等操作
只能发送给用户,无法发送给群组
异步接口,会有一定延迟,每个应用待发送的消息按顺序处理,请合理安排批量发送范围和顺序。
单个应用每天通过该接口发送的总消息条数不超过50

消息加急

发送应用内加急

对指定消息进行应用内加急
注意事项:需要开启机器人能力不支持加急批量消息只能加急机器人自己发送的消息加急时机器人需要在加急消息所在的群中加急用户的未读加急总数不能超过200

发送短信加急

对指定消息进行应用内加急与短信加急
注意事项:需要开启机器人能力只能加急机器人自己发送的消息加急时机器人仍需要在加急消息所在的群组中加急用户的未读加急总数不能超过200条通过接口产生的短信加急将消耗企业的加急额度,请慎重调用

发送电话加急

对指定消息进行应用内加急与电话加急。
注意事项:需要开启机器人能力只能加急机器人自己发送的消息加急时机器人需要在加急消息所在的群组中加急用户的未读加急总数不能超过200条通过接口产生的电话加急将消耗企业的加急额度,请慎重调用

springboot核心代码实现

/** Copyright © 2020-2021 Nimbus Corporation All rights reserved.** 使本项目源码前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,* 否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利.** 1、本代码为商业源代码,只允许已授权内部人员查看使用* 2、任何人员无权将代码泄露或者授权给其他未被授权人员使用* 3、任何修改请保留原始作者信息,不得擅自删除及修改** 请保留以上版权信息,否则作者将保留追究法律责任.*/package com.nimbus.messagecenter.util;import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.lark.oapi.Client;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReq;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReqBody;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserResp;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserRespBody;
import com.lark.oapi.service.contact.v3.model.UserContactInfo;
import com.lark.oapi.service.im.v1.model.CreateMessageReq;
import com.lark.oapi.service.im.v1.model.CreateMessageReqBody;
import com.lark.oapi.service.im.v1.model.CreateMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentReceivers;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageResp;
import com.nimbus.common.data.model.api.ApiResultDto;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** FeiShuUtil.** @author zhupeng* @version 1.0.0, 2024/4/9* @since 2024/4/9*/
@Slf4j
public class FeiShuUtil {/*** 通过手机号获取飞书用户信息.** @param phones     手机号* @param userIdType 用户ID类型,openid或user_id.* @param client     飞书客户端* @return 用户信息列表*/public static List<UserContactInfo> getFeiShuUsersByPhones(List<String> phones, String userIdType, Client client) {List<UserContactInfo> userContactInfos = new ArrayList<>();// 批量查询最多一次查询50个List<List<String>> splitPhones = Lists.partition(phones, 50);for (List<String> phone : splitPhones) {BatchGetIdUserReq req = BatchGetIdUserReq.newBuilder().userIdType(userIdType).batchGetIdUserReqBody(BatchGetIdUserReqBody.newBuilder().mobiles(phone.toArray(new String[0])).build()).build();BatchGetIdUserResp resp;try {resp = client.contact().user().batchGetId(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());}BatchGetIdUserRespBody data = resp.getData();if (Objects.nonNull(data)) {userContactInfos.addAll(List.of(data.getUserList()));}}return userContactInfos;}/*** 给指定用户发飞书消息.** @param receiveId     消息接收人:飞书用户id或飞书群号* @param content       消息内容* @param msgType       消息类型* @param receiveIdType 消息接收者id类型:open_id/user_id/union_id/email/chat_id* @param client        飞书客户端* @return 消息发送结果*/public static ApiResultDto sendFeiShuMessage(String receiveId, String content, String msgType, String receiveIdType, Client client) {CreateMessageReq req = CreateMessageReq.newBuilder().receiveIdType(receiveIdType).createMessageReqBody(CreateMessageReqBody.newBuilder().receiveId(receiveId)               // 消息接收人.msgType(msgType)                   // 消息类型.content(content)                   // 消息内容.build()).build();CreateMessageResp resp;try {resp = client.im().message().create(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行消息加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentAppMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentAppMessageReq req = UrgentAppMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentAppMessageResp resp;try {resp = client.im().message().urgentApp(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行短信加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentSmsMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentSmsMessageReq req = UrgentSmsMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentSmsMessageResp resp;try {resp = client.im().message().urgentSms(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行电话加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentPhoneMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentPhoneMessageReq req = UrgentPhoneMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentPhoneMessageResp resp;try {resp = client.im().message().urgentPhone(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript入门--变量

JavaScript入门--变量 一、JS变量二、变量命名三、常量四、局部变量 一、JS变量 定义变量a, b, c&#xff0c;并输出到控制台。 var a 1; var b 13.14; var c hello Js;console.log(a, b, c) //console.log()语句用于输出结果到控制台&#xff0c;类似python的print语句…

【Java】Set集合的基本使用

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数…

Ubuntu无网络标识的解决方法

1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim&#xff0c;两个随意一个&#xff0c;这里用的gedit&#xff0c;没有就先弄gedit&#xff0c;有的话直接下一步 apt-get install gedit 或者vim apt-get ins…

Docker部署Logstash同步Mysql数据到ES

1、准备配置文件文件夹 2、部署logstash & elasticsearch docker pull docker.elastic.co/logstash/logstash:7.15.0 ## 替换{你的ES地址}为ES地址 docker run -d --name logstash -p 5044:5044 -p 9600:9600 -v D:\logstash\data\:/usr/share/logstash/data -v D:\logst…

Flink学习(四)-数据管道 ETL

一、状态转换 map() 只适用于一对一的转换&#xff0c;即对每个进入算子的流元素&#xff0c;map() 将仅输出一个转换后的元素。 flatmap() 可以输出任意数量的元素&#xff0c;也可以一个都不发。 二、Keyed Streams keyBy() 相当于 sql 中的 group by&#xff0c;通过…

图片合成二维码怎么实现?图片二维码的生成技巧

图片合成二维码如何制作呢&#xff1f;现在很多的二维码都会提供图片预览的功能&#xff0c;我们可以用手机扫描二维码来查看图片的信息&#xff0c;比如很多的产品信息、旅游攻略、产品海报等等类型经常会制作这种类型的二维码。 其实图片制作二维码的方法很简单&#xff0c;…

生产者和消费者模型 | 阻塞队列 | 信号量 | 环形队列

文章目录 1.生产者和消费者模型2.生产者和消费者模型优点3.阻塞队列4.POSIX信号量5.基于环形队列的生产消费模型 本文完整的代码放在了这&#xff1a; Gitee链接 1.生产者和消费者模型 生产者和消费者模型&#xff0c;概括起来其实是一个321原则&#xff1a;3是&#xff1a;三…

Spring Boot(04):让你的Spring Boot应用“火力全开”,从零开始学习starter

1. 前言 Spring Boot是一款非常流行的Java开发框架&#xff0c;其具有快速开发、自动化配置、内嵌服务器、易于扩展等特点&#xff0c;因此备受开发者欢迎。在日常开发中&#xff0c;我们经常需要在不同的环境中进行测试和部署&#xff0c;此时&#xff0c;如何实现开发、测试、…

电子方案 红外遥控蜘蛛玩具

东莞市酷得智能科技在消费类电子市场深耕多年&#xff0c;依托于市场团队对市场的敏锐度、工程团队的技术积累、结合自身的创新以及和上游原厂深度合作&#xff0c;在2.4G通信、BLE、语音、马达驱动控制等领域&#xff0c;采用方案代理的模式&#xff0c;形成了自己的多条具有市…

k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例

文章目录 Volumes (依赖本机来实现&#xff09;1.1EmptyDir1.2 HostPath NFS 挂载(依赖远程服务来实现)安装 nfs挂载 NFS 共享目录配置文件 NFS 挂在到容器里去 高级存储 PV与PVC 概念详解PV与PVC 生命周期构建绑定使用回收策略 创建PV与PVC以及关联Pod创建 PersistentVolume&a…

【Python】面向对象(专版提升2)

面向对象 1. 概述1.1面向过程1.2 面向对象 2. 类和对象2.1 语法2.1.1 定义类2.1.2 实例化对象 2.2 实例成员2.2.1 实例变量2.2.2 实例方法2.2.3 跨类调用 3. 三大特征3.1 封装3.1.1 数据角度3.1.2 行为角度3.1.3 案例:信息管理系统3.1.3.1 需求3.1.3.2 分析3.1.3.3 设计 3.2 继…

服务器 安装1Panel服务器运维管理面板

服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径&#xff0c;须以“/”开头&#xff0c;默认&#xff1a;/opt&#xff0c;本例&#xff1a;/www。 出现此提示时输入目标端口&#xff0c;须未被使用的端口&#xff0c;默认&#xff1…

【MYSQL管理工具】数据库备份和恢复

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.MYSQL管理 1.1 系统数据库 1.2 常用工具 1.2.1 mysql 1.2.2 mysqladmin 1.2.3 mysqlbinlog 1.2.4 mysqlshow 1.2.5 mysqldump 1.2.6 mysqlimport/sour…

本地web项目启起来后,无法在浏览器(chrome)看到源码,从而无法打断点;Framework Ignore list

问题描述 本地web项目启起来后&#xff0c;无法在浏览器(chrome)看到源码&#xff0c;从而无法打断点 其他浏览器没看&#xff0c;开发环境一致专注于chrome&#xff08;其余浏览器有测试同事提缺陷了&#xff0c;才会去看&#xff09;&#xff0c;其余浏览器有没有这个问题&…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

AIGC的崛起:定义未来内容创作的新纪元

&#x1f31f;文章目录 &#x1f31f;AIGC简介&#x1f31f; AIGC的相关技术与特点&#x1f31f;AIGC有哪些应用场景&#xff1f;&#x1f31f;AIGC对其他行业影响&#x1f31f;面临的挑战与问题&#x1f31f;AIGC未来发展 &#x1f31f;AIGC十大热门网站推荐&#xff1a; 文心…

吴恩达机器学习-实践实验室:协同过滤推荐系统(Collaborative Filtering Recommender Systems)

在本练习中&#xff0c;您将实现协作过滤&#xff0c;以构建电影推荐系统。 文章目录 1-概念2-推荐系统3-电影评分数据集4-协作过滤学习算法4.1协同过滤成本函数 5-学习电影推荐6-建议7-祝贺 软件包 我们将使用现在熟悉的NumPy和Tensorflow软件包。 import numpy as np import…

调用nltk分词库时出现nltk_data Error loading averaged_perceptron_tagger问题的解决办法

问题描述&#xff1a;运行时出现[nltk_data] Error loading averaged_perceptron_tagger&#xff0c;Name or service not known问题&#xff0c;详见下图。 由于这个问题最近总是困扰开发和调试工作&#xff0c;因此将彻底的解决办法记录如下&#xff0c;如下设置好就不需要漫…

【数据结构】07查找

查找 1. 基本概念2. 顺序表查找2.1 顺序查找2.2 顺序查找优化-哨兵 3. 有序表查找3.1 折半查找&#xff08;二分查找&#xff09; 4. 分块查找&#xff08;索引顺序查找&#xff09;5. Hash表&#xff08;散列表&#xff09;5.1 散列函数的设计5.2 代码实现5.2.1 初始化Hash表5…

装修后快速入住指南,除甲醛的10个小妙招。福州中宅装饰,福州装修

装修后除甲醛的方法有很多种&#xff0c;以下是一些常见的方法&#xff1a; 1. 通风 通风是最基本的除甲醛方法之一&#xff0c;打开窗户让空气流通&#xff0c;可以将室内的甲醛排出。可以在早晨和晚上空气质量较好的时候进行通风。 2. 植物吸收 一些植物如吊兰、常春藤、虎…