slackeventsapi.server.SlackEventAdapterException 中请求时间戳无效

问题描述 投票:0回答:1

我正在尝试创建我的第一个 Slack 机器人,它使用 Flask 作为服务器来生成对机器人通道中消息的响应。简而言之,我的步骤是:

  • 创建 Slack 应用程序,创建事件订阅(提及、消息等),获取所有必要的密钥
  • 使用
    ngrok
    工具创建事件订阅,该工具将响应从本地运行的 Flask 应用程序传输到公共 URL
  • 编写机器人逻辑并将其放入 Flask 应用程序中

一切都很好

ngrok
但是当我尝试生产服务器时,我无法验证获取消息的请求 URL
Your URL didn't respond with the value of the challenge parameter.
经过一番阅读后,我想也许我需要实现返回该参数的专用方法。这次我将逻辑简化为一个非常简单的实现,但我仍然收到另一个错误
slackeventsapi.server.SlackEventAdapterException: Invalid request timestamp
。这是我的实现:

import os
from flask import Flask, request
from slackeventsapi import SlackEventAdapter
app = Flask(__name__)
slack_bot_user_id = os.getenv('SLACK_BOT_USER_ID')
slack_events_adapter = SlackEventAdapter(os.getenv('SLACK_SIGNING_SECRET'), '/slack/events', app)


@app.route('/slack/events', methods=['POST'])
def get_events():
    # print(request)
    return request.json['challenge']


@slack_events_adapter.on('message')
def handle_message(event_data):
    print(event_data)


if __name__ == '__main__':
    app.run(port=8000, host='0.0.0.0')

我认为我正在遵循类似于

slackeventsapi
python 包存储库中的指南,并且根据我的理解,它如下:

  • 在第 6 行中,我定义了一个适配器,用于连接 Flask 服务器应用程序和 Slack 应用程序
  • 在第 9-13 行中,我定义了一个函数,它将根据事件 API 的请求返回“挑战”标志
  • (第15-17行是实际逻辑实现的占位符;当应用程序验证成功时将被填充)。

我尝试使用命令测试应用程序

curl -X POST -d '{"challenge": "empty"}' -H "Content-Type: application/json" 127.0.0.1:8000/slack/events

并获取永远不会进入

get_events
函数内部的错误回溯:

Traceback (most recent call last):
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/flask/app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/flask/app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/slackeventsapi/server.py", line 94, in event
    self.emitter.emit('error', slack_exception)
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/pyee/base.py", line 211, in emit
    self._emit_handle_potential_error(event, args[0] if args else None)
  File "/Users/rsuleimanov/Documents/llm_deeds/langchainenv/lib/python3.9/site-packages/pyee/base.py", line 169, in _emit_handle_potential_error
    raise error
slackeventsapi.server.SlackEventAdapterException: Invalid request timestamp

我缺少什么以及解决方案是什么样的?

UPD:我可以采取一种解决方法,像

-H "X-Slack-Request-Timestamp: 1717762997"
一样传递标头,但随后会遇到错误
Invalid request signature
(遵循that逻辑),我认为我可以解决这个问题,但我仍然确信不是这样的应该处理。那么主要问题来了:如何通过 slack events 验证?

python flask slack-api
1个回答
0
投票

如果您将 slackeventsapi python 包与 ngrok 一起使用,那么您不需要添加以下代码 -

@app.route('/slack/events', methods=['POST'])
def get_events():
  # print(request)
  return request.json['challenge']

如果没有上述代码,您的应用程序应该可以正常工作。 我在 python Flask 中有一个类似的 app 与 ngrok 一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.