如何通过Slack入站Webhook发送独立消息及构建站点数组消息
嘿,我来帮你搞定这个Slack消息的问题!先理理你现在的实现逻辑,再解答你的核心疑问~
你的现有实现梳理
目前你正在做的流程很清晰:
- 调用API拉取网站统计数据
- 分析返回结果,把符合条件的站点筛选出来存入数组
sites - 构建Slack消息,将
sites数组放到消息attachments的fields字段中
你给出的消息结构示例可以整理成代码块更清晰:
"attachments": [ { "fallback": "", "color": "#E50000", "author_name": "title", "title": "metrics recorded", "title_link": "https://mor47992.live.dynatrace.com/#dashboard;id=cc832197-3b50-489e-b2cc-afda34ab6018;gtf=l_7_DAYS", "text": "more title info", "fields": sites, "ts": Date.now(...) } ]
如何发送独立而非连续的Slack消息?
其实Slack入站Webhook本身就是每次请求对应一条独立消息的!如果你之前遇到消息被合并成连续内容的情况,大概率是这几个原因:短时间内发送的消息太相似、用了线程关联字段,或者把多条消息打包成一个请求发送了。要确保每条消息独立,你可以注意这几点:
- 每次消息单独发请求:每一条独立消息都要单独发起一次POST请求到你的Webhook URL,别把多个消息结构合并成一个请求发送。
- 别加线程关联字段:如果你的消息里没有设置
thread_ts(线程时间戳),Slack会默认把每条消息当成全新的独立消息展示,不会归到同一个线程里。 - 给消息加独特标识:如果两条消息的标题、内容完全一致,Slack可能会自动合并它们。所以给每条消息设置不一样的标题、文本,或者用当前秒级时间戳作为
ts值,就能避免这种情况。
举个Node.js的示例代码,帮你直观理解怎么发送独立消息:
const axios = require('axios'); // 封装发送Slack消息的函数 async function sendSingleSlackMsg(message) { const webhookUrl = '你的Slack入站Webhook地址'; try { await axios.post(webhookUrl, message); console.log('独立消息发送成功'); } catch (err) { console.error('消息发送失败:', err); } } // 发送第一条独立消息 const firstMsg = { attachments: [ { fallback: "站点统计通知", color: "#E50000", author_name: "站点监控系统", title: "第一组符合条件的站点", text: "这是第一条独立推送的消息", fields: [{title: "站点A", value: "指标达标", short: true}], ts: Date.now() / 1000 // Slack的ts需要是秒级时间戳,记得转换 } ] }; sendSingleSlackMsg(firstMsg); // 间隔2秒发送第二条独立消息 setTimeout(() => { const secondMsg = { attachments: [ { fallback: "站点统计通知", color: "#00E500", author_name: "站点监控系统", title: "第二组符合条件的站点", text: "这是第二条独立推送的消息", fields: [{title: "站点B", value: "指标达标", short: true}], ts: Date.now() / 1000 } ] }; sendSingleSlackMsg(secondMsg); }, 2000);
如果你的需求是每个符合条件的站点单独发一条消息,那更简单:直接遍历你的sites数组,给每个站点单独构建消息结构,然后逐个调用上面的发送函数就行。
内容的提问来源于stack exchange,提问作者chinds
相关产品推荐
相关产品推荐

