slack events api通过一条消息多次触发

Posted

技术标签:

【中文标题】slack events api通过一条消息多次触发【英文标题】:slack events api triggers multiple times by one message 【发布时间】:2018-11-15 20:14:42 【问题描述】:

我正在使用 Slack API 从 Slack 工作区获取链接。它可以工作,除非在发布消息时触发不止一次。每次。这是我的代码:

exports.slack = (req , res) =>     
var message = req.body;

if (message.challenge) 
     res.send(message.challenge);

 else if (message.event.type == 'message_received') 
    if (message.event.text.includes('<')) 
        // Link
        console.log('NEW LINK');

        var link = message.event.text.slice(1, -1); 

        getArticleInfo(link, (error, body) => 
            if (error) 
                console.error(error);
            else 
                newArticleToDB(body , link, req);
            
        );  
    
   

每次发布​​新消息时,我都会多次收到“新链接”日志。任何想法在哪里寻找这个问题?

谢谢。

【问题讨论】:

有事件ID吗?也许您可以尝试检查收到的事件是否具有与之前的事件不同的事件,例如if(message.event.id != lasteventid) run even handler ,通过 ID 我的意思是某种数字随着每个收到的事件而改变或增加 @stetoc 刚刚检查过,当发布一条消息时,每个消息 ID 都不同。所以还是会触发多次。 也许问题出在您在此处作为代码发布的内容之外?也许你多次添加一些处理程序?你检查了吗? @stetoc 是的,我删除了所有 if 语句,只是控制台记录了“消息”,但我仍然收到多个日志。 如果你没有通过某种 HTTP 200 OK 确认请求,那么 Slack 会认为你没有收到它并重试几次请求。见api.slack.com/events-api#graceful_retries 【参考方案1】:

我添加了res.sendStatus(200),现在一切正常。代码如下:

exports.slack = (req , res) =>     
var message = req.body;
res.sendStatus(200);

if (message.challenge) 
    res.send(message.challenge);

 else if (message.event.type == 'message' && message.event.subtype != 'message_changed') 
    if (message.event.text && message.event.text.includes('<')) 
        // Link
        console.log('NEW LINK');

        var link = message.event.text.slice(1, -1); 

        getArticleInfo(link, (error, body) => 
            if (error) 
                console.error(error);
            else 
                newArticleToDB(body , link, req);
            
        );  
    

【讨论】:

我尝试了res.sendStatus(200),但没有成功。对我来说,res.json(ok:true); 有效。【参考方案2】:

我遇到了问题,感谢@taylor-singletary 的建议。 我必须打印

console.log('Request Headers::: ', JSON.stringify(req.headers));

寻找

"x-slack-retry-num":"1"

要获取header值,只需参考这个问题:How to extract request http headers from a request using NodeJS connect

【讨论】:

我认为标题名称是“X-Slack-Retry-Num”【参考方案3】:

我在接收多个事件时遇到了同样的问题。事实证明,我添加的每个机器人用户事件都会收到 1 个事件。我不知道这是否是 API 的预期行为,但我决定删除除 app_mention 之外的所有事件,现在我只收到 1 个事件。

【讨论】:

以上是关于slack events api通过一条消息多次触发的主要内容,如果未能解决你的问题,请参考以下文章

Slack API - 向个人空间(您)发送直接消息

除了[消息]之外,如何调用Slack API中的任何其他事件?

Slack API - 将我的最新消息发送给用户

如何让机器人响应/响应 slack 中传入的 webhook 消息?

如何将 Slack 机器人扩展到 1000 个团队

Python asyncio 与 Slack 机器人