使用 Motion 将捕获的图片发布到 API - rpi4
Posted
技术标签:
【中文标题】使用 Motion 将捕获的图片发布到 API - rpi4【英文标题】:Using Motion to Post pictures captured to API - rpi4 【发布时间】:2020-02-11 18:16:59 【问题描述】:我正在尝试构建一个程序,该程序会自动将通过运动从我的 USB 网络摄像头拍摄的照片发布到休息 API,但遇到了一些问题。我的直播工作正常,并且在所需时间拍照。 我有我的脚本可以在此处发布照片:
on_picture_save home/pi/Documents/on_picture_save.py
(是的,分号被删除)
我怎样才能让脚本使用刚刚保存的文件,或者让它自动执行,所以我只需要做这样的事情?:
import requests
url = "https://api.emotuit.com/upload"
r = requests.post(url)
print(r.text)
所有运动保存的目标目录是home/pi/Monitor,照片根据事件的时间保存在自己的目录中如下:
picture_filename %v_%Y-%m-%d-%H:%M/%q
任何想法都将不胜感激,谢谢!
更新:我发现了代码在命令行中的工作方式,并将其更改为更简单:
on_picture_save curl -X POST api.link.com/here -F 'files=@/path/to/file/here.jpg;type=image.jpg'
我仍然会在打印结果时遇到问题,所以如果有任何关于如何通过额外的 .py 文件来做到这一点的建议。
【问题讨论】:
也许它可以使用参数on_picture_save.py filename
运行,然后 ypu 可以将其输入\代码为sys.argv[1]
我不确定,但motion
可以选择为上次创建的图片创建别名latest.jpg
,然后您就不必知道它的名称。最终,您可以获得所有文件名 os.listdir()
和 sort()
它们 - 然后列表中的最后一个文件应该是最新的。
motion doc: "在 target_dir 中创建了一个名为 lastsnap.jpg 的符号链接,它始终指向最新的快照"
motion doc - on_picture_save: 使用 %f 将文件名(带完整路径)传递给命令。
我已经让它在命令行中工作了: -X POST api.link.com/here -F 'files=@/path/to/file/here.jpg;type=image.jpg' 所以我刚刚将它添加到 on_picture_save 行进行测试。但是,我仍然需要打印我的结果,所以我不确定它是如何工作的。感谢您的意见!
【参考方案1】:
根据on_picture_save 文档,您可以在命令中使用%f
on_picture_save home/pi/Documents/on_picture_save.py %f
它应该发送带有完整路径的文件名作为参数,你可以得到sys.argv[1]
import sys
print(sys.argv[1])
您也可以使用其他Conversion Specifiers发送其他信息。
顺便说一句:在snapshot_filename 的文档中你也可以看到
在 target_dir 中创建了一个名为 lastsnap.jpg 的符号链接,并且 将始终指向最新的快照,除非 snapshot_filename 是 完全是'lastsnap'
所以你可以得到最后一张图片 lastsnap.jpg
编辑:看来你有 curl 命令
curl -X POST api.link.com/here -F 'files=@/path/to/file/here.jpg;type=image.jpg'
可以在http://curl.trillworks.com上转换成Python的请求
sys.argv[1]
可能是
import sys
import requests
files = 'files': (sys.argv[1], open(sys.argv[1], 'rb'))
response = requests.post('http://api.link.com/here', files=files)
data = response.json()
print(data)
#print(data["???"])
但它无法访问您的屏幕,您也看不到它。您只能将其保存在文件中并创建其他程序(您在桌面上手动运行)来读取和显示它。
我使用的是 MQTT 队列而不是文件。
on_picture_save
正在向队列发送数据,而家中的其他本地计算机正在桌面上运行脚本,该脚本会定期从队列中获取数据并显示在桌面上。
mosquitto 作为服务器/代理和命令行客户端进行测试(或与bash
脚本一起使用)
和 Paho MQTT 作为 Python 的模块来使用 MQTT。
import sys
import requests
import paho.mqtt.client as mqtt
files = 'files': (sys.argv[1], open(sys.argv[1], 'rb'))
response = requests.post('http://api.link.com/here', files=files)
data = response.json()
client = mqtt.Client()
client.connect('localhost') # or IP of other computer with MQTT server/broker
client.publish('last', sys.argv[1], retain=True)
#client.publish('data', str(data["???"]), retain=True)
【讨论】:
感谢您的输入,根据我之前评论中的信息和您的回答,我仍然需要打印我的结果。我不确定这将如何工作,因为它以 json 格式返回,所以我不知道它会在哪里打印。再次感谢 我添加了有关MQTT
队列的信息,我使用该队列将信息从 RPi 发送到其他几台计算机。其他计算机必须运行脚本,定期检查队列并在桌面上以弹出窗口的形式显示新信息。
知道了,我会调查的。谢谢以上是关于使用 Motion 将捕获的图片发布到 API - rpi4的主要内容,如果未能解决你的问题,请参考以下文章
CKEditor 和 C# Web API,使用简单的上传插件上传图片
通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片