更多 Python 學(xué)習(xí)請加群:485901263
本文首發(fā)于2014年12月23日http://blog.kingname.info/2014/12/23/A-Totally-Amazing/,2016年4月12日修訂并增加沙盒模式的內(nèi)容。程序第一版使用Python2.7開發(fā),修訂后使用Python3.5重構(gòu)。
請想象一下這樣一個(gè)場景,你下班/放學(xué)回家,突然想起來公司/學(xué)校的電腦沒有關(guān)。于是,你拿出手機(jī),點(diǎn)開微信,發(fā)送一條消息。幾秒鐘以后,遠(yuǎn)處的電腦默默地關(guān)機(jī)了。
實(shí)際上使用任何可以發(fā)送郵件的程序都可以實(shí)現(xiàn)這個(gè)功能。但是因?yàn)槲⑿疟容^普及,所以就用微信的發(fā)送郵件功能做吧。
那么我們開始介紹下它是怎么實(shí)現(xiàn)的吧。
在需要被控制的電腦上運(yùn)行一個(gè)Python程序,這個(gè)程序會周期性的掃描一個(gè)配置好的郵箱。如果收到由特定郵件地址發(fā)送來的郵件,就解析郵件的標(biāo)題,如果標(biāo)題包含關(guān)鍵詞,例如關(guān)機(jī),播放音樂等等,就執(zhí)行關(guān)鍵詞對應(yīng)的命令。
本程序需要使用兩個(gè)郵箱,我給他們?nèi)∶譃?strong>【主人郵箱】和【奴隸郵箱】。
主人郵箱:下達(dá)命令的郵箱。
奴隸郵箱:接受命令并被Python程序掃描的郵箱。
建議奴隸郵箱使用小號,主人郵箱使用大號。本文使用臨時(shí)申請的一個(gè)新浪郵箱作為奴隸郵箱。目前奴隸郵箱使用新浪郵箱測試通過,其他郵箱未做測試。
程序由兩部分構(gòu)成:
程序使用Python的poplib提供的函數(shù),周期性讀取奴隸郵箱最新的一封郵件,如果這封郵件是主人郵箱發(fā)送的,并且標(biāo)題在_config.ini文件中有定義,則執(zhí)行本標(biāo)題定義的操作。
例如,_config.ini文件中有如下定義:
music=D:\backup\Music\Intro.mp3
主人郵箱發(fā)送一份郵件,標(biāo)題為music,電腦就會調(diào)用默認(rèn)播放器,播放D盤中的這個(gè)名叫Intro.mp3的音樂。
如果這個(gè)Intro.mp3本身只有1秒鐘,且沒有內(nèi)容,而音樂播放器設(shè)置為隨機(jī)播放,就間接地實(shí)現(xiàn)了打開播放器隨機(jī)播放音樂的目的。
目前程序可以實(shí)現(xiàn)兩類功能:運(yùn)行命令與打開文件。
其中運(yùn)行命令的原理是:
os.system(command)
理論上任何在CMD命令提示符下可以執(zhí)行的命令,在這里都可以執(zhí)行。_config.ini中默認(rèn)提供了兩個(gè)樣例,一個(gè)關(guān)閉計(jì)算機(jī):
shutdown=shutdown -f -s -t 10 -c closing...
另一個(gè)是列出當(dāng)前目錄:
dir=dir
等號左側(cè)為此命令的名字,也就是在郵件中可以發(fā)送的標(biāo)題內(nèi)容,等號右側(cè)為命令本身。
打開文件的功能通過pywin32實(shí)現(xiàn):
win32api.ShellExecute(0, 'open', open_file, '','',1)
其中,open_file為文件在電腦中的位置。函數(shù)調(diào)用Windows的API來運(yùn)行程序,效果和用鼠標(biāo)雙擊相同。
程序運(yùn)行以后,先加載_config.ini,讀取主人郵箱和奴隸郵箱,并確定掃描頻率(time_limit)為多少秒檢查一次郵箱。同時(shí)使用字典將命令的名稱和命令本身添加到內(nèi)存中。接下來的操作如下:
http://wiki.jikexueyuan.com/project/geekdigest/images/python.png" alt="" />
使用主人郵箱發(fā)送相應(yīng)的命令名稱以后,就能觸發(fā)電腦的相關(guān)操作。
打開_config.ini文件:
http://wiki.jikexueyuan.com/project/geekdigest/images/xinlan.png" alt="" />
這個(gè)section的內(nèi)容是可以使用Python運(yùn)行的cmd命令,理論上講,任何Python可以執(zhí)行的命令都可以添加到這里。
名字 = 命令
這個(gè)section下的內(nèi)容為可以通過Python打開的文件或者內(nèi)容,例如打開記事本,打開音樂等等。
名字 = 地址
沙盤模式可以無限制的擴(kuò)展程序的功能,通過郵件將新的Python代碼直接寫入到對方電腦并運(yùn)行。
使用主人郵箱往奴隸郵箱發(fā)送命令,例如:
sandbox:test.py$n$import win32api$c$if 1 + 1 == 2:$c$$$$$win32api.MessageBox(0, 'sandbox', 'this is sandbox')
格式:
sandbox:文件名$n$代碼
其中預(yù)定義的標(biāo)記如下:
$n$:文件名與代碼的分隔符
$c$:換行
$:空格,4個(gè)$連著用表示縮進(jìn)
沙盒模式的原理是,將郵件標(biāo)題中的代碼轉(zhuǎn)換成Python能運(yùn)行的代碼,然后保存到本地,再使用os.system()執(zhí)行。
之所以沙盒模式的代碼這么奇怪,是因?yàn)樾枰獙瑩Q行和縮進(jìn)信息的Python代碼寫到一行中。因?yàn)猷]箱的正文是按照一定的協(xié)議保存內(nèi)容的,并不方便直接讀取,因此還是使用郵件標(biāo)題來發(fā)送會比較方便。
使用微信控制電腦這一部分的代碼,請戳->https://github.com/kingname/RemoteControl/tree/master/mcc
使用微信來控制電腦的程序,由于需要郵箱作為中介,由于可能出現(xiàn)郵箱不穩(wěn)定或者郵箱的運(yùn)營商修改內(nèi)容的保存格式,就會導(dǎo)致郵件無法解析。
為了讓一切盡在掌握,通過自己設(shè)計(jì)一個(gè)Web服務(wù)器,自己做一個(gè)可以用手機(jī)訪問的網(wǎng)頁。然后通過這個(gè)網(wǎng)頁來下達(dá)命令,這樣不僅擺脫了郵箱的不方便,還能自定義數(shù)據(jù)的輸入格式,使得沙盒模式的代碼書寫方式更加的友好。這一部分的代碼,請戳->https://github.com/kingname/RemoteControl/tree/master/wcc
再進(jìn)一步,使用wxPython設(shè)計(jì)圖形界面程序,再使用Socket通信可以使得程序的通信更加的即時(shí),添加上讀取遠(yuǎn)程電腦屏幕的功能,于是一個(gè)簡易的遠(yuǎn)程控制程序就做好了。這一部分的代碼,請戳->https://github.com/kingname/RemoteControl/tree/master/uiControl
更多 Python 技巧學(xué)習(xí),請掃描下方二維碼
http://wiki.jikexueyuan.com/project/geekdigest/images/1613.jpg" alt="" />