如何通过signal-cli-rest-api的curl请求发送带附件的消息?
解决signal-cli-rest-api发送带JPG附件消息的问题
错误原因
- JSON语法非法:你在
base64_attachments数组里多写了一个多余的右括号")",导致JSON格式无效,触发API的"invalid request"错误 - Bash变量未解析:curl的
-d参数用单引号包裹时,内部的${ENCODED_IMAGE}变量不会被Bash替换为实际的base64编码内容,API收到的是字面量字符串而非有效附件数据
修正后的脚本方案
方案一:直接修正语法与变量展开
将curl命令的单引号改为双引号,转义内部双引号,并移除多余括号:
#!/bin/bash INPUT_FILE="/path/to/file/IMG_5098.JPG" TMPFILE=$(mktemp) base64 "${INPUT_FILE}" --wrap=0 > "${TMPFILE}" ENCODED_IMAGE=$(cat "${TMPFILE}") # 修正后的curl请求 curl -X POST -H "Content-Type: application/json" \ -d "{\"message\": \"Hello World!\", \"base64_attachments\": [\"${ENCODED_IMAGE}\"], \"number\": \"+4900000\", \"recipients\": [\"+4900000000\"]}" \ 'http://localhost:48080/v2/send' rm "${TMPFILE}"
方案二:用jq构造JSON(更可靠)
借助jq工具自动生成规范JSON,避免手动转义的麻烦:
#!/bin/bash INPUT_FILE="/path/to/file/IMG_5098.JPG" # 直接生成无换行的base64编码内容,无需临时文件 ENCODED_IMAGE=$(base64 "${INPUT_FILE}" --wrap=0) # 用jq构造JSON并通过管道传给curl jq -n \ --arg msg "Hello World!" \ --arg num "+4900000" \ --argjson recipients '["+4900000000"]' \ --arg b64_attach "$ENCODED_IMAGE" \ '{ message: $msg, number: $num, recipients: $recipients, base64_attachments: [$b64_attach] }' | curl -X POST -H "Content-Type: application/json" -d @- 'http://localhost:48080/v2/send'
额外说明
base64 --wrap=0确保编码内容无换行符,符合API对附件格式的要求- 若发送到群组,只需将
recipients字段替换为group_id: "你的群组ID"即可
内容的提问来源于stack exchange,提问作者abrocksi
相关产品推荐
相关产品推荐

