我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我们发送关机指令给这个邮箱的时候,若Python检测到相关的指令,那么Python直接发送本机的相关命令。
下面来分析一下该项目:
1.需求分析
1.范围:用Python开发一个远程操控电脑的项目。
2.总体要求:
2.1 总体功能要求:能够通过该软件远程控制该软件所在的电脑的重启或关机操作。
2.2 系统要求:开发语言使用Python,并且开发出来的程序能在Windows运行。
2.设计
首先,我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我们发送关机指令给这个邮箱的时候,若Python检测到关机的指令,那么Python直接发送本机的关闭。
3.编写
本项目的流程图如下
第一步,需要注册一个新浪邮箱。然后点击新浪邮箱点击右上角设置如图
选择“客户端pop/imap/smtp”
打开新浪邮箱的SMTP与POP3功能
具体实现代码:
配置文件config.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[Slave]
pophost = pop.sina.com
smtphost = smtp.sina.com
port = 25
username = XXX@sina.com
password = XXX
[Boss]
mail = XXX@qq.com
timelimit = 2
[Command]
shutdown = shutdown - f - s - t 100 - c closing...
dir = dir
[ Open ]
music = F:Masetti - Our Own Heaven.mp3
video = F:Jai Waetford - Shy.mp4
notepad = notepad
|
excutor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#coding:utf-8
import sys
reload (sys)
sys.setdefaultencoding( "utf-8" )
import os
import win32api
from mccLog import mccLog
class executor( object ):
def __init__( self ,commandDict,openDict):
'''
创建方法
:param commandDict:
:param openDict:
'''
self .mccLog = mccLog()
self .commandDict = commandDict
self .openDict = openDict
def execute( self ,exe,mailHelper):
self .mailHelper = mailHelper
subject = exe[ 'subject' ]
# self.mccLog.mccWriteLog(u'开始处理命令')
print u 'start to process'
if subject ! = 'pass' :
self .mailHelper.sendMail( 'pass' , 'Slave' )
if subject in self .commandDict:
# self.mccLog.mccWriteLog(u'执行命令!')
print u 'start command'
try :
command = self .commandDict[subject]
os.system(command)
self .mailHelper.sendMail( 'Success' , 'Boss' )
# self.mccLog.mccWriteLog(u'执行命令成功!')
print u 'command success'
except Exception,e:
# self.mccLog.mccError(u'执行命令失败'+ str(e))
print 'command error'
self .mailHelper.sendMail( 'error' , 'boss' ,e)
elif subject in self .openDict:
# self.mccLog.mccWriteLog(u'此时打开文件')
print u 'open the file now'
try :
openFile = self .openDict[subject]
win32api.ShellExecute( 0 , 'open' ,openFile,' ',' ', 1 )
self .mailHelper.sendMail( 'Success' , 'Boss' )
# self.mccLog.mccWriteLog(u'打开文件成功!')
print u 'open file success'
except Exception,e:
# self.mccLog.mccError(u'打开文件失败!' + str(e))
print u 'open file error'
self .mailHelper.sendMail( 'error' , 'Boss' ,e)
elif subject[: 7 ].lower() = = 'sandbox' :
self .sandBox(subject[ 8 :])
else :
self .mailHelper.sendMail( 'error' , 'Boss' , 'no such command!' )
def sandBox( self ,code):
name = code.split( '$n$' )[ 0 ]
code = code.split( '$n$' )[ 1 ]
codestr = '\n' .join(code.split( '$c$' ))
codestr = codestr.replace( '$' , ' ' )
with open (name, 'a' ) as f:
f.write(codestr)
|
configReader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#-*-coding:utf-8-*-
import ConfigParser
import os,sys
class configReader( object ):
def __init__( self ,configPath):
configFile = os.path.join(sys.path[ 0 ],configPath)
self .cReader = ConfigParser.ConfigParser()
self .cReader.read(configFile)
def readConfig( self ,section,item):
return self .cReader.get(section,item)
def getDict( self ,section):
commandDict = {} #字典
items = self .cReader.items(section)
for key,value in items:
commandDict[key] = value
return commandDict
|
日志文件mccLog.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#-*-coding:utf-8-*-
import logging
from datetime import datetime
class mccLog( object ):
def __init__( self ):
logging.basicConfig(
level = logging.DEBUG,
format = '%(asctime)s %(levelname)s %(message)s' ,
datefmt = '%Y-%m-%d %H:%M:%S' ,
filename = datetime. now().strftime( '%Y%m%d%H%M%S' ) + '.log' ,
filemode = 'a'
)
def mccWriteLog( self ,logContent):
logging.info(logContent)
def mccError( self ,errorContent):
logging.error(errorContent)
|
mailHelper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#-*-coding:utf-8-*-
import sys
reload (sys)
sys.setdefaultencoding( "utf-8" )
from email.mime.text import MIMEText
from configReader import configReader
from mccLog import mccLog
import poplib
import smtplib
import re
class mailHelper( object ):
CONFIGPATH = 'config.ini'
def __init__( self ):
'''
初始化邮件
'''
self .mccLog = mccLog()
cfReader = configReader( self .CONFIGPATH)
self .pophost = cfReader.readConfig( 'Slave' , 'pophost' )
self .smtphost = cfReader.readConfig( 'Slave' , 'smtphost' )
self .port = cfReader.readConfig( 'Slave' , 'port' )
self .username = cfReader.readConfig( 'Slave' , 'username' )
self .password = cfReader.readConfig( 'Slave' , 'password' )
self .bossMail = cfReader.readConfig( 'Boss' , 'mail' )
self .loginMail()
self .configSlaveMail()
def loginMail( self ):
'''
验证登陆
:return:
'''
self .mccLog.mccWriteLog( 'start to login the E-mail' )
print 'start to login e-mail'
try :
self .pp = poplib.POP3_SSL( self .pophost)
self .pp.set_debuglevel( 0 ) #可以为0也可以为1,为1时会显示出来
self .pp.user( self .username) #复制
self .pp.pass_( self .password)
self .pp. list () #列出赋值
print 'login successful!'
self .mccLog.mccWriteLog( 'login the email successful!' )
print 'login the email successful!'
except Exception,e:
print 'Login failed!'
self .mccLog.mccWriteLog( 'Login the email failed!' )
exit()
def acceptMail( self ):
'''
接收邮件
:return:
'''
self .mccLog.mccWriteLog( 'Start crawling mail!' )
print 'Start crawling mail'
try :
ret = self .pp. list ()
mailBody = self .pp.retr( len (ret[ 1 ]))
self .mccLog.mccWriteLog( 'Catch the message successfully' )
print 'Catch the message successfully'
return mailBody
except Exception,e:
self .mccLog.mccError( 'Catch the message failed' + e)
print 'Catch the message failed'
return None
def analysisMail( self ,mailBody):
'''
正则分析邮件
:param mailBody:
:return:
'''
self .mccLog.mccWriteLog( 'Start crawling subject and sender' )
print 'Start crawling subject and sender'
try :
subject = re.search( "Subject: (.*?)'," , str (mailBody[ 1 ]).decode('utf - 8 '),re.S).group( 1 )
print subject
sender = re.search( "'X-Sender: (.*?)'," , str (mailBody[ 1 ]).decode( 'utf-8' ),re.S).group( 1 )
command = { 'subject' :subject, 'sender' :sender}
self .mccLog.mccWriteLog( "crawling subject and sender successful!" )
print 'crawling subject and sender successful'
return command
except Exception,e:
self .mccLog.mccError( "crawling subject and sender failed!" + e)
print 'crawling subject and sender failed!'
return None
def sendMail( self ,subject,receiver,body = 'Success' ):
'''
发送邮件
:param subject:
:param receiver:
:param body:
:return:
'''
msg = MIMEText(body, 'plain' , 'utf-8' )
#中文需要参数utf-8,单字节字符不需要
msg[ 'Subject' ] = subject
msg[ 'from' ] = self .username
self .mccLog.mccWriteLog( 'Start sending mail' + 'to' + receiver)
print 'Start sending mail'
if receiver = = 'Slave' :
try :
self .handle.sendmail( self .username, self .username,msg.as_string())
self .mccLog.mccWriteLog( 'Send the message successfully' )
print 'Send the message successfully'
except Exception,e:
self .mccLog.mccError( 'Send the message failed' + e)
print 'Send the message failed'
return False
elif receiver = = 'Boss' :
try :
self .handle.sendmail( self .username, self .bossMail,msg.as_string())
self .mccLog.mccWriteLog( 'Send the message successfully' )
print 'Send the message successfully'
except Exception,e:
self .mccLog.mccError( 'Send the message failed!' + e)
print 'Send the message failed!'
return False
def configSlaveMail( self ):
'''
配置邮件
:return:
'''
self .mccLog.mccWriteLog( 'Start configuring the mailbox' )
print 'Start configuring the mailbox'
try :
self .handle = smtplib.SMTP( self .smtphost, self .port)
self .handle.login( self .username, self .password)
self .mccLog.mccWriteLog( 'The mailbox configuration is successful' )
print 'The mailbox configuration is successful'
except Exception, e:
self .mccLog.mccError( 'The mailbox configuration is failed' + e)
print 'The mailbox configuration is failed'
exit()
#
# if __name__=='__main__':
# mail = mailHelper()
# body = mail.acceptMail()
# print body
# print mail.analysisMail(body)
# mail.sendMail('OK','Slave')
|
weiChatControlComputer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#-*-coding:utf-8-*-
import sys
reload (sys)
sys.setdefaultencoding( "utf-8" )
import time
import sys
from mailHelper import mailHelper
from excutor import executor
from configReader import configReader
__Author__ = 'william'
__Verson__ = 0.5
reload (sys)
sys.setdefaultencoding( 'utf-8' )
class MCC( object ):
CONFIGPATH = 'config.ini'
KEY_COMMAND = 'Command'
KEY_OPEN = 'Open'
KEY_BOSS = 'Boss'
KEY_TIMELIMIT = 'timelimit' #扫描时间的频率
def __init__( self ):
self .mailHelper = mailHelper()
self .configReader = configReader( self .CONFIGPATH)
commandDict = self .configReader.getDict( self .KEY_COMMAND)
openDict = self .configReader.getDict( self .KEY_OPEN)
self .timeLimit = int ( self .configReader.readConfig( self .KEY_BOSS, self .KEY_TIMELIMIT))
self .excutor = executor(commandDict,openDict)
self .toRun()
def toRun( self ):
'''
实现轮训操作
:return:
'''
while True :
self .mailHelper = mailHelper()
self .run()
time.sleep( self .timeLimit)
def run( self ):
mailBody = self .mailHelper.acceptMail()
if mailBody:
exe = self .mailHelper.analysisMail(mailBody)
if exe:
self .excutor.execute(exe, self .mailHelper)
if __name__ = = '__main__' :
mcc = MCC()
|
运行截图:
4.总结
在这个小项目的编写过程中,知道了项目开发的基本流程并且走了一遍,通过项目管理的方式去开发项目,并且在这个小项目开发的过程中,复习了Python一些初级阶段的基础知识,并且更深刻体会到从项目的设计到项目的实施,以及项目的测试运维等步骤需要程序员深刻的理解,这样才能在项目中逐渐完善自我。
待续。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/qq_30070433/article/details/73731187