如何通过Google App Script从URL上传图片至Slack而非仅链接?
解决方案
要保留每小时的图片历史,你需要把图片上传到Slack服务器,而不是仅发送图片链接。因为Slack不会缓存外部链接的图片,每次打开历史消息都会重新加载当前URL的最新内容,导致旧消息显示新图片。改用Slack的files.upload API就能解决这个问题,步骤如下:
1. 准备Slack Bot Token
- 在Slack开发者后台创建Bot,申请
files:write权限(用于上传文件) - 复制生成的Bot Token(格式为
xoxb-xxx)
2. 修改Google App Script代码
替换原来的Webhook调用逻辑,改为先抓取图片二进制数据,再调用files.upload接口上传:
function SendToSlack() { // 配置参数 const SLACK_BOT_TOKEN = "xoxb-你的BotToken"; const IMAGE_URL = "https://imageurl"; // 你的图片源URL const CHANNEL_NAME = "updates"; // 目标频道名或ID const MESSAGE_TEXT = "Hourly Update"; // 附带的消息文本 try { // 1. 抓取图片的二进制数据 const imageResponse = UrlFetchApp.fetch(IMAGE_URL, { muteHttpExceptions: true }); if (imageResponse.getResponseCode() !== 200) { throw new Error(`获取图片失败,状态码:${imageResponse.getResponseCode()}`); } const imageBlob = imageResponse.getBlob(); // 2. 调用Slack files.upload API上传图片 const payload = { channels: CHANNEL_NAME, initial_comment: MESSAGE_TEXT, file: imageBlob, filename: `hourly_update_${new Date().toISOString().slice(0, 19)}.png`, // 用时间戳命名,方便区分历史 title: "Hourly Update Image" }; const options = { method: "post", headers: { Authorization: `Bearer ${SLACK_BOT_TOKEN}` }, payload: payload, muteHttpExceptions: true }; const slackResponse = UrlFetchApp.fetch("https://slack.com/api/files.upload", options); const responseData = JSON.parse(slackResponse.getContentText()); if (!responseData.ok) { throw new Error(`Slack上传失败:${responseData.error}`); } console.log("图片上传成功"); } catch (error) { console.error("执行出错:", error.message); } }
关键说明
- 上传后的图片会永久存储在Slack服务器,历史消息中显示的是当时上传的版本,不会随原URL更新而变化
- 用时间戳作为文件名,能快速区分不同时段的历史图片
- 确保Bot Token拥有
files:write权限,否则会出现权限错误
内容的提问来源于stack exchange,提问作者MJB
相关产品推荐
相关产品推荐

