去年夏天的时候,用 Flask 开发了一个 简易版的一言 ,算是最初的 beta 版,部署在了 Heroku 上面(那时我还没购买服务器),由于 Heroku 免费版有时间池的限制,在我购置了服务器后就重新用 Go 重写了一下 部署在自己的服务器上 ,算是 1.0 版,这两天又重新拾坑,开发出了 2.0 版本。
在 1.0 版本使用了较长的时间后,基于以下考量,我还是重构了部分代码:
于是乎,本着「生命不死,折腾不止」的态度,2.0 版本诞生了。
本 API 的 源码 已开源至 GitHub,如有需要的可自行搭建。
以下是 2.0 版本的更新日志:
爬取数据时采用了异步爬虫,解决了 1.0 版本爬取时效率低下的问题,同时选取了 xxhash 作为散列函数,将一言主体 hash 后,得到的 64bit 的无符号整数作为主键,这样如果爬取到了重复的一言也不会插入数据库中。
得益于异步爬虫的高效率,在很短的时间内,爬取到了足够的一言数。目前,数据库内共有 15371
条一言。以后数量还会不断地增加。
爬虫程序
已托管至 GitHub。
数据库更换成了 MySQL,以承受高并发访问,以下为建表语句:
+----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| id | bigint(20) unsigned | NO | PRI | NULL | |
| hitokoto | varchar(300) | NO | | NULL | |
| source | varchar(64) | NO | | NULL | |
| origin | varchar(12) | NO | | NULL | |
+----------+---------------------+------+-----+---------+-------+
2.0 版本共包含以下请求参数:
格式为 encode=
,包含以下四个参数值:
class = 'hitokoto'
的标签中×××××——「×××」
,即主体 + 出处格式为 charset=
,包含以下两个参数值:
content-type
字段添加 charset=utf-8
格式为 length=
,会随机返回一条不超过这个查询长度的语句。
格式为 callback=
,会根据回调参数的值返回对应的函数调用,其中函数的参数为一个字典,key 分别为 hitokoto
和 source
。
注意:callback 参数会覆盖掉 encode 参数
调用地址:https://api.itswincer.com/hitokoto/v2/
例如,我想请求一个长度不超过 10 的一言,并以 JSON 格式返回:
curl 'https://api.itswincer.com/hitokoto/v2/?encode=json&length=10'
{"hitokoto":"(눈_눈)","source":"进击的巨人"}
如果想在自己的网页使用的话,可以采取以下两种方法:
只需要在想要展示的标签加上 class='hitokoto'
属性,随后在任何地方加上:
插入页面的显示结果是:××××××× ——「×××」形式。
展示结果见侧栏。
如果对 encode=js
返回的格式不满意,可自行定义页面展示的格式:比如以下代码仅展示一言的主体部分:
定义标签和函数:
随后将请求地址加上参数 callback=showHitokoto
:
以上示例将会在 HTML 标签首个包含 class='hitokoto'
的标签内部插入仅包含一言主体的部分。
你看到某句熟悉的一言从屏幕上显示的时候,勾起了之前第一次看到这句话时或感动、或开心、或难过的回忆,而某个陌生人也会因此和你一样陷入属于他的短暂回忆——想到这些不是很快乐吗?而我想那个陌生人一定也正想着同样的事情。我一直这样觉得。
而这,应当就是文字赋予一言的最大作用了。