You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda调用Slack files.upload返回invalid_auth错误如何解决

问题原因

  • 核心错误是files.upload接口的token传参位置不对:你将SLACK_TOKEN放在了params参数中作为URL查询参数传递,Slack的文件上传接口在接收multipart表单类型的请求时,不会读取URL中的身份凭证,只会校验请求体表单字段或请求头中的token值,因此返回invalid_auth错误。
  • 你的本地curl测试将token放在--form参数即请求体中,调用chat.postMessage接口时也将token放在data参数即请求体中,因此这两个场景都能请求成功,只有Lambda中文件上传的代码传参逻辑错误。
  • 另外你提供的代码还存在缩进错误、dialogs变量未定义的语法问题,也需要同步修复。

解决方案

调整参数传递逻辑,将所有表单字段放在请求体中,同时修复语法问题,修正后的代码如下:

import os
import requests

def lambda_handler(event, context):
    SLACK_TOKEN = os.environ['SLACK_TOKEN']
    SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
    # 此处替换为你实际的dialogs字符串内容
    dialogs = "需要上传的对话内容"

    # 所有表单参数放在data中,不要放到params里
    data = {
        "token": SLACK_TOKEN,
        "channels": SLACK_CHANNEL,
        "title": "Dialog_Bot",
        "initial_comment": "New post"
    }

    # 使用with上下文管理自动处理文件关闭,避免资源泄漏
    with open('/tmp/Slack.txt','w+b') as f:
        f.write(dialogs.encode('utf-8'))
    
    with open('/tmp/Slack.txt', 'rb') as file_obj:
        files = {'file': ('Slack.txt', file_obj, 'text/plain')}
        # 提交请求时传入data参数,不要传params
        response = requests.post(url="https://slack.com/api/files.upload", data=data, files=files)
    
    print(response.text)

可选安全优化方案

你也可以选择将token放在HTTP请求头中传递,避免token出现在表单日志或链路记录中,调整后的代码片段如下:

# 构造授权头,不用在data中传token字段
headers = {
    "Authorization": f"Bearer {SLACK_TOKEN}"
}
data = {
    "channels": SLACK_CHANNEL,
    "title": "Dialog_Bot",
    "initial_comment": "New post"
}
response = requests.post(url="https://slack.com/api/files.upload", headers=headers, data=data, files=files)

内容的提问来源于stack exchange,提问作者hagiohagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:36:02