使用Python控制摄像头拍照并发邮件
o1前言
为什么会有写这个程序的想法呢?
最初的想法是写一个可以用电脑前置摄像头拍照的程序,在舍友使用你电脑的时候,不经意间获取到一大堆奇葩舍友的表情包。
然后我又突发奇想,要不搞个开机启动吧,这样我就可以看到是谁开启了我的电脑啦。
然后,突(nao)发(dong)奇(da)想(kai)的我又想到万一我电脑不在身边怎么办?要不再加个邮件发送机制吧,开机拍到照片再邮件发送给我?哈哈
02工具
•deepin15.9
•好看好用的国产linux系统
•python2.7或者3.6
•解释器,哪个版本都可以,我选择3.6
•smtplib
•用来发送邮件
•email
•用来构造邮件内容的库
•opencv
•用来调取摄像头拍摄照片
•time
•获取开机以及拍照的时间
•os
•判断网络连接
•获取脚本路径
•sys
•判断网络是否联通
03思路
•1.用opencv库调用摄像头拍照保存为文件。
•2.检查网络是否连接,未连接则图片保存到本地。
•3.用email库构造邮件内容,把保存的照片以附件的形式插入到邮件内容中。
•4.用smtplib库发送邮件给指定邮件接收者。
•5.实现脚本开机自启动。
04安装及导入所使用的包
首先当然是安装opencv啦。
其他的email、smtplib、sys、os、time为python默认安装的包,我们只需要导入即可。
如果是python3.6安装opencv就在终端输入:
pip3installopencv-python
如果是python2.7安装opencv,就在终端输入:
pipinstallopencv-python
安装完成后,我们导入必要的包。
各个包的作用在前文已经讲过,不再多言。
email我们只需要部分功能,所以选择性导入
importcv2 importsmtplib importsys importos importtime fromemail.mime.imageimportMIMEImage fromemail.mime.multipartimportMIMEMultipart fromemail.mime.textimportMIMEText
05设置参数
将smtp服务器,登录邮箱账号及密码,收件人,脚本路径等设置为全局变量。方便以后程序移植与修改。
smtpserver='smtp.163.com'#smtp服务器 username='888888888@163.com'#发件邮箱账号 password='888888888'#邮箱登录密码 sender='888888888@163.com'#发件人 addressee='999999999@qq.com'#收件人 exit_count=5#尝试联网次数 path=os.getcwd()#获取图片保存路径
注:很多邮箱为了安全起见,不会使用真实的登录密码,而是要使用授权码,在QQ邮箱的设置里面可以找到生成授权码选项。
06实现拍照
defgetPicture(): cap=cv2.VideoCapture(0) ret,frame=cap.read() cv2.imwrite(path+'/person.jpg',frame) #关闭摄像头 cap.release()
07构造邮件内容
defsetMsg(): #下面依次为邮件类型,主题,发件人和收件人。 msg=MIMEMultipart('mixed') msg['Subject']='电脑已经启动' msg['From']='88888888888@163.com<88888888888@163.com>' msg['To']=addressee #下面为邮件的正文 text="主人,你的电脑已经开机! 照片如下!" text_plain=MIMEText(text,'plain','utf-8') msg.attach(text_plain) #构造图片链接 sendimagefile=open(path+'/person.jpg','rb').read() image=MIMEImage(sendimagefile) #下面一句将收件人看到的附件照片名称改为people.png。 image["Content-Disposition"]='attachment;filename="people.png"' msg.attach(image) returnmsg.as_string()
08实现邮件发送
defsendEmail(msg): #发送邮件 smtp=smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username,password) smtp.sendmail(sender,addressee,msg) smtp.quit()
09判断网络联通状态
判断网络联通状态的方法很多,我采用很简单很直接的ping。
#判断网络是否联通,成功返回0,不成功返回1 #linux中ping命令不会自动停止,需要加入参数-c4,表示在发送指定数目的包后停止。 defisLink(): returnos.system('ping-c4www.baidu.com') #returnos.system('pingwww.baidu.com')
10主函数逻辑
如果网络连接正常,则拍照发邮件。
如果网络未连接,等待十秒钟再次测试,如果等待次数超过设置的最大次数,程序退出。
defmain(): reconnect_times=0 whileisLink(): time.sleep(10) reconnect_times+=1 ifreconnect_times==exit_count: sys.exit() getPicture() msg=setMsg() sendEmail(msg)
11实现开机自启动
首先要写一个开机自启脚本,文件名为:autoStart.sh
脚本内容为
#切换到我们获取照片和发送邮件的工作目录 cd/home/projects/sendemail #执行发送邮件的脚本 python2sendEmile.py
然后在/etc/rc.local最后添加一行
./home/projects/sendemail/autoStart.sh
大功告成。
10重启系统
代码都写好了,重启系统就可以收到邮件啦。
总结
以上所述是小编给大家介绍的使用Python控制摄像头拍照并发邮件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!