用 Docker 部署 Hitokoto API,让你的 Hexo 主题更酷!

/images/cover/Hitokoto.png

前言

最近使用的 Hexo 主题 hexo-theme-anzhiyu 默认的随机一言接口被限流了, 根据官方文档在家里的服务器上搭建了一个, 目前用于我的博客.

部署

根据 官方文档 使用 docker-compose 部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
hitokoto_api:
image: hitokoto/api:release
container_name: hitokoto_api
hostname: hitokoto_api
environment:
NODE_ENV: production
url: https://你的域名
api_name: blog
redis.host: 你的 redis ip
redis.port: 你的 redis 端口
redis.password: 你的 redis 密码
redis.database: 你的 redis 数据库
ports:
- 8888:8000
restart: unless-stopped
volumes:
- ./data:/usr/src/app/data

配置文件:

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
name: "hitokoto" # 服务名称,例如:hitokoto
url: "https://v1.hitokoto.cn" # 服务地址,例如:https://v1.hitokoto.cn
api_name: "demo_prprpr" # 服务标识,取个好区分的标识吧,例如:cd-01-demo
server: # 配置 HTTP 服务的信息
host: 127.0.0.1 # 监听的地址
port: 8000 # 监听的端口
compress_body: true # 是否使用 GZIP 压缩
redis: # 配置 Redis
host: 127.0.0.1 # Redis 主机名
port: 6379 # Redis 端口
password: "" # Redis 密码
database: 0 # Redis 数据库
sentences_ab_switcher: # 本节是服务 AB 异步更新的配置,如果您不知道这个是什么意思,请保持默认
a: 1 # a 状态对应的 redis 数据库
b: 2 # b 状态对应的 redis 数据库
remote_sentences_url: https://cdn.jsdelivr.net/gh/hitokoto-osc/sentences-bundle@latest/ # 语句库地址,通常默认即可。如果您想使用您自己打包部署的语句库,您可以修改此项
workers: 1 # 启动 Worker 数目。0 表示启动和 CPU 核心数相同数量的 Worker
extensions: # 控制扩展
netease: true # 网易云音乐接口
requests:
enabled: false # 是否启用请求数目统计
hosts: # 需要单独统计的主机名
- sslapi.hitokoto.cn
telemetry: # 遥测服务
performance: false # 性能监控
error: false # 错误报告
usage: false # 使用报告
debug: false # 是否启用调试模式(该模式会让遥测服务打印调试信息)

上面官方的配置文件我只将 requeststelemetry 关闭了, 因为我并不需要这些功能.

部署后自己访问 ip:port 测试是否正常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
保存
{
"id": 9241,
"uuid": "a444bb92-9800-4b8e-a3ab-054ade2e78a2",
"hitokoto": "生活和漫画里面的那种热血还是不一样的。",
"type": "h",
"from": "影视飓风",
"from_who": "Tim",
"creator": "wssb",
"creator_uid": 14374,
"reviewer": 4756,
"commit_from": "web",
"created_at": "1679128135",
"length": 19
}

如果没问题就是域名配置了, 这部分就忽略了

Hexo 配置

安知鱼有 2 个地方会用到随机一言:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Footer Settings
footer:
list:
enable: true
...
subTitle:
enable: true
...
# source 调用第三方服务
# source: false 关闭调用
# source: 1 调用一言网的一句话(简体) https://hitokoto.cn/
# source: 2 调用一句网(简体) http://yijuzhan.com/
# source: 3 调用今日诗词(简体) https://www.jinrishici.com/
# source: 4 调用一言网的一句话(简体) https://hitokoto.dong4j.ink:1024
# subtitle 会先显示 source , 再显示 sub 的内容
source: 4
...
1
2
3
4
5
6
7
8
9
10
11
12
# the subtitle on homepage (主页subtitle)
subtitle:
enable: true
# source 调用第三方服务
# source: false 关闭调用
# source: 1 调用一言网的一句话(简体) https://hitokoto.cn/
# source: 2 调用一句网(简体) http://yijuzhan.com/
# source: 3 调用今日诗词(简体) https://www.jinrishici.com/
# source: 4 调用一言网的一句话(简体) https://hitokoto.dong4j.ink:1024
# subtitle 会先显示 source , 再显示 sub 的内容
source: 4
...

原来配置的 source 只有 3 个选择, 这里新增一个, 然后修改 themes/anzhiyu/layout/includes/third-party/footerBarSubtitle.pug 文件:

直接拷贝下面的代码到指定位置即可:

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
when 4
script.
function subtitleType () {
fetch('https://你绑定的域名')
.then(response => response.json())
.then(data => {
if (!{effect}) {
const from = '出自 ' + data.from
const sub = !{JSON.stringify(subContent)}
sub.unshift(data.hitokoto, from)
window.typed = new Typed('#footer-type-tips', {
strings: sub,
startDelay: !{startDelay},
typeSpeed: !{typeSpeed},
loop: !{loop},
backSpeed: !{backSpeed},
})
} else {
document.getElementById('footer-type-tips').innerHTML = data.hitokoto
}
})
}

if (!{effect}) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('!{url_for(theme.asset.typed)}').then(subtitleType)
}
} else {
subtitleType()
}

最后 Hexo 三连击即可显示效果, 比官方的快的多.