用微博实现远程关机

平时工作日电脑都是放在实验室,很少带回去,有的时候还要运行一些东西,人先回宿舍了,电脑也跟着熬了一宿夜。像我这种老破电脑,最怕逞强,对其损伤还是很大的。
前些天看了一些不错的思路,基本差不多,但他使用了微博的API,我觉得有点麻烦,于是换了自己的方法。


Thought

首先通过读取最新一条微博内容获取指令:设置一个关键词,当检测到微博出现关键词,即可触发关机指令;同时考虑只有新微博的指令才有效,进行一些逻辑判断。
关机是否顺利呢?这是在用到发送邮件的模块,成功关机则发送邮件到指定邮箱。
大致如此。


Analysis

先来写获取微博内容的部分:
因为移动版微博的内容较少,速度也快点,所以抓的移动版微博,找到自己主页个人微博的地址。
headers伪装,之后再使用BeautifulSoupfind进行内容提取,比较简单。
json.loads转化为字典,之后提取更加方便。
最后返回最新一条微博的发布时间cr_time,微博id号id_及微博内容text

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
def get_weibo_content():
url = "http://m.weibo.cn/page/tpl?containerid=XXXXXXXXXXXXXXX_-_WEIBO_SECOND_PROFILE_WEIBO"
send_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',
'Accept': '*/*',
'Connection': 'keep-alive',
'Host': 'm.weibo.cn',
}
r = requests.get(url, headers=send_headers)
data = r.text
#print (data)
soup = BeautifulSoup(data,'lxml')
content = soup.find_all('script')[1].string
#print (content)
st = content.find('{"card_type"')
en = content.find('{"card_type"',st+2) -1
content = content[st:en]
#print (content)
content = json.loads(content)
cr_time = content['mblog']['created_at']
id_ = content['mblog']['id']
text = content['mblog']['text']
text = urllib.parse.unquote(text)
#print (text)
return cr_time, id_, text

之后再写一下发送邮件的部分:
SMTP_host为发送邮件地址的服务器,from_addr为发送邮件地址,password为发送邮件邮箱密码,to_addrs为接收邮件地址,subject为邮件主题,content为邮件内容。
比较简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from smtplib import SMTP
from email.mime.text import MIMEText
from email.header import Header
def send_email(SMTP_host, from_addr, password, to_addrs, subject, content):
email_client = SMTP(SMTP_host)
email_client.login(from_addr, password)
# create msg
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')#subject
msg['From'] = from_addr
msg['To'] = to_addrs
email_client.sendmail(from_addr, to_addrs, msg.as_string())
email_client.quit()

最后连接一下:
先获取之前的最新微博信息,进入循环,每次刷新再获得最新的微博信息,并进行比较,当最新微博id改变且新微博内容中有 “shutdown”这个关键词时,进行关机。
关机命令os.system(‘shutdown -s -t 10’)为10秒后关机,具体命令可再查询。
time.strftime(‘%H:%M:%S’)为当前时间。
最后sleep(20),表示每20秒执行一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if __name__ == "__main__":
cr_time, id_, text = get_weibo_content()
while True:
cr_time_n, id_n, text_n = get_weibo_content()
print (id_n)
print (text_n)
if str(id_n) != str(id_) and (u'shutdown' in text_n):
mytime = 'shutdown time : ' + str(time.strftime('%H:%M:%S')) + ". Process finished.."
send_email("smtp.XXX.com", "YYYYYY@XXX.com", "YOUR PASSWORD", "ZZZZZZ@AAA.com", "您的电脑关机成功!", mytime)
os.system('shutdown -s -t 10')
break
sleep(20)

大体如此:-)


Showing

首先运行程序,发布微博,带有关键词。

等一等,然后:

就是这么轻松:——)


Plus+

这个自动发送邮件模块其实还是很好用的,如果你的邮箱有手机提醒的话就更完美了。
在此之前,我还应用这个邮件模块,写了一个自动查询火车票的脚本。

通过它,我顺利的刷到了从某地回北京的硬卧票。。

怎么应用就看你了,希望你有一个不错的思路:——)

Yumin Huang wechat
快来订阅我的公众号吧-,-
坚持原创分享,来支持一下作者吧~