室友太懒,晚上电脑开热点经常忘记设置电脑自动关机,可苦了我这个勤奋的孩子......

思路:python先登录邮箱,利用邮箱发送指令,每隔一段时间程序检测是否有关机指发送过来,然后把命令转成cmd命令。同时反馈指令是否发送成功。

一、邮箱查看和发送信息

这里使用的是QQ邮箱,想要用程序登录邮箱需要开通IMAP/SMTP服务。在我的邮箱->邮箱设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

设置成功后会有密码返回,保存密码,我们后面会用到

(一)、邮件发送

发送邮件需要构建下面的信息:

s_mes = {'From': '你的qq@qq.com', # 你的qq邮箱'password': '',  # 我们刚刚获得的密码'To': '需要发送的邮箱@qq.com',  # 接收的邮箱'Subject': '这是主题',  # 发送的主题,可以不填'message': "关机 3600",  # 发送的信息
}

发送邮箱代码如下:

def send_email(s_mes):my_sender = s_mes["From"]  # 发送人的账号my_pass = s_mes["password"]    # 授权码my_user = s_mes["To"]  # 接收人的邮箱s_message = s_mes['message']try:# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码msg = MIMEText(str(s_message), 'plain', 'utf-8')   # 发送的内容msg['From'] = formataddr(['', my_sender])  #  好像没什么同msg['To'] = formataddr(['', my_user])  #msg['Subject'] = s_mes['Subject']   # 发送的主题server = smtplib.SMTP_SSL("smtp.qq.com", 465)   # 服务器的地址和端口其他邮箱端口百度server.login(my_sender, my_pass)     # 登录的账号密码server.sendmail(my_sender, [my_user, ], msg.as_string())   #server.quit()    # 关闭连接return Trueexcept Exception as e:print(e)return False

(二)、邮箱接收(注意清除垃圾数据)

需要注意下面几点:

我们仅仅需要查看未读的邮件,需要获取发件人的信息和邮件的内容。

没有信息返回None

在获取邮件内容的时候,注意会有编码问题,特别注意,把信息转字符串后会有:<div></div>网页的东西,需要进行数据清洗。

def get_new_email():  # 用来查看信息# 应该返回的也是一个列表,所有的信息在列表里面,方便查看# 自动标记为已读,all_message = {}e_user = "你的邮箱"   # 你的邮箱号e_password = '****'  # 你的授权码host = "imap.qq.com"port = 993  # 端口号try:server = imaplib.IMAP4_SSL(host=host, port=port)print("已经连接")server.login(e_user, e_password)print("登录成功")except:print('连接出现问题!')return Nonenum = str(server.select()[1]).replace('[b\'', '').replace(']', '').replace('\'', '')count = int(num) - 1  # 获得最新的一封信的信息 # print(count)# print("邮箱数量:"+num)all_message['all_count'] = count# 整体信息获取typ, data = server.search(None, "Unseen")  # 获取所有未读的信息newlist = data[0].split()  # 找最新的一封邮件count = len(newlist)print("未读邮件数量"+str(count))all_message['Unseen_count'] = len(newlist)# print(newlist[0])# 标记最新的一封邮件为已读if count == 0:return Noneserver.store((newlist[0]), '+FLAGS', '(\\Seen)')# print('标记最新邮件为已读')typ, data = server.fetch(newlist[count-1], '(RFC822)')  # 获得最新信封的数据数据  count表示第几封信msg = email.message_from_string(data[0][1].decode('utf-8'))  ## 对主题进行获取 主题可能为空try:sub = msg.get('subject')  # 获取主题subdecode = email.header.decode_header(sub)[0][0]  # 需要进行转码# print("邮箱标题:", end='')if subdecode:all_message['Subject'] = subdecode.decode('UTF-8')# print(subdecode.decode('UTF-8'))else:all_message['Subject'] = ''# print('空')except Exception as e:all_message['Subject'] = str(e)# print(e)# 获取发件人的信息name = msg.get('from')name = str(email.header.decode_header(name))name = str(re.findall(r'\D?\d*@qq\.com', name)).replace('[', '').replace(']', '').replace('\'', '').replace('<', '')name = name.replace('\"', '')all_message["name"] = str(name)print("发件人:"+name)message = ''who = {}# 获取邮件所有内容try:for part in msg.walk():# 如果ture的话内容是没用的if not part.is_multipart():message = message + str(part.get_payload(decode=True).decode('utf-8'))# 解码出文本内容,直接输出来就可以了print(message)  # 查看内容server.close()who[name] = messageall_message['message'] = messagereturn all_messageexcept Exception as e:# # 无伤大雅,,,# print("错误:"+e)# print("HTML格式测试:")try:content = msg.get_payload()content_charset = 'UTF-8'content_charset = content[1].get_content_charset()text = content[1].as_string().split('base64')[-1]html_content = base64.b64decode(text).decode(content_charset)message = str(html_content)all_message['message'] = messagereturn all_messageexcept Exception as e:print('错误'+e)server.close()all_message['message'] = ''return None

三、逻辑整理一遍

下面的代码是通过读取文本来修改程序的一些参数

def is_admin(qq):  # 判断是否是管理员发送的邮件try:with open("admin.txt", "r") as f:admin = f.readlines()for i in admin:i = str(i).replace("\n", '')if str(qq) == str(i):# print("true")return Truereturn Falseexcept:with open("admin.txt", "w+") as f:f.write("***@qq.com\n")  # 写你的邮箱f.write("****@qq.com")f.close()return is_admin(qq)def send_admin():  # 用来读取登录邮箱的账号,可以不用name = {}try:with open("qq.txt", "r+") as f:a = f.readline()a = str(a).replace("\n", "")b = a.split("#")name["From"] = ba = f.readline()a = str(a).replace("\n", "")b = a.split("#")name["password"] = breturn nameexcept:with open("qq.txt", "w+") as f:  f.write("From #***@qq.com\n")  # 账号f.write("password  #****\n")  # 授权码f.close()return send_admin()

主函数:

# -*- coding: UTF-8 -*-
import email
import base64  # 解码
import imaplib
import os
import re
import smtplib
import time
from email.mime.text import MIMEText
from email.utils import formataddr
import json
from email.header import decode_header  # 解码邮件主题
# 将发送封装成一个类,然后把功能分成各个函数,方便以后修改# 可以用邮箱远程控制后,就剩下cookie 的动态获取了def get_new_email():  # 用来查看信息# 应该返回的也是一个列表,所有的信息在列表里面,方便查看# 自动标记为已读,all_message = {}e_user = "****@qq.com"e_password = '****'  # 授权码host = "imap.qq.com"port = 993  # 995 ?try:server = imaplib.IMAP4_SSL(host=host, port=port)print("已经连接")server.login(e_user, e_password)print("登录成功")except:print('连接出现问题!')return None#  [b'8'] 获得邮箱的数量,老办法,字符串!num = str(server.select()[1]).replace('[b\'', '').replace(']', '').replace('\'', '')count = int(num) - 1  # 获得最新的一封信的信息# print(count)# print("邮箱数量:"+num)all_message['all_count'] = count# 整体信息获取typ, data = server.search(None, "Unseen")  # 获取所有未读的信息newlist = data[0].split()  # 找最新的一封邮件count = len(newlist)print("未读邮件数量"+str(count))all_message['Unseen_count'] = len(newlist)# print(newlist[0])# 标记最新的一封邮件为已读if count == 0:return Noneserver.store((newlist[0]), '+FLAGS', '(\\Seen)')# print('标记最新邮件为已读')typ, data = server.fetch(newlist[count-1], '(RFC822)')  # 获得最新信封的数据数据  count表示第几封信msg = email.message_from_string(data[0][1].decode('utf-8'))  ## 对主题进行获取 主题可能为空try:sub = msg.get('subject')  # 获取主题subdecode = email.header.decode_header(sub)[0][0]  # 需要进行转码# print("邮箱标题:", end='')if subdecode:all_message['Subject'] = subdecode.decode('UTF-8')# print(subdecode.decode('UTF-8'))else:all_message['Subject'] = ''# print('空')except Exception as e:all_message['Subject'] = str(e)# print(e)# 获取发件人的信息name = msg.get('from')name = str(email.header.decode_header(name))name = str(re.findall(r'\D?\d*@qq\.com', name)).replace('[', '').replace(']', '').replace('\'', '').replace('<', '')name = name.replace('\"', '')all_message["name"] = str(name)print("发件人:"+name)message = ''who = {}# 获取邮件所有内容try:for part in msg.walk():# 如果ture的话内容是没用的if not part.is_multipart():message = message + str(part.get_payload(decode=True).decode('utf-8'))# 解码出文本内容,直接输出来就可以了print(message)  # 查看内容server.close()who[name] = messageall_message['message'] = messagereturn all_messageexcept Exception as e:# # 无伤大雅,,,# print("错误:"+e)# print("HTML格式测试:")try:content = msg.get_payload()content_charset = 'UTF-8'content_charset = content[1].get_content_charset()text = content[1].as_string().split('base64')[-1]html_content = base64.b64decode(text).decode(content_charset)message = str(html_content)all_message['message'] = messagereturn all_messageexcept Exception as e:print('错误'+e)server.close()all_message['message'] = ''return Nonedef send_email(s_mes):my_sender = s_mes["From"]  # 发送人的账号my_pass = s_mes["password"]    # 授权码my_user = s_mes["To"]  # 接收人的邮箱s_message = s_mes['message']try:# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码msg = MIMEText(str(s_message), 'plain', 'utf-8')   # 发送的内容msg['From'] = formataddr(['', my_sender])  #  好像没什么同msg['To'] = formataddr(['', my_user])  #msg['Subject'] = s_mes['Subject']   # 发送的主题server = smtplib.SMTP_SSL("smtp.qq.com", 465)   # 服务器的地址和端口server.login(my_sender, my_pass)     # 登录的账号密码server.sendmail(my_sender, [my_user, ], msg.as_string())   #server.quit()    # 关闭连接return Trueexcept Exception as e:print(e)return Falsedef is_admin(qq):try:with open("admin.txt", "r") as f:admin = f.readlines()for i in admin:i = str(i).replace("\n", '')if str(qq) == str(i):# print("true")return Truereturn Falseexcept:with open("admin.txt", "w+") as f:f.write("***@qq.com\n")f.write("***@qq.com")f.close()return is_admin(qq)def send_admin():name = {}try:with open("qq.txt", "r+") as f:a = f.readline()a = str(a).replace("\n", "")b = a.split("#")name["From"] = ba = f.readline()a = str(a).replace("\n", "")b = a.split("#")name["password"] = breturn nameexcept:with open("qq.txt", "w+") as f:f.write("From #****@qq.com\n")f.write("password  #**\n")f.close()return send_admin()if __name__ == '__main__':s_mes = {'From': '****@qq.com','password': '***','To': '***@qq.com','Subject': '这是主题','message': "关机 3600",}test = send_admin()s_mes["From"] = str(test["From"]).replace("['From ', '", '').replace("']", '')s_mes["password"] = str(test["password"]).replace("['password  ', '", '').replace("']", '')# print(s_mes)# print(test)# time.sleep(1.5)  # 设置延时,不然可能不会标记为已读while True:message = get_new_email()if message == None:  # Noneprint("没有人,休息30s")time.sleep(30)continueif is_admin(message['name']):content = message['message'].replace("\n", '').split(" ")minling1 = str(content[0]).replace("<div>", '').replace("</div>", '')minling2 = str(content[1]).replace("</div>", '').replace("<div>", '')if str(minling1) == "关机" or str(minling1) == "shutdown":num = minling2try:send_email(s_mes)cmd = "shutdown -s -t "+str(num)os.system("shutdown -s -t "+str(num))s_mes["message"] = "发送关机指令成功:" + cmds_mes["To"] = message['name']print("关机成功!")except:s_mes["message"] = "出现错误!"s_mes["To"] = message['name']send_email(s_mes)print('出现错误!')else:print(content)else:print("不是管理员")print("休息30s1")time.sleep(30)# print('结束')

测试成功后,用pyinstaller 打包成exe文件,同时将黑框框隐去,咋有点像后台,哈哈。

需要安装pyinstaller包,已经上面的库要在python环境里面,出现库错误,请看这里:传送门

cmd输入:pyinstaller -F py文件的路径 -w

-w 是隐去黑框框

再来点刺激的,打包后的exe文件,直接放到C盘自启文件夹里面

我的是:C:\Users\你的登录名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

在这个文件夹里面的程序开机会自启。

啧啧啧

用Python实现远程控制电脑关机(啧啧啧)相关推荐

  1. python局域网控制电脑关机_局域网内计算机远程开机、控制和关机

    学校里有了卫星接收计算机,在获取大量教学资源的同时麻烦又来了,每天都要去开机启动程序接收,接收完了还要关机:接收的资源共享给了计算机教室,可要用这些资源时,也还是要打开卫星接收机.像有些学校几室弄得比 ...

  2. python手机远程控制电脑访问网页_Python 实战系列-微信或网页远程控制电脑

    Python 实战系列-微信或网页远程控制电脑 本系列课程为Python实战系列课程:使用微信控制电脑,使用Python的Web框架Flask搭建网页, 并使用网页控制电脑:使用wxPython编写图 ...

  3. 利用Python实现远程控制电脑

    两种方式吧,一种是用工具(较专业,功能多),另一种是写个脚本(仅为了好玩). 可以用这个来做下远程控制 ---- IIS7服务器管理工具.它的功能还是挺多的,可以在同一个窗口内浏览到多个服务器桌面的信 ...

  4. python局域网控制电脑关机_黑客操作:用python远程开机and关机

    前言 用python关机相信大家肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方 法,教你如何用 Python 来开机. 本文目标远程开机原理 Python 远程开机代码实现 Pyt ...

  5. python实现远程控制电脑_python 远程控制电脑 实现代码

    第一个步骤,申请一个邮箱,使这个邮箱与你的手机号码绑定,然后你在这个邮箱中设定如果有新的邮件就发短信通知.这样开机时往这个邮箱发个mail,我手机就会收到短信通知了. 第二个步骤就是通过python ...

  6. python电脑版微信-python如何实现远程控制电脑(结合微信)

    不知道大家有没有这样一个烦恼,"自己的电脑总是被别人使用,又不好意思设置密码",所以利用python设计了一个程序来实现自由管控. 功能虽然简单,但大家可以通过其思路来实现更多的功 ...

  7. python远程控制电脑_python如何实现远程控制电脑(结合微信)

    不知道大家有没有这样一个烦恼,"自己的电脑总是被别人使用,又不好意思设置密码",所以利用python设计了一个程序来实现自由管控. 功能虽然简单,但大家可以通过其思路来实现更多的功 ...

  8. 还在为python远程控制电脑感到苦难?微信库:itchat带你一展风采

    您的点赞和关注将是我持续更新的动力呢.v 有不懂的问题可以私聊我哦! Python微信库:itchat的用法详解 在论坛上看到了用Python登录微信并实现自动签到,用到一个Python库: itch ...

  9. Python骚操作-微信远程控制电脑

    Python+微信远程控制电脑 今天带给大家一个非常有意思的 python 程序,基于 itchat 实现微信控制电脑.你可以通过在微信发送命令,来拍摄当前电脑的使用者,然后图片会发送到你的微信上.甚 ...

最新文章

  1. vscode 搜索结果 整行_如何用VSCode愉快的写Python
  2. 简练软考知识点整理-控制干系人参与
  3. 练习题3(求四位会员卡号之和)
  4. Android中mesure过程详解
  5. printf与sprintf
  6. Java中的查找树和哈希表(一级)
  7. 一分钟学会看k线图_K线图怎么看?一分钟学会看K线图
  8. 禁止访问磁盘的注册表
  9. 【Swift 4.0】扩展 WCDB 支持 SQL 语句
  10. 帆软报表(FineReport) 的初步学习和使用
  11. 在Anaconda上安装Caffe 和 CUDA
  12. 牛客网–华为机试在线训练6:质数因子
  13. SetNamedPipeHandleState
  14. Android应用系统签名方法
  15. review board 使用
  16. Jetpack Compose - Modifier入门篇
  17. 微信v3数据或者v4数据转wxid
  18. 天嵌通途B210和USRP B210性能对比实验
  19. 上手阿里云服务器(一)——搭建LAMP开发环境、防火墙、文件传输
  20. 苹果个人账号转公司账号

热门文章

  1. java刷铁机最新版本_我的世界:刷铁机其实很容易制作,但是有一个特殊的限制条件!...
  2. 利用Python进行性能测试(上)
  3. 2022年上半年,产品经理的55条心得总结!
  4. Matlab:多项式的四则运算
  5. docker live-restore
  6. 【FreeRTOS】06 临界段的保护——关中断和关调度
  7. 您有一篇Maven 常用命令的文章,请注意查收!
  8. 浅谈对程序员的认识_浅谈关于程序员的本质
  9. storm spout读取mysql_java – Storm:用于从端口读取数据的Spout
  10. 斐波那契数列前20项_短线交易的秘诀——斐波那契数列,数学界的“完美”公式!...