Skip to content

Instantly share code, notes, and snippets.

@brunojppb
Created January 30, 2021 10:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brunojppb/b582f1cc3f3efa63da9de5f826db773c to your computer and use it in GitHub Desktop.
Save brunojppb/b582f1cc3f3efa63da9de5f826db773c to your computer and use it in GitHub Desktop.
Upload a file to Slack via console. Useful for one-off CI pipelines
#!/usr/bin/env bash
# This bash script makes use of the Slack API to upload files.
# I found this useful due to the fact that the attachement option
# available in incoming webhooks seems to have an upper limit of
# content size, which is way too small.
#
# See also: https://api.slack.com/methods/files.upload
# safety first
set -euf -o pipefail
echo='echo -e'
Usage() {
${echo}
${echo} "\tusage:\n\t\t$0 [OPTIONS]"
${echo}
${echo} "Required:"
${echo} " -c CHANNEL\tSlack channel to post to"
${echo} " -f FILENAME\tName of file to upload"
${echo} " -s SLACK_TOKEN\tAPI auth token"
${echo}
${echo} "Optional:"
${echo} " -u API_URL\tSlack API endpoint to use (default: https://slack.com/api/files.upload)"
${echo} " -h \tPrint help"
${echo} " -m TYPE\tFile type (see https://api.slack.com/types/file#file_types)"
${echo} " -n TITLE\tTitle for slack post"
${echo} " -v \tVerbose mode"
${echo} " -x COMMENT\tAdd a comment to the file"
${echo}
exit ${1:-$USAGE}
}
# Exit Vars
: ${HELP:=0}
: ${USAGE:=1}
# Default Vars
API_URL='https://slack.com/api/files.upload'
CURL_OPTS='-s'
# main
while getopts :c:f:s:u:hm:n:vx: OPT; do
case ${OPT} in
c)
CHANNEL="$OPTARG"
;;
f)
FILENAME="$OPTARG"
SHORT_FILENAME=$(basename ${FILENAME})
;;
s)
SLACK_TOKEN="$OPTARG"
;;
u)
API_URL="$OPTARG"
;;
h)
Usage ${HELP}
;;
m)
CURL_OPTS="${CURL_OPTS} -F filetype=${OPTARG}"
;;
n)
CURL_OPTS="${CURL_OPTS} -F title='${OPTARG}'"
;;
v)
CURL_OPTS="${CURL_OPTS} -v"
;;
x)
CURL_OPTS="${CURL_OPTS} -F initial_comment='${OPTARG}'"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
Usage ${USAGE}
;;
esac
done
if [[ ( "${CHANNEL}" != "#"* ) && ( "${CHANNEL}" != "@"* ) ]]; then
CHANNEL="#${CHANNEL}"
fi
# had to use eval to avoid strange whitespace behavior in options
eval curl $CURL_OPTS \
--max-time 600 \
--connect-timeout 60 \
--form-string channels=${CHANNEL} \
-F file=@${FILENAME} \
-F filename=${SHORT_FILENAME} \
-F token=${SLACK_TOKEN} \
${API_URL}
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment