Skip to content

哦嗨哟,欧尼酱

想必每一个二刺螈都曾今都会幻想过 —— 每天早上女仆/只存在于美好幻想的可爱妹妹叫你起床。

然后,自从你学习了如何写出一个机器人,就想能不能通过机器人脚本来间接实现这个幻想呢?

懂得都懂:

100%

Graia Framework Community
上午 07:30
Hanser
@GraiaX おはよう
Hanser
上午 11:30
G
GraiaX
哦嗨哟

TIP

你可能会问上面这位叫你起床的是谁,
这位是 Hanser,B站账号是这个

想想就得劲虽然一个 At 跟语音八成不能成功叫你起床
那么,就开始我们今天的艺术创想吧(bushi)

什么是 Graia-Scheduler

Graia-Scheduler 是一个基于 asyncio,设计简洁,代码简单的计划任务库。

安装 Graia-Scheduler

注意

在写本章文档的时候,Graia-Scheduler 的版本为 0.0.7
而最新版本为 PyPI版本

TIP

假设你之前安装 Ariadne 时使用的是以下 3 种选项中的一种,那么你可以直接跳过本小节。

  • graia-ariadne[full]
  • graia-ariadne[graia]
  • graia-ariadne[standard]
bash
poetry add graia-scheduler
1
bash
pip install graia-scheduler
1

初始化 Graia-Scheduler

在你的代码中加入这些:

TIP

假如你使用了 saya = create(Saya) 则请直接跳到下一小节,createSaya 会帮你自动处理好的。

python
from graia.scheduler import GraiaScheduler


sche = create(GraiaScheduler)
1
2
3
4

一个最简单的例子

每分钟都在群里发垃圾消息的机器人为例子:

python
from graia.scheduler import timers
from graia.scheduler.saya import SchedulerSchema


@channel.use(SchedulerSchema(timers.every_minute()))
async def every_minute_speaking(app: Ariadne):
    await app.send_group_message(1919810, MessageChain("我又来了"))
1
2
3
4
5
6
7

通过 crontab 来设定时间

在上面的例子中,你一定会发现,timers 中绝大多数 timer 都是每隔一段间隔后触发的模式, 这明显跟我们让机器人每天早上 7 点半准时叫我们起床相违背。

假设你是在例如树莓派什么的地方运行,最好先检查一下你有没有设置好时区。
否则你的机器人可能会在协调世界时的早上 7 点半(北京时间 15 点半)叫你起床。

难道我们还要每天掐着点算什么时候启动机器人吗?

当然不是,有一个特殊的 timer 可以解决这个问题,那就是 timers.crontabify! 该方法支持传入一个 crontab 时间格式来进行时间计算, crontab 具体语法你可以看一下菜鸟教程对 crontab 的讲解

TIP

看清楚了,方法是 timers.crontabify 而不是 timers.croniter
事实上,graia-scheduler 所使用的 crontab 语法分析库支持将作为第六个参数导入,如:

python
#每天7点30分30秒发送消息
@channel.use(SchedulerSchema(timers.crontabify("30 7 * * * 30")))
1
2
Graia Framework Community
上午 07:30
Hanser
Hanser

Tip:

本文档使用 CC BY-NC-SA 4.0 协议进行共享,详情见 README

MIT License