我正在尝试创建我的第一个 Slack 机器人,它使用 Flask 作为服务器来生成对机器人通道中消息的响应。简而言之,我的步骤是:
ngrok
工具创建事件订阅,该工具将响应从本地运行的 Flask 应用程序传输到公共 URL 一切都很好
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 包存储库中的指南,并且根据我的理解,它如下:
我尝试使用命令测试应用程序
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 验证?
如果您将 slackeventsapi python 包与 ngrok 一起使用,那么您不需要添加以下代码 -
@app.route('/slack/events', methods=['POST'])
def get_events():
# print(request)
return request.json['challenge']
如果没有上述代码,您的应用程序应该可以正常工作。 我在 python Flask 中有一个类似的 app 与 ngrok 一起使用。