挖了一大堆坑之后开始痛苦的填坑之旅。第一步是虽然js还没写好但早就说过要弄的推特机器人。
主要功能是从官网上扒下物品数据的同时,寻找物品是否有被复刻过,给出详细的复刻时间及复刻次数等等,并且画一张图。
主要用到了 Python 以及 pymysql(MySQL)、tweepy、PIL(现在叫 Pillow 来着?)三个库。
MySQL 就略过不提了,来说说 tweepy 和 PIL 吧。

1 安装 tweepy 和 PIL 库

1
pip install tweepy Image

PIL 并不是内置模块,需要另外安装。tweepy 也是。
两个库的官方文档:PILtweepy。理论上只看官方文档就够了。

2 向 Twitter 申请 API Key

在 Twitter 的 Application Management 处创建一个 App。
记录下 Consumer Key 和 Consumer Secret,并申请自己的 Access Token 和 Access Token Secret。tweepy 需要用到它。

3 tweepy 的使用

tweepy 的使用十分简单,使用上面四个 Key 鉴权之后就可以随便玩了。

1
2
3
4
5
import tweepy
auth = tweepy.OAuthHandler(yourConsumerKey, yourConsumerSecret)
auth.set_access_token(yourAccessToken, yourAccessTokenSecret) #替换为各种 Key

api = tweepy.API(auth)

接下来就可以使用 api 这个对象进行各种操作。
做一个机器人最常使用的基本就是发推操作了,因此要用到 update_statusupdate_with_media 这两个方法。

1
2
3
4
5
api.update_status("Hello, world!")
# 发一条推

api.update_with_media("image.png", "Hello, world!")
# 发一条包含 image.png 这张图片的推

虽然这两个方法还可以用来回复,不过目前的机器人并不需要他,就不用管了。

4 PIL 的使用

4.1 基本操作

我要做的机器人还需要自己生成一张图片,所以需要 PIL 这个库。
在我的机器人中用到了 ImageImageDrawImageFont这三个模块。拿 PhotoShop 来比喻,分别具有“文件操作”、“绘图工具”、“读取字体”的作用。

1
2
3
4
5
6
7
8
9
10
from PIL import Image, ImageFont, ImageDraw

image = Image.new("RGB", (800, 600), "#FFFFFF")
# 创建一个 800 x 600,背景色为 #FFFFFF 的画布

font = ImageFont.truetype('NotoSansCJK-Regular.ttc', 15)
# 读取思源黑体字体,字号为 15。PIL 会自动从 Windows 的 Fonts 文件夹里寻找

draw = ImageDraw.Draw(image)
# 指定绘图工具要在 image 这张画布上操作

然后就画好了下面这张图。虽然要看到它我们还需要用 image.show() 将其显示出来。

指定了操作画布之后,就可以用 draw 这个对象来在画布上绘图了。比如画一条直线可以用 draw.line,绘制文字可以用 draw.text 等等。
下面以绘制文字和绘制直线为例。

1
draw.text((20, 10), "Hello, world!", font=font, fill="#000000")

这会在画布的 20 x 10 位置处作为文本框的左上角,绘制字体为 font(前面创建好的 15 号思源黑体,颜色为 #000000 的 Hello, world! 文字。
由于位置固定为左上角,无法进行类似居中之类的操作。如果要进行居中,需要使用 textsize 方法算出需要绘制的文本长度,然后对绘制位置进行相应计算。

1
draw.line((20, 10, 500, 10), fill="#000000", width=2)

这会以画布的 20 x 10 位置为 A 点,500 x 10 位置为 B 点,绘制宽度(或者说高度)为 2 像素,颜色为 #000000 的直线。并不是矩形。
目前我只用来当分隔线使用,没有用到更多的参数。

4.2 插入图片

光能绘制线条和文本还不行,还需要插入一些图片。这时候就需要用到 Image.open 这个方法。

1
2
3
4
5
openimage = Image.open("aimage.png")
# 打开名为 aimage.png 的图片,保存到 openimage 中

image.paste(openimage, (50, 50))
# 以画布的 50 x 50 处为左上角,粘贴这张图片。大小取决于图片本身大小。

十分简单不是吗。

最后的成品像这样。如果花点时间再好好排版的话能做得更好,比如加点背景色之类的。
虽然 PIL 的使用非常直观,但是因为毕竟不像 PhotoShop,甚至画图工具那样所见即所得,建议先使用工具排好版再开始写代码。

4.3 保存图片

保存图片只需要一条语句。

1
image.save("save.png")

图片会被自动生成。

5 让机器人跑起来

Python 文件不会自己跑起来,让它一直跑下去也不现实。好在 Linux 上有 crontab 这种类似计划任务一样的东西可以自动执行脚本。
把写好的文件加入到 crontab 里面去就能让它自动执行了。
至于 crontab 要怎么写,文件里有模板可以用来参考。

花了一天时间终于让机器人跑起来了。记得之前弄这个东西是 9 月左右,现在快 12 月了终于把坑填上了……
虽然不出什么意外机器人就会在每周官网更新时抓新数据发推,在物品快要过期时自动读取数据发推提醒。懒果然是第一生产力啊。
坑数量 - 1(剩余:Infinity)