首先,我们要先看看微信远程控制电脑的原理是什么呢?
我们可以利用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
[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
#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) os.system('python' + name)
configReader.py
#-*-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
#-*-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
#-*-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
#-*-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一些初级阶段的基础知识,并且更深刻体会到从项目的设计到项目的实施,以及项目的测试运维等步骤需要程序员深刻的理解,这样才能在项目中逐渐完善自我。
待续。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]