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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
对python中执行DOS命令的3种方法总结
May 12 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
详解python中的Turtle函数库
Nov 19 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
python实现七段数码管和倒计时效果
Nov 23 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
Python学习之os模块及用法
Jun 03 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 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
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
详解Python中for循环的使用方法
2015/05/14 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
如何表示python中的相对路径
2020/07/08 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
新学期红领巾广播稿
2014/01/14 职场文书
会计毕业自我鉴定
2014/02/05 职场文书
团支部推优材料
2014/05/21 职场文书
学校清明节活动总结
2014/07/04 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL