使用curl读取本地文件配置motion/motioneye text_left失败求助
天气数据接入Motion/MotionEye的问题解决
问题背景
已确认可以通过硬编码文本的方式,成功调用Motion API将文本嵌入图片/延时摄影:
curl http://192.168.0.168:7999/1/config/set?text_left="TESTING_PLEASE_STANDBY"
但本地Camdata.txt文件中的天气数据(内容为:Temp: 7.2°C - Press: 973.9 hPa - Hum: 88% - Wind: 5 mph(SW) - Rain: 2.3 mm - UV Index: 0.0 - SolarRad: 0 W/m² - CloudBase: 759 ft)无法通过curl传入Motion,尝试多种命令均失败:
# 尝试1:使用--data读取文件 curl --data "@Camdata.txt" http://192.168.0.168:7999/1/config/set?text_left # 错误输出:curl: (52) Empty reply from server # 尝试2:指定text_left为空值后传入文件 curl --data "@Camdata.txt" http://192.168.0.168:7999/1/config/set?text_left= # 错误输出:curl: (52) Empty reply from server # 尝试3:错误的文件内容引用方式 curl -d "$(Camdata.txt)" http://192.168.0.168:7999/1/config/set?text_left= # 错误输出:-bash: Camdata.txt: command not found; curl: (52) Empty reply from server
参考REST API代码
提供的参考代码逻辑是拉取外部API数据后编码传入,我们可以复用其编码和请求方式:
TEXTLEFT=`curl --insecure --silent http://localhost:8181/weather/api/realtime/latest/metar` TEXTLEFT="${TEXTLEFT// /%20}" # 替换空格为URL编码%20 curl --silent "http://localhost:8080/101/config/set%3Ftext_left=$TEXTLEFT"
解决方案
核心逻辑是读取本地文件内容到变量,对空格进行URL编码,再通过GET请求的查询字符串传入(Motion的该API仅接受GET参数,不支持POST的--data方式)。
分步命令
# 1. 读取Camdata.txt内容到变量,自动去除末尾换行符 TEXTLEFT=$(<Camdata.txt) # 2. 将文本中的所有空格替换为URL编码的%20 TEXTLEFT="${TEXTLEFT// /%20}" # 3. 调用Motion API传入编码后的文本 curl --silent "http://192.168.0.168:7999/1/config/set?text_left=$TEXTLEFT"
单行简化命令
如果需要一次性执行,可合并为:
curl --silent "http://192.168.0.168:7999/1/config/set?text_left=$(sed 's/ /%20/g' Camdata.txt | tr -d '\n')"
说明:
sed 's/ /%20/g'实现空格替换为%20,tr -d '\n'去除文件末尾的换行符,避免传入无效字符。
内容的提问来源于stack exchange,提问作者Ian Harvie
相关产品推荐
相关产品推荐

