我已经设置了一个 Slack Bot,它正在与 AWS Lambda 交互,运行良好。从 lambda 中,返回一条文本消息并在适当的通道或线程中相应地打印。到目前为止,一切都很好。现在我希望 lambda 添加提醒,因此我给了它提醒:写入和提醒:读取(可选)范围。
但是,lambda(请使用 link 重现错误)和 Slack API 测试器(用于测试)都返回:
not_allowed_token_type
,尽管我使用的是 xoxb-XXXX-XXXX-XXXX
令牌。
最后的提醒应该相当于:
/remind #bot-testing "@EC2Handler Stop EC2 Instance" in 30 seconds
EC2Handler 是我的 Slack 应用程序机器人。
知道为什么我会收到此错误吗?
我也在我的代码和网络测试器中遇到了这个错误。我还没有在我的 oauth 中设置这些权限,但预计会出现权限错误而不是令牌类型。能够使用许多其他 slack api 方法
答案:经过进一步的工作,我发现了两件事:
xoxb
不是正确的密钥类型,而是 xoxp
,这是用户 oauth-token。reminders.add
方法无法直接从 lambda 添加机器人提醒。请参阅此线程。作为解决方法,我让 lambda 设置一个一般提醒,而不是针对我自制的机器人。按照这种方法,slack-bot(slack 自带的,不是我自制的机器人)会将提醒打印到频道中。发布的消息会触发我的第一个 lambda 函数(第一个函数响应 200 HTTP 并将事件转发给第二个 lambda)。在第一个 lambda 函数中,我过滤所有发布的消息(例如用户 ID 或触发器类型),以便只有重要的消息才会在第二个 lambda 中实际处理,从而导致设置新的提醒。 这是我的 lambda 中创建提醒的 python 函数:
def set_slack_reminder(event, text, time):
SLACK_ADD_REMINDER_URL = "https://slack.com/api/reminders.add"
channel = event.get("channel")
token = "xoxp-482390518102-512900236624-6417578916384-359738ad2ab19b62c8d77d6507755647"
# Get list of reminders
reminder_list = get_slack_reminders(token)
print(f"Reminder list:\n {reminder_list}\n")
if reminder_list is not None:
# Delete old reminders in the channel with the EC2Handler-Bot
delete_reminders(token, reminder_list, channel)
reminder_data = {
"token": token,
"channel": channel,
"text": text,
"time": time,
}
# Make the request to add the reminder
add_reminder_request = urllib.request.Request(SLACK_ADD_REMINDER_URL, data=urllib.parse.urlencode(reminder_data).encode("ascii"), method="POST")
add_reminder_request.add_header("Content-Type", "application/x-www-form-urlencoded")
print('Fire off the reminder request!')
add_reminder_response = urllib.request.urlopen(add_reminder_request).read()
print(add_reminder_response)