Demo:小本钟

发现 @大本钟 好像休假了,于是我写了 @小本钟 去替班, 这应该是饭否上最简单的机器人之一,前后动手到上线不到五分钟(没错,Python 就是这么棒),下面我们直接来看代码( bigben.py )吧:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import datetime
import fanfou

# 请修改为你的 Consumer
consumer = {'key': 'consumer key', 'secret': 'consumer secret'}
# 请修改为你的 ID 和密码
client = fanfou.XAuth(consumer, 'username', 'password')
fanfou.bound(client)

now = datetime.datetime.now()
bong = 'Bong ' * ((now.hour % 12) or 12)
client.statuses.update({'status': bong[:-1] + '!'})

看,包括注释不到 20 行代码,我们就可以完成一个饭否机器人。

请确保你修改了上面需要修改的地方,然后 python bigben.py 这样运行它。然后去饭否查看效果吧。

我们用到了一个新的模块 datetime,这是一个处理日期和时间的模块。在上面我们获取了当前时间 now,它返回一个对象,可以直接访问它的属性(如 day,hour 和 minute 等)。 机器人报时会发送和当前点数相同个数的 Bong,所以需要使用 now.hour(0 <= now.hour < 24)去计算 Bong 的个数。

@大本钟 整点报时全年午休,这当然不是手动执行的,我们需要一个定时执行的功能。如果你在使用 Linux,那么最简单的方式是使用 Crontab。

如果你在使用 Windows,那么我们来看看怎样用 Python 自己的方法来定时执行:

>>> import time
>>> while True:
...     print('hello')
...     time.sleep(5)
...
hello
hello
hello
hello

模块 time 包含了另一些常用的时间操作,比如休眠(time.sleep(x),x 为一个以秒为单位的数), 你会发现上面的代码每隔 5 秒就会在屏幕打印 hello,请按下 Ctrl + C 或点击窗口关闭按钮来关闭它。 如果你不这么做,那么它将会一直运行下去,我们在上一章说过,while 可以重复执行块内的代码,直到判断条件为假时才结束。 看了上面的例子,你应该猜到了让代码定时运行的方法,把代码放到一个永真循环中,执行代码并休眠(sleep)一段时间。

机器人每个整点报时,为了达到这个效果我们还要做点其他工作:

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2017, 12, 10, 23, 31, 2, 998078)
>>> now.hour
23
>>> now.minute
31
>>>

有了这些,我们可以真的定时来执行一些任务了,下面是大概的模型:

>>> import time
>>> import datetime
>>> def work():
...     print('do something')
...
>>> while True:
...     now = datetime.datetime.now()
...     if now.minute < 1:
...         work()
...     time.sleep(60)
...

你只需要把你实际想做的工作放在函数 work 中即可,运行它,它会一直运行,并在恰当的时候执行 work。完整的可定时执行的机器人代码可点击 bigben2.py 查看。