使用Python控制攝像頭拍照并發(fā)郵件
o1 前言
為什么會(huì)有寫這個(gè)程序的想法呢?
最初的想法是寫一個(gè)可以用電腦前置攝像頭拍照的程序,在舍友使用你電腦的時(shí)候,不經(jīng)意間獲取到一大堆奇葩舍友的表情包。
然后我又突發(fā)奇想,要不搞個(gè)開機(jī)啟動(dòng)吧,這樣我就可以看到是誰(shuí)開啟了我的電腦啦。
然后,突(nao)發(fā)(dong)奇(da)想(kai)的我又想到萬(wàn)一我電腦不在身邊怎么辦?要不再加個(gè)郵件發(fā)送機(jī)制吧,開機(jī)拍到照片再郵件發(fā)送給我?哈哈
02 工具
•deepin 15.9
•好看好用的國(guó)產(chǎn)linux系統(tǒng)
•python 2.7或者3.6
•解釋器,哪個(gè)版本都可以,我選擇3.6
•smtplib
•用來(lái)發(fā)送郵件
•email
•用來(lái)構(gòu)造郵件內(nèi)容的庫(kù)
•opencv
•用來(lái)調(diào)取攝像頭拍攝照片
•time
•獲取開機(jī)以及拍照的時(shí)間
•os
•判斷網(wǎng)絡(luò)連接
•獲取腳本路徑
•sys
•判斷網(wǎng)絡(luò)是否聯(lián)通
03 思路
•1.用opencv庫(kù)調(diào)用攝像頭拍照保存為文件。
•2.檢查網(wǎng)絡(luò)是否連接,未連接則圖片保存到本地。
•3.用email庫(kù)構(gòu)造郵件內(nèi)容,把保存的照片以附件的形式插入到郵件內(nèi)容中。
•4.用smtplib庫(kù)發(fā)送郵件給指定郵件接收者。
•5.實(shí)現(xiàn)腳本開機(jī)自啟動(dòng)。
04 安裝及導(dǎo)入所使用的包
首先當(dāng)然是安裝opencv啦。
其他的email、smtplib、sys、os、time為python默認(rèn)安裝的包,我們只需要導(dǎo)入即可。
如果是python3.6安裝opencv就在終端輸入:
pip3 install opencv-python
如果是python2.7安裝opencv,就在終端輸入:
pip install opencv-python
安裝完成后,我們導(dǎo)入必要的包。
各個(gè)包的作用在前文已經(jīng)講過(guò),不再多言。
email 我們只需要部分功能,所以選擇性導(dǎo)入
import cv2 import smtplib import sys import os import time from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText
05 設(shè)置參數(shù)
將smtp服務(wù)器,登錄郵箱賬號(hào)及密碼,收件人,腳本路徑等設(shè)置為全局變量。方便以后程序移植與修改。
smtpserver = 'smtp.163.com' # smtp服務(wù)器 username = '888888888@163.com' # 發(fā)件郵箱賬號(hào) password = '888888888' # 郵箱登錄密碼 sender = '888888888@163.com' # 發(fā)件人 addressee = '999999999@qq.com' # 收件人 exit_count = 5 # 嘗試聯(lián)網(wǎng)次數(shù) path = os.getcwd() #獲取圖片保存路徑
注:很多郵箱為了安全起見,不會(huì)使用真實(shí)的登錄密碼,而是要使用授權(quán)碼,在QQ郵箱的設(shè)置里面可以找到生成授權(quán)碼選項(xiàng)。
06 實(shí)現(xiàn)拍照
def getPicture(): cap = cv2.VideoCapture(0) ret, frame = cap.read() cv2.imwrite(path+'/person.jpg', frame) # 關(guān)閉攝像頭 cap.release()
07 構(gòu)造郵件內(nèi)容
def setMsg(): # 下面依次為郵件類型,主題,發(fā)件人和收件人。 msg = MIMEMultipart('mixed') msg['Subject'] = '電腦已經(jīng)啟動(dòng)' msg['From'] = '88888888888@163.com <88888888888@163.com>' msg['To'] = addressee # 下面為郵件的正文 text = "主人,你的電腦已經(jīng)開機(jī)! 照片如下!" text_plain = MIMEText(text, 'plain', 'utf-8') msg.attach(text_plain) # 構(gòu)造圖片鏈接 sendimagefile = open(path+'/person.jpg', 'rb').read() image = MIMEImage(sendimagefile) # 下面一句將收件人看到的附件照片名稱改為people.png。 image["Content-Disposition"] = 'attachment; filename="people.png"' msg.attach(image) return msg.as_string()
08 實(shí)現(xiàn)郵件發(fā)送
def sendEmail(msg): # 發(fā)送郵件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, addressee, msg) smtp.quit()
09 判斷網(wǎng)絡(luò)聯(lián)通狀態(tài)
判斷網(wǎng)絡(luò)聯(lián)通狀態(tài)的方法很多,我采用很簡(jiǎn)單很直接的ping。
# 判斷網(wǎng)絡(luò)是否聯(lián)通,成功返回0,不成功返回1 # linux中ping命令不會(huì)自動(dòng)停止,需要加入?yún)?shù) -c 4,表示在發(fā)送指定數(shù)目的包后停止。 def isLink(): return os.system('ping -c 4 www.baidu.com') # return os.system('ping www.baidu.com')
10 主函數(shù)邏輯
如果網(wǎng)絡(luò)連接正常,則拍照發(fā)郵件。
如果網(wǎng)絡(luò)未連接,等待十秒鐘再次測(cè)試,如果等待次數(shù)超過(guò)設(shè)置的最大次數(shù),程序退出。
def main(): reconnect_times = 0 while isLink(): time.sleep(10) reconnect_times += 1 if reconnect_times == exit_count: sys.exit() getPicture() msg = setMsg() sendEmail(msg)
11 實(shí)現(xiàn)開機(jī)自啟動(dòng)
首先要寫一個(gè)開機(jī)自啟腳本,文件名為:autoStart.sh
腳本內(nèi)容為
#切換到我們獲取照片和發(fā)送郵件的工作目錄 cd /home/projects/sendemail #執(zhí)行發(fā)送郵件的腳本 python2 sendEmile.py
然后 在/etc/rc.local最后添加一行
./home/projects/sendemail/autoStart.sh
大功告成。
10 重啟系統(tǒng)
代碼都寫好了,重啟系統(tǒng)就可以收到郵件啦。
總結(jié)
以上所述是小編給大家介紹的使用Python控制攝像頭拍照并發(fā)郵件,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
python學(xué)習(xí)手冊(cè)中的python多態(tài)示例代碼
多態(tài)是面向?qū)ο笳Z(yǔ)言的一個(gè)基本特性,多態(tài)意味著變量并不知道引用的對(duì)象是什么,根據(jù)引用對(duì)象的不同表現(xiàn)不同的行為方式,下面使用一個(gè)示例學(xué)習(xí)他的使用方法2014-01-01Falsk 與 Django 過(guò)濾器的使用與區(qū)別詳解
這篇文章主要介紹了Falsk 與 Django 過(guò)濾器的使用與區(qū)別詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06自適應(yīng)線性神經(jīng)網(wǎng)絡(luò)Adaline的python實(shí)現(xiàn)詳解
這篇文章主要介紹了自適應(yīng)線性神經(jīng)網(wǎng)絡(luò)Adaline的python實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python項(xiàng)目報(bào)錯(cuò):bs4.FeatureNotFound:?Couldn‘t?find?a?tree?bu
這篇文章主要給大家介紹了python項(xiàng)目報(bào)錯(cuò):bs4.FeatureNotFound:?Couldn‘t?find?a?tree?builder?with?the?features?you?requests的解決方式,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Python 文件操作之讀取文件(read),文件指針與寫入文件(write),文件打開方式示例
這篇文章主要介紹了Python 文件操作之讀取文件(read),文件指針與寫入文件(write),文件打開方式,結(jié)合實(shí)例形式分析了Python文件讀寫相關(guān)的指針、打開方式等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09python爬蟲之pyppeteer庫(kù)簡(jiǎn)單使用
Puppeteer 是 Google 基于 Node.js 開發(fā)的一個(gè)工具,有了它我們可以通過(guò) JavaScript 來(lái)控制 Chrome 瀏覽器的一些操作,當(dāng)然也可以用作網(wǎng)絡(luò)爬蟲上,其 API 極其完善,功能非常強(qiáng)大2021-07-07