--- pubDatetime: 2024-01-17 10:56:12 title: 计划任务-每日拍照 slug: 计划任务-每日拍照 tags: - "工具" --- 首选docker 搭建的青龙, 青龙可以定时执行脚本并能很好的管控,[青龙控制台](https://ql.malanxi.top/) 用法很简单 ```docker version: '2' services: web: # alpine 基础镜像版本 image: whyour/qinglong:latest # debian-slim 基础镜像版本 # image: whyour/qinglong:debian volumes: - ./data:/ql/data ports: - "0.0.0.0:5700:5700" environment: # 部署路径非必须,以斜杠开头和结尾,比如 /test/ QlBaseUrl: '/' restart: unless-stopped ``` 通过 task day.py 来执行 scripts 下的脚本, 也可以通过绝对路径来执行 ## 本地自动日记上传 本地搭建了 手机上利用dayone写日记 -> 分享到阿里云盘->青龙检测到下载(创建简书)->添加到aligo便于搜索-> 提交到github(青龙环境需要安装github,且.ssh)->cloudflare部署[](malanxi.top) ## 利用 billup 自动上传视频 ## 每日拍照 1. 最先是利用青龙,发现opencv调用硬件, 容器硬件共享特别麻烦 2. 利用nssm.exe, 执行路径不太对 3. 利用windows任务计划程序实现 opencv 调用相机,检测人物是否在相机中间范围,进行拍照, 然后利用简书上传, 利用消息推送图片地址到手机, 中间上传到阿里云盘 ```python import datetime import os import cv2 import qiniu import requests now = datetime.datetime.now() year = now.strftime("%Y") name = now.strftime("%Y-%m-%d") @staticmethod def notice_ding(title, content): json_data = {"title":title,"content":content,} response = requests.post('https://xizhi.qqoq.net/*.send', json=json_data) print(response.json()) dir = r'D:\Administrator\Pictures\profile\{}'.format(year) filename = dir+ r'\{}.jpg'.format(name) def getCookies(): import http.cookies with open(r"D:\mxz\mxz_back\scripts\writenote\cookies.txt", "r", encoding="utf8") as f: raw_cookie_string = f.read() cookies_dict = http.cookies.SimpleCookie() cookies_dict.load(raw_cookie_string) # 转换为 JSON 对象 return {key: morsel.value for key, morsel in cookies_dict.items()} cookies = getCookies() headers = { 'authority': 'www.jianshu.com', 'accept': 'application/json', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'if-none-match': 'W/"4a70973d5c4e6e77e1b7944653a4b13d"', 'referer': 'https://www.jianshu.com/writer', 'sec-ch-ua': '"Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', } def upload_image(file:str): (filepath, filename) = os.path.split(file) print(filename) params = { 'filename': filename, } response = requests.get('https://www.jianshu.com/upload_images/token.json', params=params, cookies=cookies, headers=headers) data = response.json() ret, info = qiniu.put_file(data["token"], data["key"], file) return ret['url'] def take_photo_and_close(): # 打开默认摄像头 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 检查摄像头是否成功打开 if not cap.isOpened(): print("无法打开摄像头") return # 加载 Haarcascades 人脸检测器 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 获取并保存一帧图像 ret, frame = cap.read() if ret: # 将帧转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用 Haarcascades 检测人脸 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 如果检测到人脸,保存照片并退出循环 if len(faces) > 0: x, y, w, h = faces[0] center_x = x + w // 2 center_y = y + h // 2 # # # 图像中央的范围,可以根据需要进行调整 central_range = 500 # 如果人脸在图像中央范围内,保存照片并退出循环 is_center = abs(center_x - frame.shape[1] // 2) < central_range and abs(center_y - frame.shape[0] // 2) < central_range if is_center: # 将图片保存至指定路径 if not os.path.exists(dir): os.makedirs(dir) cv2.imwrite(filename, frame) from aligo import Aligo aligo = Aligo() file = aligo.upload_file(file_path=filename, parent_file_id="65a00c994b40f9930e854649bc593690b9ed155a") url = upload_image(filename) # 输出信息 print("已成功拍照并保存到目录:{}".format(dir)) notice_ding("已成功拍照并保存到目录", "![]({})".format(url)) # 显示视频流 # cv2.imshow('Video', frame) # 关闭摄像头 cap.release() cv2.destroyAllWindows() if __name__ == '__main__': # 运行拍照并关闭摄像头的函数 if not os.path.exists(filename): take_photo_and_close() ``` 由于执行python 会弹出控制台, 可以利用vbs解决 ```shell Set objShell = CreateObject("WScript.Shell") objShell.Run "python D:\mxz\mxz_back\scripts\day\day_photo.py", 0, True WScript.Quit ```