一学期就混过去了,期末折腾了这个东西,比较水。挺好玩的就分享一下。

思路

整合了两个分开的程序。

一个是利用邮箱收发命令实现屏幕截图监控以及其他一些基本操作的程序,为保证这个程序在被监控者的电脑后台持续运行,需要一个掩护程序。

我的掩护是一个爬网页图片并设置成桌面壁纸的程序,为保证壁纸实时更新,被监控者要在后台持续运行此程序。


更改壁纸

从指定的URL爬取壁纸

(这里我用的是cloudinary平台上传自己的图片,需要爬取一个固定的URL)



利用pywin32模块将图片设置为桌面背景



设置时间间隔,不断重复执行程序,实现桌面壁纸的实时更新



利用邮箱监控

利用poplib和smtplib模块,提供对POP和SMTP协议的支持,实现邮件收发



email模块解析和构造邮件



PIL模块的ImageGrab.grab()函数对电脑进行截屏



通过邮件把电脑截屏返回邮箱

(利用os模块还可以控制电脑进行一些基本操作,如注销、关机)



实现效果

Step 1

在cloudinary上传自己的图片,这里我搞了个通知栏形式的壁纸。

cloudinary_picture

网站会更新相应的url上的图片

url_picture


Step 2

把url写入爬取程序

code

这个url写入程序以后如果打包成exe程序发给别人,以后就无法更改了,每次更新图片都放在这个相应的url里。

安一个Python的cloudinary模块,在平台上获取你自己的个人授权码(key, secret)


Step 3

由合法发件人邮箱发送邮件,命令填入主题

send

收到带附件的回信

receive_1
receiVe_2

附件中的截屏文件

screenshot



Part1: 邮件控制部分

程序设计思路

电脑每隔一段时间查看指定邮箱中是否收到了新的邮件,若未收到,则不进行任何操作,若收到了,则判断发件人的身份,若发件人为合法的控制者,则解析发件人的邮件,执行解析结果,否则忽略该邮件。

diagram



主要的两大类及其方法

邮件类

EmailClass


服务器类

ServerClass

SMTP协议及POP3协议原理

邮件传输原理

SendEmail

本质上:

1)编写MUA把邮件发到MTA。使用的协议是SMTP


2)编写MUA从MDA上收邮件。使用的协议是POP3

主要函数

send()

send1

默认端口为25,选择默认端口并连接SMTP服务器,如果需要加密SMTP会话需要更改为相应端口。

利用email模块中的函数构造邮件并发送至SMTP服务器:

send2


Tips:

1).邮件主题、发件人、收件人等信息并不是通过SMTP协议发送给MTA的,而是包含在发给MTA的文本中的。因此,必须把From、to、Subject添加到MIMEText中。


2).不能简单地传入nameaddr@example.com,包含中英文也包含地址的,要先用parseaddr()分离开中英文和地址,中英文用Header方法编码,然后用formataddr()方法把重新编码后的二者整合起来。


3).带附件的邮件可以看作包含若干部分的邮件。构造一个MIMETMultipart对象代表邮件本身,然后往里加上一个MIMEText作为邮件正文,加上表示截屏图片附件的MIMEBase对象即可。

get()

get1


用poplib把邮件的原始文本下载到本地:

get2

parse_message()

用email解析原始文本,还原为邮件对象:

parseMessage

run()

run

服务器类中主要利用while循环不断调用POP连接,并解析邮件中的命令,如果是截屏命令,则返回带截屏附件的邮件。


利用time.sleep()调整循环执行的时间间隔。

其他

1.部分电脑运行时,ImageGrab()抓取全屏失败,只能抓取屏幕的一部分。

措施:电脑的显示设置中的缩放改为100%



2.在成功发送屏幕截图之后利用os.remove()删除同路径下的screenshot.jpg文件。但是发送邮件需要时间,删除screenshot.jpg文件有延迟,会在exe文件的路径下出现截屏图片文件并停留几秒。



3.利用pyinstaller将程序打包为exe文件时,如果运用了第三方网站cloudinary,需要打包cloudinary模块。打包时命令行加入 -w 即不打开cmd。



4.在装有360的电脑上运行exe文件,可以正常使用壁纸爬取功能,但会被检测到有邮件的收发。