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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:12