如何自動開啟微信通知?
微信有一個很貼心的功能瞻讽,當(dāng)你在電腦上登錄的時候鸳吸,你可以選擇不通知手機(jī)。但是這個很貼心的功能很笨速勇,沒辦法再我鎖定的時候自動開啟通知……怎么辦呢晌砾?自己解決吧!
背景
因為Mac上開了微信烦磁,手機(jī)上可以設(shè)置不提示贡羔,但我暫時離開的時候總是忘記開啟微信通知。
購買了米動手表就是為了避免這樣的事情發(fā)生个初,但是偶爾忘記打開手機(jī)上的通知會錯過重要的事情乖寒。
當(dāng)然,我已經(jīng)將不重要的通知全部設(shè)置為消息免打擾了院溺。
需求
因此需要在我離開筆記本之前設(shè)置手機(jī)開啟通知楣嘁,在我回到筆記本旁邊后關(guān)閉手機(jī)通知。
分析
整個過程是如何呢珍逸?
我離開電腦逐虚,合蓋/鎖定;
微信進(jìn)入手機(jī)通知狀態(tài)(退出)谆膳;
我來到電腦前叭爱,打開/解鎖;
微信進(jìn)入手機(jī)靜音狀態(tài)(登錄)漱病;
那么關(guān)鍵的步驟就在于:
如何判斷電腦鎖定解鎖/睡眠喚醒了呢买雾?
如何關(guān)閉微信或者退出微信?
如何啟動微信或者登錄微信杨帽?
如何關(guān)閉/啟動程序
查了下漓穿,下面這條命令可以通知Chrome正常關(guān)閉。
osascript -e 'tell app "/Applications/WeChat.app" to quit'
而下面這條命令可以啟動Chrome注盈。
open "/Applications/WeChat.app"
如何判斷電腦睡眠
至于如何在離開電腦和回到電腦前進(jìn)行操作晃危,在參考5中看到了這么一句話:
You can schedule your Macintosh to wake up in the Energy Saver preference panel. See the Schedule button.
也就是說在電源管理中,有對應(yīng)的計劃任務(wù)可以管理老客。
在Alfred中輸入EnergySaver
僚饭,打開節(jié)能
面板震叮,然而,并沒有計劃
這個按鈕鳍鸵。
在不進(jìn)行其他程序安裝的情況下苇瓣,貌似這條路堵死了。
如何判斷屏幕鎖定
上面的內(nèi)容是在5月31日更新的权纤,今天9月14日,繼續(xù)乌妒。
考慮了一下汹想,實際上我需要在電腦鎖屏后就自動轉(zhuǎn)入微信通知,這樣手表可以收到具體的通知信息撤蚊。
那么古掏,怎么來獲取到屏幕鎖定呢?在stackoverflow上找到了這么一條信息:
#!/usr/bin/python
import Quartz
d = Quartz.CGSessionCopyCurrentDictionary()
if d.get("CGSSessionScreenIsLocked", 0):
print 'Screen locked.'
else:
print 'Screen unocked.'
上面的代碼基本上就可以判定了侦啸,那么后面的解決方案就很好辦了槽唾。
解決方案
將下面的內(nèi)容保存為wechat_auto.py
:
#!/bin/env python
# -*- coding=utf-8 -*-
import sys, os, subprocess
import logging, logging.handlers
def main():
import time
fn = sys._getframe().f_code.co_name
logger.debug(u"%s()." % fn)
while True:
if is_system_locked():
if is_app_running(app_name):
control_app(app_name, 'stop')
continue
if not is_app_running(app_name):
control_app(app_name, 'start')
time.sleep(10)
def is_system_locked():
fn = sys._getframe().f_code.co_name
logger.debug(u"%s()." % fn)
import Quartz
system_locked = False
d = Quartz.CGSessionCopyCurrentDictionary()
result = d and \
d.get("CGSSessionScreenIsLocked", 0) == 0 and \
d.get("kCGSSessionOnConsoleKey", 0) == 1
logger.debug(u'%s: CGSessionCopyCurrentDictionary is %s.' % (fn, d))
logger.debug(u'%s: result is %s.' % (fn, result))
if result == 0: system_locked = True
logger.debug(u'%s: system is %slocked.' % (fn,
'' if system_locked else 'not '))
return system_locked
def is_app_running(app_name=None):
fn = sys._getframe().f_code.co_name
logger.debug(u"%s()." % fn)
import commands
if app_name:
output = commands.getoutput('pgrep %s' % app_name)
if output:
logger.debug(u'%s: app %s is running.' % (fn, app_name))
return True
else:
logger.debug(u'%s: app %s is not running.' % (fn, app_name))
return False
else:
logger.error(u'%s: params is not set.' % fn)
def control_app(app_name=None, action=None):
fn = sys._getframe().f_code.co_name
logger.debug(u"%s()." % fn)
if app_name and action:
if action == 'start':
if app_name == 'WeChat':
p = subprocess.Popen(
['osascript','%s%swechat_login.scpt' % (os.getcwd(), os.sep)],
stdout=subprocess.PIPE)
else:
p = subprocess.Popen(
['osascript' '-e', 'tell "%s" to activate' % app_path],
stdout=subprocess.PIPE)
logger.debug(u'%s: %s started.' % (fn, app_name))
if action == 'stop':
p = subprocess.Popen(
['osascript','-e','tell application "%s" to quit' % app_path]
, stdout=subprocess.PIPE)
logger.debug(u'%s: wechat stopped.' % fn)
else:
logger.error(u'%s: params is not set.' % fn)
def init_log(log_name='custom', log_level='info', log_files=3):
'''
Initialize the logger.
'''
log_file = u"%s%s%s.log" % (os.getcwd(), os.sep, log_name)
logger = logging.getLogger(log_name)
logger.setLevel(log_level.upper())
handler = logging.handlers.RotatingFileHandler(log_file, \
maxBytes = 1024*1024*50, backupCount = log_files)
fmt = '%(asctime)s %(levelname)-6s %(filename)s:%(lineno)s - ' \
+ '%(message)s'
formatter = logging.Formatter(fmt)
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
prog_name = 'wechat_auto'
log_level = 'debug'
logger = init_log(prog_name, log_level)
app_name = 'WeChat'
app_path = '/Applications/WeChat.app'
main()
因為微信啟動時需要登錄,為了方便光涂,我們借助AppleScript
的強(qiáng)大功能庞萍,去幫助我們點擊這個按鈕。
tell application "WeChat" to activate
delay 1
tell application "System Events"
tell application process "WeChat"
click button "登錄" of window "Window"
end tell
end tell
隨后在terminal
中執(zhí)行下述命令:
python wechat_auto.py &
如果執(zhí)行正常的話忘闻,腳本中的log_level
就可以修改為'info'了钝计。
其他
在使用過程中遇到了兩個問題,解決如下齐佳,其實是很簡單的問題私恬。
無法打開指定文件
/usr/bin/python: can't open file './system_locked.py': [Errno 2] No such file or directory
解決很簡單,就是在shell
腳本中使用絕對路徑就好了炼吴。
微信報錯
昨天在使用上述命令進(jìn)行微信的啟動和關(guān)閉測試時本鸣,會報一個錯,然后微信關(guān)閉硅蹦。
但是在后續(xù)測試中無法重現(xiàn)荣德,因此這里只是做一個記錄。
無法獲取CGSessionCopyCurrentDictionary
因為當(dāng)前進(jìn)程沒有對應(yīng)的Session
童芹,比如我們通過crontab
執(zhí)行就會出現(xiàn)這種問題命爬。