python 远程控制_用 Python 远程控制你的电脑
用 Python 遠(yuǎn)程控制你的電腦
一、前言
很多時(shí)候我們有這種需求,因?yàn)槌绦蜻\(yùn)行比較耗時(shí),但是我們沒(méi)有足夠的時(shí)間等待。這個(gè)時(shí)候我們就可以用 Python 做一個(gè)遠(yuǎn)程控制電腦的小工具,實(shí)現(xiàn)遠(yuǎn)程控制電腦。當(dāng)然,我們能做的操作十分有限,我們可以通過(guò)郵件和電腦進(jìn)行通訊、然后讓電腦以截圖的方式為我們顯示程序當(dāng)前運(yùn)行的狀態(tài)。然后我們通過(guò)這個(gè)狀態(tài)進(jìn)行判斷,用郵件發(fā)送一些預(yù)設(shè)好的指令。如果程序意外中斷了,我們可以進(jìn)行讓它重新運(yùn)行,如果程序按照我們的預(yù)期執(zhí)行了,我們就可以遠(yuǎn)程關(guān)機(jī)。
二、使用 yagmail 進(jìn)行郵件發(fā)送
使用 yagmail 發(fā)郵件非常簡(jiǎn)單,我們首先需要安裝兩個(gè)模塊:pip install yagmailpip install keyring
2.1、發(fā)送一個(gè)簡(jiǎn)單的郵件
我們用 yagmail 來(lái)發(fā)一封簡(jiǎn)單的郵件試試:import yagmailimport keyringsender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'# 注冊(cè)yagmail.register(sender, password)# 用 SMTP 服務(wù)器發(fā)郵件yag = yagmail.SMTP(user=sender, host='smtp.163.com')# 設(shè)置郵件的內(nèi)容contents = ['Do not go gentle into that good night!']# 發(fā)送郵件yag.send(receiver, '郵件主題', contents=contents)
這里密碼可以使用真實(shí)密碼,也可以使用授權(quán)碼。授權(quán)碼的獲得需要到各個(gè)郵件的網(wǎng)頁(yè)獲取,這里以網(wǎng)易郵箱為例:
我們進(jìn)入網(wǎng)頁(yè)版郵箱,依次點(diǎn)擊 1、2,進(jìn)入如下頁(yè)面:
點(diǎn)擊開(kāi)啟,然后按照指引獲取授權(quán)碼即可。
在連接郵箱服務(wù)器的時(shí)候,我們?cè)O(shè)置的一個(gè) host,這個(gè)同樣需要在郵箱網(wǎng)頁(yè)中獲取。其中 163 的郵箱地址為 smtp.163.com,QQ 郵箱服務(wù)器地址為 smtp.qq.com,其它郵箱的可以自己查找一下。
郵箱內(nèi)容是一個(gè)列表,我們現(xiàn)在是放入了一句話。
在調(diào)用 send 方法發(fā)送郵件時(shí),我們需要傳入幾個(gè)參數(shù)。第一個(gè)是收件人,第二個(gè)是郵件的主題,第三個(gè)就是郵件的內(nèi)容了。郵件內(nèi)容我們傳入開(kāi)始的內(nèi)容列表。大家可以使用自己的郵箱測(cè)試一下。
2.2、發(fā)送附件
yagmail 非常智能,我們不需要像原始的 email 模塊一樣,先將附件上傳到郵箱服務(wù)器,然后再發(fā)給收件人。yagmail 會(huì)自動(dòng)識(shí)別內(nèi)容中的資源文件,然后自動(dòng)上傳:import yagmailimport keyringsender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'# 注冊(cè)yagmail.register(sender, password)# 用 SMTP 服務(wù)器發(fā)郵件yag = yagmail.SMTP(user=sender, host='smtp.163.com')# 設(shè)置郵件的內(nèi)容contents = ['im.jpg']# 發(fā)送郵件yag.send(receiver, '郵件主題', contents=contents)
其中 im.jpg 是我本地的一張圖片,在發(fā)送的時(shí)候 yagmail 會(huì)自動(dòng)識(shí)別,然后發(fā)送出去。我們沒(méi)做什么修改,就完成了附件的發(fā)送。
我們也可以直接發(fā)送帶有圖片的郵件,而不是以附件的形式發(fā)送:import yagmailimport keyringsender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'# 注冊(cè)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 包含圖片路徑即可。不過(guò)需要注意,發(fā)送的內(nèi)容不能單是一張圖片。
三、郵件讀取
郵件的讀取需要使用到 imbox 模塊。我們需要先使用 keyring 模塊讀取密碼,keyring 可以讀取到在 yagmail 中注冊(cè)了的郵箱密碼: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)
Imbox 對(duì)象就是我們的郵箱對(duì)象,里面包含了所有郵箱信息。我們調(diào)用 messages 方法就可以獲取所有郵件,如果我們將 unread 設(shè)置為 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)# 標(biāo)記已讀imbox.mark_seen(uid)# 獲取郵件的文本內(nèi)容msg = message.body['plain']
我們要實(shí)現(xiàn)控制電腦就需要一直讀取,我們可以使用 schedule 模塊設(shè)置定時(shí)任務(wù):import timeimport scheduledef func():print('test')schedule.every(2).seconds.do(func)while True:schedule.run_pending()time.sleep(1)
這樣的話,可以每?jī)擅雸?zhí)行一次 func 函數(shù)。
四、開(kāi)發(fā)電腦控制工具
我們定義一個(gè) ComputerController 類(lèi),用于控制電腦。該類(lèi)的最基本方法就發(fā)郵件和收郵件:import timeimport yagmailimport keyringimport schedulefrom imbox import Imboxclass ComputerController():TIME_SPACE = 10SMTP_163 = 'smtp.163.com'SMTP_QQ = 'smtp.qq.com'def __init__(self, user, receiver):self.user = userself.receiver = receiver# 注冊(cè)yagmail.register(self.user, '你的密碼')def send_main(self, msg):'''發(fā)郵件'''yag = yagmail.SMTP(user=self.user, host=self.SMTP_163)contents = [msg]yag.send(self.receiver, '來(lái)自電腦的郵件', 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:# 標(biāo)記已讀imbox.mark_seen(uid)msg = message.body['plain']print(msg)def run_controller(self):# 定時(shí)讀取郵件schedule.every(self.TIME_SPACE).seconds.do(controller.receive_mail)while True:schedule.run_pending()time.sleep(self.TIME_SPACE)
我們只需要?jiǎng)?chuàng)建這個(gè)類(lèi)就可以了:if __name__ == '__main__':controller = ComputerController('發(fā)件郵箱', '收件郵箱')controller.run_controller()
我們需要傳入收件郵箱和發(fā)件郵箱,另外還需要在 init 方法中,修改密碼即可。
五、實(shí)現(xiàn)一些預(yù)設(shè)功能
下面我們實(shí)現(xiàn)一些小功能。
5.1、截圖from PIL import ImageGrabdef grab_windows(self):im = ImageGrab.grab()im.save('status.jpg')
使用 Pillow 模塊需要先安裝:pip install pillow
5.2、關(guān)機(jī)import osdef shut_down(self):'''關(guān)機(jī)'''os.system('shutdown /s /t 0')
這個(gè)是通用的兩個(gè)功能。另外我們可以使用 pynput 模塊控制鍵盤(pán),進(jìn)行一些操作。這個(gè)需要根據(jù)自己電腦的情況操作,比如我使用 PyCharm 運(yùn)行程序可以使用下列代碼運(yùn)行程序:def run_program(self):'''運(yùn)行程序'''with self.kb.pressed(Key.shift):self.kb.press(Key.f10)self.kb.release(Key.f10)
大家可以自己定制一些操作。整個(gè)程序完整代碼如下:import osimport timeimport yagmailimport keyringimport schedulefrom imbox import Imboxfrom PIL import ImageGrabfrom pynput.keyboard import *class ComputerController():TIME_SPACE = 10SMTP_163 = 'smtp.163.com'SMTP_QQ = 'smtp.qq.com'kb = Controller()def __init__(self, user, receiver):self.user = userself.receiver = receiver# 注冊(cè)yagmail.register(self.user, '授權(quán)碼或密碼')def send_main(self, msg):'''發(fā)郵件'''yag = yagmail.SMTP(user=self.user, host=self.SMTP_163)contents = [msg]yag.send(self.receiver, '來(lái)自電腦的郵件', 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:# 標(biāo)記已讀imbox.mark_seen(uid)msg = message.body['plain']if msg[0].__contains__('截圖'):# 截圖self.grab_windows()# 發(fā)送截圖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__('關(guān)機(jī)'):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):'''運(yùn)行程序'''with self.kb.pressed(Key.shift):self.kb.press(Key.f10)self.kb.release(Key.f10)def shut_down(self):'''關(guān)機(jī)'''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('發(fā)件郵箱', '收件郵箱')controller.run_controller()
我們?cè)谧x取郵件時(shí)只讀取主題為 110 的郵件,這樣可以避免干擾郵件。所以我們?cè)诎l(fā)送郵件時(shí)需要將主題設(shè)置為 110,而郵件內(nèi)容則是一些關(guān)鍵詞。比如截圖就是截圖操作,關(guān)機(jī)就是關(guān)機(jī)操作。這個(gè)可以自己定義。
總結(jié)
以上是生活随笔為你收集整理的python 远程控制_用 Python 远程控制你的电脑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 忻州师范学院专升本录取分数线2022(2
- 下一篇: 在一丰4S店买了一副雨刷备用,怎么知道它