“剥削”机器:Python定时任务框架APScheduler

undefined

图片来源:pixabay.com

为什么要定时启动任务?人生苦短,我用Python

自己列了不少Flag,比如,规律地做这些事:「Feedly订阅」、「Workflowy清单」以及「Anki问答题」等。

有人说:「聪明人的理性大脑,往往在得到提醒时,才会上线。」

我的大脑老忘事,而且,通知对我轮番轰炸,也没辙,还是整不动。

我想:Python定时启动某些任务?

这些任务,都包含必需动作:点击浏览器图标,输入网址。再次点击图标……如此,循环往复。

也许市面上,已经有了封装好功能的集成软件,我没找。根据经验,这样容易路径曲折:在页面间跳转、搜索,折腾一阵子下来,加了很多功能,但是用不着。

这一次,我打算,写Python脚本,响应号召:「Automate the Boring Stuff with Python」。用Python 自动化无聊的事情。

作为初级代码学习者,除了单纯涨知识以外,学以致用才是正事。

这样,既可复习Python知识,又可省心省力,一举两得。

Python的Apscheduler框架是什么?

来自彩云小译的译文:

Advanced Python Scheduler (APScheduler)是一个 Python 库,它允许您安排稍后执行的 Python 代码,可以只执行一次,也可以定期执行。 你可以随心所欲地增加新工作或者删除旧工作。 如果将作业存储在数据库中,它们也会在调度程序重新启动后存活并维护其状态。 当调度程序重新启动时,它将运行它在关闭时应该运行的所有作业。

这就是一个调度指挥官,它在电脑上做安排:啥时候哪个软件需要打开。

高手可以直接「读文档(RFTD)」:https://apscheduler.readthedocs.io/en/stable/

基于Apscheduler的定时任务脚本怎么写?

调度器-导入所需的包

1
2
3
4
5
6
7
from datetime import datetime
import os
from apscheduler.schedulers.blocking import BlockingScheduler
from pync import Notifier
import webbrowser
import subprocess
import requests

自定义函数-需要调用的程序任务

我自定义tick函数,Notifier弹出提醒框,webbrowser用默认浏览器打开某个网址。

1
2
3
4
def tick(text='Your text', title = 'Your title.', url = 'https://your-website.com/'):
webbrowser.open(url)
print('Tick! The time is: %s' % datetime.now())
Notifier.notify(text,sound='Blow',title=title,)

自定义 lanuch_mac_app 函数,用subprocess打开 Mac系统的 Applications文件夹的应用,APP 参数填写应用名,比如「Anki」。

1
2
3
4
def lanuch_mac_app(app='Your app's name',text='Your text.'):
subprocess.call(["/usr/bin/open", "-W", "-n", "-a", f"/Applications/{app}.app"])
Notifier.notify(text,sound='Blow',title='Your title')

调度器-每天定时任务(cron)

scheduleradd_job添加调度任务,执行tick函数,区别于隔一段时间调度一次的任务,cron是定时任务。

1
scheduler.add_job(tick, 'cron', hour=19,minute=23)

调度器-启动Mac系统的程序

scheduleradd_job添加调度任务,执行lanuch_mac_app函数,kwargs给出关键词参数,这里是text的字符串「Recite Anki」。

1
scheduler.add_job(lanuch_mac_app,'cron',hour=12,minute=5,kwargs={'text':'Recite Anki'})

消息提醒-推送至微信

使用ServerChan实现文本消息,自动推送至移动端微信。

  • Server酱官方网站:sc.ftqq.com
  • 使用Github账号登录:sc.ftqq.com/?c=github&a=login
  • 绑定微信账号:sc.ftqq.com/?c=wechat&a=bind

添加下列代码:

1
2
3
post_url = 'https://sc.ftqq.com/[SKEY登入可见].send?'
data = {'text': title,'desp': text}
requests.post(url=post_url ,data =data, verify=False)

调度器脚本

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from datetime import datetime
import os
from apscheduler.schedulers.blocking import BlockingScheduler
from pync import Notifier
import webbrowser
import subprocess
import requests
def tick(text='Your text', title = 'Your title.', url = 'https://your-website.com/'):
webbrowser.open(url)
post_url = 'https://sc.ftqq.com/[SKEY登入可见].send?'
data = {'text': title,'desp': text}
requests.post(url=post_url ,data = data, verify=False)
Notifier.notify(text,sound='Blow',title=title,)
def lanuch_mac_app(app='Your app's name',text='Your text.'):
subprocess.call(["/usr/bin/open", "-W", "-n", "-a", f"/Applications/{app}.app"])
Notifier.notify(text,sound='Blow',title='Your title')
if __name__ == '__main__':
# 初始化BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(tick,
'cron',
hour=10,
minute=42,
kwargs={ 'text' : 'do something',
'url' :'https://workflowy.com/'})
scheduler.add_job(tick, 'cron', hour=18,minute=15,args=['do something'])
scheduler.add_job(lanuch_mac_app,'cron',hour=12,minute=5,kwargs={'text':'Recite Anki'})
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C '))
# 初始化BlockingScheduler
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
pass

在终端运行此脚本,搞掂。

对于重复机械的任务,无需记忆,无需点击,每天定时启动程序。

我们的口号:撸起袖子,加油干。

参考资料

官方文档

花10分钟让你彻底学会Python定时任务框架apscheduler

1 行代码,实现微信消息发送

changelog

2020/2/6 2:18 PM init
2020/2/9 11:14 AM revised
2020/2/10 9:59 PM add wechat push