使用 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的主要内容,如果未能解决你的问题,请参考以下文章

通过 Camera API 2 捕获图片并将其保存为位图

CKEditor 和 C# Web API,使用简单的上传插件上传图片

通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片

用 Flutter 实现动画 Motion Design

如何在 Android Studio 2019 中捕获图片而不进行预览

尝试在未附加到活动时使用权限 API