用 Python 远程控制你的电脑

用 Python 远程控制你的电脑

一、前言

很多时候我们有这种需求,因为程序运行比较耗时,但是我们没有足够的时间等待。这个时候我们就可以用 Python 做一个远程控制电脑的小工具,实现远程控制电脑。当然,我们能做的操作十分有限,我们可以通过邮件和电脑进行通讯、然后让电脑以截图的方式为我们显示程序当前运行的状态。然后我们通过这个状态进行判断,用邮件发送一些预设好的指令。如果程序意外中断了,我们可以进行让它重新运行,如果程序按照我们的预期执行了,我们就可以远程关机。

二、使用 yagmail 进行邮件发送

使用 yagmail 发邮件非常简单,我们首先需要安装两个模块:

pip install yagmailpip install keyring

2.1、发送一个简单的邮件

我们用 yagmail 来发一封简单的邮件试试:

import yagmailimport keyringsender = '发件邮箱'password = '发件人密码'receiver = '收件邮箱'# 注册yagmail.register(sender, password)# 用 SMTP 服务器发邮件yag = yagmail.SMTP(user=sender, host='smtp.163.com')# 设置邮件的内容contents = ['Do not go gentle into that good night!']# 发送邮件yag.send(receiver, '邮件主题', contents=contents)

这里密码可以使用真实密码,也可以使用授权码。授权码的获得需要到各个邮件的网页获取,这里以网易邮箱为例:

我们进入网页版邮箱,依次点击 1、2,进入如下页面:

点击开启,然后按照指引获取授权码即可。

在连接邮箱服务器的时候,我们设置的一个 host,这个同样需要在邮箱网页中获取。其中 163 的邮箱地址为 smtp.163.com,QQ 邮箱服务器地址为 smtp.qq.com,其它邮箱的可以自己查找一下。

邮箱内容是一个列表,我们现在是放入了一句话。

在调用 send 方法发送邮件时,我们需要传入几个参数。第一个是收件人,第二个是邮件的主题,第三个就是邮件的内容了。邮件内容我们传入开始的内容列表。大家可以使用自己的邮箱测试一下。

2.2、发送附件

yagmail 非常智能,我们不需要像原始的 email 模块一样,先将附件上传到邮箱服务器,然后再发给收件人。yagmail 会自动识别内容中的资源文件,然后自动上传:

import yagmailimport keyring
sender = '发件邮箱'password = '发件人密码'receiver = '收件邮箱'
# 注册yagmail.register(sender, password)
# 用 SMTP 服务器发邮件yag = yagmail.SMTP(user=sender, host='smtp.163.com')
# 设置邮件的内容contents = ['im.jpg']
# 发送邮件yag.send(receiver, '邮件主题', contents=contents)

其中 im.jpg 是我本地的一张图片,在发送的时候 yagmail 会自动识别,然后发送出去。我们没做什么修改,就完成了附件的发送。

我们也可以直接发送带有图片的邮件,而不是以附件的形式发送:

import yagmailimport keyringsender = '发件邮箱'password = '发件人密码'receiver = '收件邮箱'# 注册yagmail.register(sender, password)yag = yagmail.SMTP(user=sender, host='smtp.163.com')contents = [    '这是一张图片',    yagmail.inline('im.jpg')]yag.send(receiver, '邮件主题', contents=contents)

我们只要用 yagmail.inline 包含图片路径即可。不过需要注意,发送的内容不能单是一张图片。

三、邮件读取

邮件的读取需要使用到 imbox 模块。我们需要先使用 keyring 模块读取密码,keyring 可以读取到在 yagmail 中注册了的邮箱密码:

import yagmailimport keyringfrom imbox import Imbox
sender = '你的邮箱'# 获取邮箱密码password = keyring.get_password(sender)# 读取邮箱邮件with Imbox('imap.163.com', sender, password, ssl=True) as imbox: # 读取所有未读邮件 all_msg = imbox.messages(unread=True)

Imbox 对象就是我们的邮箱对象,里面包含了所有邮箱信息。我们调用 messages 方法就可以获取所有邮件,如果我们将 unread 设置为 True,则表示读取未读邮件。获取了所有邮件,我们就可以查看更多信息了:

import yagmailimport keyringfrom imbox import Imboxsender = '你的邮箱'# 获取邮箱密码password = keyring.get_password(sender)# 读取邮箱邮件with Imbox('imap.163.com', sender, password, ssl=True) as imbox:    # 读取所有未读邮件    all_msg = imbox.messages(unread=True)    # 遍历邮件    for uid, message in all_msg:            # 输出邮件的主题            print(message.subject)            # 标记已读            imbox.mark_seen(uid)            # 获取邮件的文本内容            msg = message.body['plain']

我们要实现控制电脑就需要一直读取,我们可以使用 schedule 模块设置定时任务:

import timeimport schedule
def func(): print('test')
schedule.every(2).seconds.do(func)while True: schedule.run_pending() time.sleep(1)

这样的话,可以每两秒执行一次 func 函数。

四、开发电脑控制工具

我们定义一个 ComputerController 类,用于控制电脑。该类的最基本方法就发邮件和收邮件:

import timeimport yagmailimport keyringimport schedulefrom imbox import Imboxclass ComputerController():    TIME_SPACE = 10    SMTP_163 = 'smtp.163.com'    SMTP_QQ = 'smtp.qq.com'    def __init__(self, user, receiver):        self.user = user        self.receiver = receiver        # 注册        yagmail.register(self.user, '你的密码')    def send_main(self, msg):        '''发邮件'''        yag = yagmail.SMTP(user=self.user, host=self.SMTP_163)        contents = [            msg        ]        yag.send(self.receiver, '来自电脑的邮件', contents=contents)    def receive_mail(self):        '''收邮件'''        # 读取密码        password = keyring.get_password('yagmail', self.user)        with Imbox('imap.163.com', 'sockwz@163.com', password, ssl=True) as imbox:            all_msg = imbox.messages(unread=True)            for uid, message in all_msg:                if '110' == message.subject:                    # 标记已读                    imbox.mark_seen(uid)                    msg = message.body['plain']                    print(msg)    def run_controller(self):          # 定时读取邮件        schedule.every(self.TIME_SPACE).seconds.do(controller.receive_mail)        while True:            schedule.run_pending()            time.sleep(self.TIME_SPACE)

我们只需要创建这个类就可以了:

if __name__ == '__main__': controller = ComputerController('发件邮箱', '收件邮箱') controller.run_controller()

我们需要传入收件邮箱和发件邮箱,另外还需要在 init 方法中,修改密码即可。

五、实现一些预设功能

下面我们实现一些小功能。

5.1、截图

from PIL import ImageGrabdef grab_windows(self):    im = ImageGrab.grab()    im.save('status.jpg')

使用 Pillow 模块需要先安装:

pip install pillow

5.2、关机

import osdef shut_down(self):    '''关机'''    os.system('shutdown /s /t 0')

这个是通用的两个功能。另外我们可以使用 pynput 模块控制键盘,进行一些操作。这个需要根据自己电脑的情况操作,比如我使用 PyCharm 运行程序可以使用下列代码运行程序:

def run_program(self): '''运行程序''' with self.kb.pressed(Key.shift): self.kb.press(Key.f10) self.kb.release(Key.f10)

大家可以自己定制一些操作。整个程序完整代码如下:

import osimport timeimport yagmailimport keyringimport schedulefrom imbox import Imboxfrom PIL import ImageGrabfrom pynput.keyboard import *class ComputerController():    TIME_SPACE = 10    SMTP_163 = 'smtp.163.com'    SMTP_QQ = 'smtp.qq.com'    kb = Controller()    def __init__(self, user, receiver):        self.user = user        self.receiver = receiver        # 注册        yagmail.register(self.user, '授权码或密码')    def send_main(self, msg):        '''发邮件'''        yag = yagmail.SMTP(user=self.user, host=self.SMTP_163)        contents = [            msg        ]        yag.send(self.receiver, '来自电脑的邮件', contents=contents)    def receive_mail(self):        '''收邮件'''        # 读取密码        password = keyring.get_password('yagmail', self.user)        with Imbox('imap.163.com', 'sockwz@163.com', password, ssl=True) as imbox:            all_msg = imbox.messages(unread=True)            for uid, message in all_msg:                if '110' == message.subject:                    # 标记已读                    imbox.mark_seen(uid)                    msg = message.body['plain']                    if msg[0].__contains__('截图'):                        # 截图                        self.grab_windows()                        # 发送截图                        self.send_main('status.jpg')                    if msg[0].__contains__('重启'):                        self.restart_server()                        time.sleep(3)                        self.grab_windows()                        self.send_main('status.jpg')                    if msg[0].__contains__('关机'):                        self.shut_down()    def grab_windows(self):        im = ImageGrab.grab()        im.save('status.jpg')    def restart_server(self):        time.sleep(3)        os.system('shutdown')        time.sleep(3)        os.system('startup')    def run_program(self):        '''运行程序'''        with self.kb.pressed(Key.shift):            self.kb.press(Key.f10)            self.kb.release(Key.f10)    def shut_down(self):        '''关机'''        os.system('shutdown /s /t 0')    def run_controller(self):        schedule.every(self.TIME_SPACE).seconds.do(controller.receive_mail)        while True:            schedule.run_pending()            time.sleep(self.TIME_SPACE)if __name__ == '__main__':    controller = ComputerController('发件邮箱', '收件邮箱')    controller.run_controller()

我们在读取邮件时只读取主题为 110 的邮件,这样可以避免干扰邮件。所以我们在发送邮件时需要将主题设置为 110,而邮件内容则是一些关键词。比如截图就是截图操作,关机就是关机操作。这个可以自己定义。

(0)

相关推荐

  • 十分钟学会用Flask发邮件

    首先我们用python发邮件前,先要去qq邮箱里去设置一下. 开POP3/SMTP/IMAP功能 http://service.mail.qq.com/cgi-bin/help?subtype=1&a ...

  • 第7章——Python邮件发送

    Python邮件发送 SMTP(Simple Mail Transfer Protocol) · 即简单邮件传输协议.它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP ...

  • 看我用Python一秒发送数百份邮件,让财务部妹子追着喊666!

    需求描述 最近公司要发奖金,需要财务部妹子给每个员工发一封邮件,现在全公司 10 个部门每个人的奖金情况已经计算好了,并根据部门分别制作了 10 张表格: 每个奖金表格内容大致如下: 同时有一份 Ex ...

  • PYTHON自动发送报表邮件

    要实现上述的功能的话我们需要以下几步: 1.做好报表模板 2.更新报表数据 3.发送报表邮件 下面我们就用一个例子来给大家演示一下: 1.报表模板 我们选用一份保险公司每天完成保单的数据进行模板制作, ...

  • 实战|用Python制作邮箱自动回复机器人

    Python大本营 昨天 以下文章来源于早起Python ,作者陈熹 大家好,又来到Python办公自动化专题. 在之前的系列文章中,我们已经讲解了如何利用Python读取.收发.管理邮件.本文将进一 ...

  • 电脑远程控制怎么弄?电脑弄远程控制功能的方法-系统城

    大家都知道,电脑windows系统都有一个远程控制的功能,可以实现远距离对电脑进行操作,是一款非常不错的功能.很多网友都不知道如何使用和设置该功能?为此,本教程告诉大家弄电脑远程控制的方法. 具体方法 ...

  • 远程控制3台电脑,办公更简单,放假也不用担心

    清明假期马上到来大家有准备去哪?出去玩的同时有没有考虑到这个问题,万一假期公司找你怎么办?这里我推荐个非常好用的产品,向日葵智能开机插线板P2.我已经用这款插线板好久了,上班忘带U盘,数据落在了单位, ...

  • 一个电脑可以远程控制另外一个电脑-QQ远程协助

    一个电脑可以远程控制另外一个电脑-QQ远程协助

  • 如何用手机远程控制自己的电脑?

    真人回复,随身顾问. 点击关注! 不知道你有没有这样的需求,没带电脑的时候,需要查找电脑的文件或资料,或者要操作自己的电脑处理一些事情,有办法实现吗? ▌答案是肯定的,只要在电脑端和手机端分别安装一个 ...

  • 用手机远程控制你的电脑,让你随时随地都能办公!

    电脑手机那些事儿 应用技巧.实用软件, 你想要的,这里都有! Hi,大家好,我是小雨!现在手机已经成了大多数生活中不可或缺的一部分.更有一种观点认为,手机已经可以替代电脑了.确实,手机使用起来比电脑更 ...

  • 别人远程控制你的电脑有风险吗?防止别人远程控制你的电脑的方法-系统城

    别人远程控制你的电脑有风险吗?防止别人远程控制你的电脑的方法     最近许多网友留言说别人远程控制你的电脑有风险吗?风险是一定有的,一般的远程控制是在双方同意的情况进行的.许多人都担心自己的电脑被别 ...

  • 黑客工具,可以远程控制手机和电脑!

    搜罗君,每日优质搜罗 好消息,特大好消息 下一次长假只有元旦了 今天搜罗君要讲的 就是真正的远程控制 在户外拿着手机 就可以操控电脑里的游戏 还能没事看看家里的宠物在干嘛 没做完的工作也可以控制电脑处 ...

  • 学习Python对电脑配置要求高吗?小白必看!

    在学习Python之前,我们需要准备各种各样的学习工具,比如说电脑.而说起电脑,很多人会问:学习Python用什么电脑好?对配置有要求吗?我们来看看详细的介绍吧. 学习Python对于电脑硬件基本没有 ...

  • 好玩又有趣的Python实例小游戏代码,我能在电脑上琢磨一天

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...