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

Slack Webhook API忽略icon_url值问题求助

问题描述

我按照Slack 2023年推荐的方式创建了自定义应用的hooks.slack.com/services Webhook,消息流转流程为:AWS SNS event -> Lambda -> Slack hook -> Slack频道消息。我编写了Python版AWS Lambda函数,用于消费SNS事件消息并格式化后发送至该Webhook,但设置icon_url后,Slack频道收到的消息仍使用默认图标,该配置被忽略,请问如何修改消息图标?

对应的Lambda代码如下:

import http.client
import json

def lambda_handler(event, context):
    url = "https://hooks.slack.com/services/<myurl>"
    headers = {"Content-type": "application/json"}
    
    msg = {
        "channel": "<my-channel-name>",
        "icon_url": "<my image url>",
        "blocks": [
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": "*Alarm:* " + event["Records"][0]["Sns"]["Subject"]
                    }
                ]
            },
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": "*Message:* " + event["Records"][0]["Sns"]["Message"]
                    }
                ]
            }
        ]
    }
    
    encoded_msg = json.dumps(msg).encode("utf-8")

    conn = http.client.HTTPSConnection("hooks.slack.com")
    conn.request("POST", url, encoded_msg, headers)
    response = conn.getresponse()

    print({
        "message": event["Records"][0]["Sns"]["Message"],
        "status_code": response.status,
        "response": response.read().decode()
    })
解决方案

原因说明

自定义应用创建的Incoming Webhook不支持通过消息payload里的icon_url/icon_emoji参数覆盖图标——这些参数仅对旧版Legacy Incoming Webhook生效。自定义应用的Webhook,消息图标默认继承自应用本身的配置。

方案一:修改应用图标(简单通用)

如果所有通过该Webhook发送的消息都使用同一图标,直接修改应用配置即可:

  • 登录Slack开发者平台,找到目标自定义应用
  • 进入Settings > Basic Information页面
  • 在Display Information区域,点击App Icon旁的上传按钮,替换为你需要的图标
  • 保存后,后续通过该Webhook发送的消息会自动使用新图标

方案二:使用Chat API实现动态图标(支持自定义)

如果需要根据消息内容切换不同图标,需改用Slack的chat.postMessage API,配合应用的Bot Token调用,此时icon_url/icon_emoji参数会生效。修改后的Lambda代码示例如下:

import http.client
import json

def lambda_handler(event, context):
    # 替换为你的Bot Token(从应用OAuth & Permissions页面获取)
    bot_token = "xoxb-xxxxxx-xxxxxx-xxxxxx"
    headers = {
        "Content-type": "application/json",
        "Authorization": f"Bearer {bot_token}"
    }
    
    sns_subject = event["Records"][0]["Sns"]["Subject"]
    sns_message = event["Records"][0]["Sns"]["Message"]
    
    msg = {
        "channel": "<my-channel-name>",
        "icon_url": "<my image url>",  # 该配置现在会生效
        "blocks": [
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": f"*Alarm:* {sns_subject}"
                    }
                ]
            },
            {
                "type": "section",
                "fields": [
                    {
                        "type": "mrkdwn",
                        "text": f"*Message:* {sns_message}"
                    }
                ]
            }
        ]
    }
    
    encoded_msg = json.dumps(msg).encode("utf-8")

    # 调用Slack Chat API
    conn = http.client.HTTPSConnection("slack.com")
    conn.request("POST", "/api/chat.postMessage", encoded_msg, headers)
    response = conn.getresponse()

    print({
        "message": sns_message,
        "status_code": response.status,
        "response": response.read().decode()
    })

使用该方案前,需给Slack应用添加chat:write权限,并将应用安装到目标工作区以获取Bot Token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:53:20