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
相关产品推荐
相关产品推荐

