python实现微信远程控制电脑


Posted in Python onFebruary 22, 2018

首先,我们要先看看微信远程控制电脑的原理是什么呢?

我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我们发送关机指令给这个邮箱的时候,若Python检测到相关的指令,那么Python直接发送本机的相关命令。

下面来分析一下该项目:

1.需求分析

1.范围:用Python开发一个远程操控电脑的项目。

2.总体要求:

2.1 总体功能要求:能够通过该软件远程控制该软件所在的电脑的重启或关机操作。
2.2 系统要求:开发语言使用Python,并且开发出来的程序能在Windows运行。

2.设计

首先,我们可以利用Python的标准库控制本机电脑,然后要实现远程的话,我们可以把电子邮件作为远程控制的渠道,我们用Python自动登录邮箱检测邮件,当我们发送关机指令给这个邮箱的时候,若Python检测到关机的指令,那么Python直接发送本机的关闭。

3.编写

本项目的流程图如下

python实现微信远程控制电脑 

第一步,需要注册一个新浪邮箱。然后点击新浪邮箱点击右上角设置如图

python实现微信远程控制电脑

选择“客户端pop/imap/smtp”

python实现微信远程控制电脑 

打开新浪邮箱的SMTP与POP3功能

python实现微信远程控制电脑

具体实现代码:
配置文件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()

运行截图:

python实现微信远程控制电脑

4.总结

在这个小项目的编写过程中,知道了项目开发的基本流程并且走了一遍,通过项目管理的方式去开发项目,并且在这个小项目开发的过程中,复习了Python一些初级阶段的基础知识,并且更深刻体会到从项目的设计到项目的实施,以及项目的测试运维等步骤需要程序员深刻的理解,这样才能在项目中逐渐完善自我。

待续。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python内置函数dir详解
Apr 14 Python
python实现DES加密解密方法实例详解
Jun 30 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Python生成器以及应用实例解析
Feb 08 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
python性能测试工具locust的使用
Dec 28 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
Python标准库笔记struct模块的使用
Feb 22 #Python
python实现手机通讯录搜索功能
Feb 22 #Python
Python实现通讯录功能
Feb 22 #Python
Python SQLite3简介
Feb 22 #Python
Python Web程序部署到Ubuntu服务器上的方法
Feb 22 #Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 #Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 #Python
You might like
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
PHP中GET变量的使用
2006/10/09 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
10个顶级Python实用库推荐
2021/03/04 Python
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
美国探亲签证邀请信
2014/02/05 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
浅谈Redis的事件驱动模型
2022/05/30 Redis