Hexo 3.1.1 静态博客搭建指南

Hexo

Hexo 是一个基于 Node.js 的静态博客程序,可以方便的生成静态网页托管在 GitHubHeroku 上。作者是来自台湾的 tommy351

GitHub Pages 本来用于托管在 GitHub 上的项目作介绍,后来被不少开发者用来搭建博客,官方也表示欢迎该行为,并提供了 300M 的免费空间。

优势:

  • 生成静态页面快
  • 支持 Markdown
  • 兼容 Windows, mac OS 和 Linux
  • 部署方便,日常使用仅需五个命令
  • 高扩展性、自订性,文件少、小,易理解

⚠️ 注意:本文适用于 hexo 3.x 版本,与 2.x 略有出入!


配置 SSH

使用 Hexo 博客必须配置 SSH。

打开 Terminal(终端,Windows 用户请安装 GitHub Desktop 后打开 Git bash,效果等同) ,输入 cd ~/.ssh,如果果提示:No such file or directory 说明未配置 SSH。

  • 本地生成密钥对
    ssh-keygen -t rsa -C "你的邮件地址",注意命令中的大小写不要搞混。按提示指定保存文件夹,不设置密码。

  • 添加公钥到 GitHub

    1. 根据上一步的提示,找到公钥文件(默认为 id_rsa.pub),用记事本打开,全选并复制。
    2. 登录 GitHub,右上角 头像 -> Settings —> SSH keys and GPG keys —> New SSK key。把公钥粘贴到 Key 中,任意填好 Title 并点击 Add SSH key。
    3. Terminal 中输入命令 ssh -T git@github.com,选 yes,等待片刻可看到成功提示。
  • 修改本地的 ssh remote url,不用 HTTPS 协议,改用 Git 协议

    1. GitHub 仓库中获取 ssh 协议相应的 url
    2. 本地仓库执行命令 git remote set-url origin SSH 对应的 url,配置完后可用 git remote -v 查看结果

这样 git pushhexo d 时不再需要输入账号密码。


搭建博客

注: 以下命令行需要在 Terminal 终端中执行(Windows 使用 Git bash)。

  • 安装 Git:下载安装后,注册 GitHub 账号并配置 Git 和 SSH 公私钥

  • 安装 Node.js

  • 安装 Hexo:npm install -g hexo,可用 hexo -v 查看版本。这里我用的是 3.1.1

  • 创建 Hexo 文件夹:新建放置博客的文件夹,进入并执行命令 hexo init。hexo 会在目标文件夹建立网站所需要的所有文件。

  • 安装依赖包:npm install

  • 创建 GitHub Repository:Repository 名字必须是 你的 GitHub 名.GitHub.io,比如我是 iTofu.github.io

  • 部署:打开博客根目录下的 _config.yml 文件,末尾添加如下信息:

    1
    2
    3
    4
    deploy:
    type: git
    repository: # 你的 GitHub 仓库地址,别忘了加上 .git
    branch: master

    然后执行命令:

    1
    2
    hexo generate # 生成静态页面,可以简化为 hexo g
    hexo deploy # 部署到 GitHub,可以简化为 hexo d

浏览器访问 iTofu.github.io 就能看到自己的 Blog 了,一般延迟半分钟左右才能看到效果。一开始看到 404 页面不要惊慌,耐心等等。

手打党请注意,配置文件的冒号后必须有一个空格。

如果报错:

1
Deployer not found:git

运行命令:

1
npm install hexo-deployer-git --save

Hexo 使用

生成静态页面

1
hexo generate # 简化:hexo g

本地启动

1
hexo server # 简化:hexo s

浏览器输入 localhost:4000 就可以看到效果。当你修改了文章或配置文件时,保存文件再刷新浏览器就能看到修改后的效果,非常方便。

新建文章

1
hexo new post "title"  # 新文章路径:\source\_posts\title.md,简化:hexo n 'title'

新建页面

1
hexo new page "title"

post、page 等可以改成其他 layout,可用 layout 在 scaffolds 目录下查看。在同目录下创建文件来添加自己的 layout,也可以编辑现有的 layout,比如 post 的 layout 默认是 \scaffolds\post.md

编辑文章

打开新建的文章 \source\_posts\title.md

1
2
3
4
5
6
7
8
9
10
11
title: HelloWorld!        # 文章页面上的显示名称,可以任意修改,不影响文章的 URL
date: 2015-11-09 15:56:26 # 文章生成时间,一般不改
categories: # 文章分类目录,可省略
- 随笔
- 瞬间
tags: # 文章标签,可省略
- hexo
- blog # 个数不限,单个可直接跟在 tags 后面
---

# 这里开始使用markdown格式输入你的正文

多级分类语法格式:(标签也可以用类似的写法)

1
2
3
4
5
6
7
8
# 第一种
categories:
- 一级分类
- 二级分类
- etc...

# 第二种
categories: [一级分类, 二级分类]

首页文章预览添加图片:

1
2
3
photos:
- https://xxx.com/photo1.jpg
- https://xxx.com/photo2.jpg

正文中可以使用 <!--more--> 设置文章摘要 如下:

1
2
3
4
5
# 以上显示在摘要中

<!--more-->

# 以下是余下全文,点开标题进入文章页才可见

more 以上内容即是文章摘要,如果设置了主页只显示摘要,则 more 以下内容点击 Read More 链接打开全文才显示。

简单命令

hexo 现在支持更加简单的命令格式了,比如:

1
2
3
4
hexo g == hexo generate # 生成
hexo d == hexo deploy # 部署 可与 hexo g 合并为 hexo d -g
hexo s == hexo server # 本地预览
hexo n == hexo new # 写文章

插入图片

博客中的图片文件可以直接放在 source 文件夹下,部署时上传到 GitHub 仓库中。但是 GitHub 项目容量有限,而且主机在国外,访问速度较慢,把图片放在国内的图床上是个更好的选择。我用的是 七牛云存储

免费用户实名审核之后,可以获取 10GB 永久免费存储空间、每月 10GB 下载流量、每月 10 万次 Put 请求、每月 100 万次 Get 请求,做图床绰绰有余。

注册账号,新建空间,我的新空间名是 blog,专门用来放置博客上引用的资源。

进入空间后点击「内容管理」,再点击「上传」:

七牛空间没有文件夹的概念,但是允许为文件添加带斜杠/的前缀,用来给资源分类。这里原作者设置前缀为img/Hexo 3.1.1 静态博客搭建指南/。上传了一张图片:

在右侧可以找到外链,复制地址:

Markdown 插入图片的语法为:

1
![图片描述,可选](图片链接,必填)

上传图片 -> 获取外链 -> 写入 Markdown,就这么简单!

由于七牛防盗链的白名单无法添加 localhost,暂时不设置防盗链,否则 hexo s 调试的时候,看不到图片。

以上操作每插入一张图片就要做一次,相当繁琐,于是写了个脚本简化,详见这篇文章《拖曳文件上传到七牛的Python脚本》


配置博客

全站配置

注意: 文件中配置项的冒号后面必须加空格,否则报错

下面有些选项要配置后文的插件才有效,文件中已注明。

  • 整站的配置:博客根目录下的 \_config.yml 文件。这是我的配置文件:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Hexo Configuration
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/hexojs/hexo/

# Site
title: "LEO'S NOTE" # 标题
subtitle: "心有猛虎 | 细嗅蔷薇" # 副标题
description: "Stay Hungry.<br>Stay Foolish." # 简介
author: Leo # 博主 站长
language: zh-Hans # 默认语言
timezone: # 时区



# Leo Custom
avatar: https://cdnqiniu.leox.top/avatar/avatar.png # 头像 NexT 主题增加选项
duoshuo_shortname: leodev # 多说 NexT 主题增加选项
baidu_analytics: a28408894a1d0eab2dedfc11c944989d # 百度统计 NexT 主题增加选项



# ---------------下面选项需要对应插件的支持---------------
# npm install hexo-generator-index --save
# npm install hexo-generator-archive --save
# npm install hexo-generator-tag --save
# npm install hexo-generator-category --save

# 一页显示几篇
index_generator:
per_page: 5 # 首页默认 10 篇文章标题 如果值为 0 不分页

archive_generator:
per_page: 20 # 归档页面默认 20 篇文章标题
yearly: true # 生成年视图
monthly: true # 生成月视图

tag_generator:
per_page: 10 # 标签分类页面默认 10 篇文章

category_generator:
per_page: 10 # 分类页面默认 10 篇文章



# Google Webmaster tools 谷歌统计
# visit https://www.google.com/webmasters/tools/dashboard?hl=zh-CN&authuser=0&siteUrl=http://leodev.me/
google_site_verification: 1rAjSg_LYunVt576r01InAPcRzfUpJ1sf6iiNhZPVwg


# Sitemap 站点地图
sitemap: # 需安装插件:npm install hexo-generator-sitemap --save
path: sitemap.xml

baidusitemap: # 需安装插件:npm install hexo-generator-baidu-sitemap --save
path: baidusitemap.xml

#plugins:
#- hexo-generator-sitemap


# title, chinese available
links_title: Links
# links 友情链接
links:
#GitHub: https://github.com/iTofu
隔壁老王: http://eizoios.com
破车推荐: http://poche.fm
TT: http://tsusolo.com
大强: http://www.ldaqiangl.com


# Feed 订阅
feed: # 需安装插件:npm install hexo-generator-feed --save
type: atom
path: atom.xml
limit: 20
hub:






# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://note.leodev.me # 站点外链 必填
root: /
permalink: :year/:month/:day/:title/
permalink_defaults:

# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang # 国际化文件夹
skip_render: # 跳过指定文件的渲染

# Writing
new_post_name: :title.md # File name of new posts
default_layout: post
titlecase: false # Transform title into titlecase
external_link: true # Open external links in new tab
filename_case: 0 # 1 为小写, 2 为大写
render_drafts: false # 显示草稿
post_asset_folder: false # 启动 asset 文件夹
relative_link: false # 链接改为与根目录的相对地址
future: true # 显示未来的文章
highlight:
enable: true
line_number: true
auto_detect: false
tab_replace:

# Category & Tag
default_category: uncategorized
category_map:
tag_map:

# Date / Time format
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss

# Pagination
## Set per_page to 0 to disable pagination
per_page: 5
pagination_dir: page

# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: next # 主题

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy: # 发布选项
type: git
repo: https://github.com/iTofu/iTofu.github.io.git
branch: master

更换主题

默认主题太丑,我们来换成 NexT 主题。

  • 安装:在博客根目录下执行 git clone https://GitHub.com/iissnan/hexo-theme-next.git themes/next
  • 启用:修改博客根目录下的 _config.yml 配置文件中的 theme 属性,将其设置为 next
  • 更新:在 themes/next 目录下执行 git pull (暂时不需要)
  • \themes\next\_config.yml 修改主题配置

我的 _config.yml 文件(值为 *** 的内容需要填你自己的):

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# ---------------------------------------------------------------
# Site Information Settings
# ---------------------------------------------------------------

# Put your favicon.ico into `hexo-site/source/` directory.
favicon: /favicon.ico

# Set default keywords (Use a comma to separate)
keywords: "LEO, LeoiOS, iTofu, iOS"

# Set rss to false to disable feed link.
# Leave rss as empty to use site's feed link.
# Set rss to specific value if you have burned your feed already.
rss:

# Specify the date when the site was setup
since: 2015

# Canonical, set a canonical link tag in your hexo, you could use it for your SEO of blog.
# See: https://support.google.com/webmasters/answer/139066
# Tips: Before you open this tag, remeber set up your URL in hexo _config.yml ( ex. url: http://yourdomain.com )
canonical: true


# Donate 文章末尾显示打赏按钮
reward_comment: 🍭 来根棒棒糖!
wechatpay: /blogImg/common/reward_wechatpay.png
alipay: /blogImg/common/reward_alipay.png


# ---------------------------------------------------------------
# Menu Settings
# ---------------------------------------------------------------

# When running the site in a subdirectory (e.g. domain.tld/blog), remove the leading slash (/archives -> archives)
menu:
home: /
#categories: /categories
lol: https://leodev.me/lol
archives: /archives
tags: /tags
about: /about
#commonweal: /404.html


# Enable/Disable menu icons.
# Icon Mapping:
# Map a menu item to a specific FontAwesome icon name.
# Key is the name of menu item and value is the name of FontAwsome icon. Key is case-senstive.
# When an question mask icon presenting up means that the item has no mapping icon.
menu_icons:
enable: true
#KeyMapsToMenuItemKey: NameOfTheIconFromFontAwesome
home: home
about: user
categories: th
tags: tags
archives: archive
commonweal: heartbeat
lol: anchor




# ---------------------------------------------------------------
# Scheme Settings
# ---------------------------------------------------------------

# Schemes
#scheme: Muse
#scheme: Mist
scheme: Pisces


# ---------------------------------------------------------------
# Font Settings
# - Find fonts on Google Fonts (https://www.google.com/fonts)
# - All fonts set here will have the following styles:
# light, light italic, normal, normal intalic, bold, bold italic
# - Be aware that setting too much fonts will cause site running slowly
# - Introduce in 5.0.1
# ---------------------------------------------------------------
font:
enable: true

# Uri of fonts host. E.g. //fonts.googleapis.com (Default)
host:

# Global font settings used on <body> element.
global:
# external: true will load this font family from host.
external: true
family: Monda

# Font settings for Headlines (h1, h2, h3, h4, h5, h6)
# Fallback to `global` font settings.
headings:
external: true
family: Roboto Slab

# Font settings for posts
# Fallback to `global` font settings.
posts:
external: true
family:

# Font settings for Logo
# Fallback to `global` font settings.
# The `size` option use `px` as unit
logo:
external: true
family: Lobster Two
size: 24

# Font settings for <code> and code blocks.
codes:
external: true
family: PT Mono





# ---------------------------------------------------------------
# Sidebar Settings
# ---------------------------------------------------------------


# Social Links
# Key is the link label showing to end users.
# Value is the target link (E.g. GitHub: https://github.com/iissnan)
#social:
#LinkLabel: Link
social:
Cover: https://leodev.me
GitHub: https://github.com/iTofu
GitLeo: http://api.leodev.me:3000
Weibo: http://weibo.com/coderleo
Twitter: https://twitter.com/leodaxia
CV: https://cdnqiniu.leox.top/common/resume.pdf
Honor: /honor
Wish: /WishList


# Social Links Icons
# Icon Mapping:
# Map a menu item to a specific FontAwesome icon name.
# Key is the name of the item and value is the name of FontAwsome icon. Key is case-senstive.
# When an globe mask icon presenting up means that the item has no mapping icon.
social_icons:
enable: true
# Icon Mappings.
# KeyMapsToSocalItemKey: NameOfTheIconFromFontAwesome
GitHub: github
Twitter: twitter
Weibo: weibo
CV: heartbeat
Cover: cube
GitLeo: git
Honor: thumbs-o-up
Wish: calendar-check-o


# Sidebar Avatar
# in theme directory(source/images): /images/avatar.jpg
# in site directory(source/uploads): /uploads/avatar.jpg
#avatar:


# Table Of Contents in the Sidebar
toc:
enable: true

# Automatically add list number to toc.
number: true


# Creative Commons 4.0 International License.
# http://creativecommons.org/
# Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero
#creative_commons: by-nc-sa
#creative_commons:


sidebar:
# Sidebar Position, available value: left | right
position: left
#position: right

# Sidebar Display, available value:
# - post expand on posts automatically. Default.
# - always expand for all pages automatically
# - hide expand only when click on the sidebar toggle icon.
# - remove Totally remove sidebar including sidebar toggler.
display: post
#display: always
#display: hide
#display: remove


# Blogrolls
#links_title: Links
#links_layout: block
#links_layout: inline
#links:
#Title: http://example.com/


# ---------------------------------------------------------------
# Misc Theme Settings
# ---------------------------------------------------------------

# Custom Logo.
# !!Only available for Default Scheme currently.
# Options:
# enabled: [true/false] - Replace with specific image
# image: url-of-image - Images's url
custom_logo:
enabled: false
image:


# Code Highlight theme
# Available value:
# normal | night | night eighties | night blue | night bright
# https://github.com/chriskempson/tomorrow-theme
highlight_theme: night


# Automatically scroll page to section which is under <!-- more --> mark.
scroll_to_more: true


# Automatically Excerpt. Not recommand.
# Please use <!-- more --> in the post to control excerpt accurately.
auto_excerpt:
enable: false
length: 150


# Wechat Subscriber
#wechat_subscriber:
#enabled: true
#qcode: /path/to/your/wechatqcode ex. /uploads/wechat-qcode.jpg
#description: ex. subscribe to my blog by scanning my public wechat account




# ---------------------------------------------------------------
# Third Party Services Settings
# ---------------------------------------------------------------

# MathJax Support
mathjax:
enable: false
cdn: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML


# Swiftype Search API Key
swiftype_key: ***

# Baidu Analytics ID
baidu_analytics: ***

# Duoshuo ShortName
duoshuo_shortname: ***

# Disqus
#disqus_shortname:

# Baidu Share
# Available value:
# button | slide
#baidushare:
## type: button

# Share
#jiathis:
#add_this_id:

# Share
duoshuo_share: true

# Google Webmaster tools verification setting
# See: https://www.google.com/webmasters/
google_site_verification: ***


# Google Analytics
google_analytics: UA-***

# CNZZ count
#cnzz_siteid:


# Make duoshuo show UA
# user_id must NOT be null when admin_enable is true!
# you can visit http://dev.duoshuo.com get duoshuo user id.
duoshuo_info:
ua_enable: true
admin_enable: true
user_id: ***
admin_nickname: 大侠
data_author_key: 1


# Facebook SDK Support.
# https://github.com/iissnan/hexo-theme-next/pull/410
facebook_sdk:
enable: false
app_id: #<app_id>
fb_admin: #<user_id>
like_button: #true
webmaster: #true

# Facebook comments plugin
# This plugin depends on Facebook SDK.
# If facebook_sdk.enable is false, Facebook comments plugin is unavailable.
facebook_comments_plugin:
enable: false
num_of_posts: 10 # min posts num is 1
width: 100% # default width is 550px
scheme: light # default scheme is light (light or dark)


# Show number of visitors to each article.
# You can visit https://leancloud.cn get AppID and AppKey.
leancloud_visitors:
enable: true
app_id: ***
app_key: ***

# Show PV/UV of the website/page with busuanzi.
# Get more information on http://ibruce.info/2015/04/04/busuanzi/
busuanzi_count:
# count values only if the other configs are false
enable: true
# custom uv span for the whole site
site_uv: true
site_uv_header: <i class="fa fa-user"></i>
site_uv_footer:
# custom pv span for the whole site
site_pv: true
site_pv_header: <i class="fa fa-eye"></i>
site_pv_footer:
# custom pv span for one page only
page_pv: false
page_pv_header: <i class="fa fa-file-o"></i>
page_pv_footer:

# Tencent analytics ID
# tencent_analytics:

# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
baidu_push: false



#! ---------------------------------------------------------------
#! DO NOT EDIT THE FOLLOWING SETTINGS
#! UNLESS YOU KNOW WHAT YOU ARE DOING
#! ---------------------------------------------------------------

# Motion
use_motion: true

# Fancybox
fancybox: true


# Script Vendors.
# Set a CDN address for the vendor you want to customize.
# For example
# jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
# Be aware that you should use the same version as internal ones to avoid potential problems.
vendors:
# Internal path prefix. Please do not edit it.
_internal: vendors

# Internal version: 2.1.3
jquery:

# Internal version: 2.1.5
# http://fancyapps.com/fancybox/
fancybox:
fancybox_css:

# Internal version: 1.0.6
# https://github.com/ftlabs/fastclick
fastclick:

# Internal version: 1.9.7
# https://github.com/tuupola/jquery_lazyload
lazyload:

# Internal version: 1.2.1
# http://VelocityJS.org
velocity:

# Internal version: 1.2.1
# http://VelocityJS.org
velocity_ui:

# Internal version: 0.7.9
# https://faisalman.github.io/ua-parser-js/
ua_parser:

# Internal version: 4.4.0
# http://fontawesome.io/
fontawesome:


# Assets
css: css
js: js
images: images

# Theme version
version: 5.0.1
commit: Aug 18 2016 - 08dacd70f5c8a7c9bd31ba0453a34c8fea0d2323

附:Google Analysis


个性化设置

先按照 NexT 使用文档 设置一下,其中的内容下面不再赘述。

sitemap 插件

谷歌与百度的站点地图,前者适用于其他搜索引擎,用来手动提交以增加收录

安装:

1
2
npm install hexo-generator-sitemap --save
npm install hexo-generator-baidu-sitemap --save

_config.yml 添加代码(如果没有的话,上文已添加了其实):

1
2
3
4
5
sitemap:
path: sitemap.xml

baidusitemap:
path: baidusitemap.xml

另外谷歌的 sitemap.xml 可以不写到配置文件中,自动生效。

在主页后面加 /baidusitemap.xml 可以看到 baidusitemap(谷歌同理),将该网址它提交给百度搜索:百度站长平台,贴吧账号无法在这里使用。

不过由于 GitHub 禁止了百度爬虫,百度无法抓取其中的 URL。试了各种解决方案都没有成功,除非把博客托管到其他平台上。建议还是使用 谷歌分析(Google Analysis)

添加新 Page

用如下命令添加新 page

1
hexo new page "lol"

然后在主题配置文件 \themes\next\_config.yml 添加(上文已添加):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
menu:
home: /
categories: /categories
archives: /archives
tags: /tags
lol: https://leodev.me/lol # 这里可以添加

menu_icons:
enable: true
#KeyMapsToMenuItemKey: NameOfTheIconFromFontAwesome
home: home
about: user
categories: th
tags: tags
archives: archive
commonweal: heartbeat
lol: anchor # 选一个图标

打开 \themes\next\languages\zh-Hans.yml,这是简体中文的配置文件,如果你的博客用的是其他语言,请打开对应的文件。

1
2
3
4
5
6
7
8
9
menu:
home: 首页
archives: 归档
categories: 分类
tags: 标签
about: 关于
search: 搜索
commonweal: 公益404
lol: 德玛西亚

注意这里第一列必须全为小写,否则效果类似这样:

设置完后效果如下:

替换字体库网址

使用中发现网站打开速度巨慢,一开始以为是 GitHub 的原因,但是本地调试时也要一分钟才能打开。使用Chrome抓包发现:

57.04 秒!

\themes\next 目录执行命令

1
grep 'css?family' -r ./

可以找到罪魁祸首就在 \themes\next\layout\_partials\head.swig 文件中:

1
2
3
4
5
6
7
{% if theme.use_font_lato %}
{% if config.language === 'zh-Hans' %}
<link href='//fonts.lug.ustc.edu.cn/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
{% else %}
<link href='//fonts.googleapis.com/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
{% endif %}
{% endif %}

作者的原意是想让语言设置为简体的用户都连接到中国科技大学的免费字体库,其他用户链接到 Google,没想到这个链接挂了。使用 Ping检测工具 可以看到 fonts.googleapis.com 被解析到了北京的服务器,速度相当快,所以我们直接使用 Google 的字体库就可以了:

1
2
3
{% if theme.use_font_lato %}
<link href='//fonts.googleapis.com/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
{% endif %}

修改底栏

如果你很追求个性化,你可以自定义底栏,以下是我修改后的底栏代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="copyright" >
{% set current = date(Date.now(), "YYYY") %}
&copy; {% if theme.since and theme.since != current %} {{ theme.since }} - {% endif %}
<span itemprop="copyrightYear">{{ current }}</span>
<span class="with-love">
<i class="fa fa-heart"></i>
</span>
<span class="author" itemprop="copyrightHolder">{{ config.author }}</span>
</div>

<div class="powered-by">
{{ __('footer.powered', '<a class="theme-link" href="https://hexo.io" target="_blank">Hexo</a>') }}
</div>

<div class="theme-info">
{{ __('<a class="theme-link" href="http://www.miitbeian.gov.cn/" target="_blank">皖ICP备16000856号</a>') }}
</div>

<!--<div class="theme-info">
{{ __('footer.theme') }} -
<a class="theme-link" href="https://github.com/iissnan/hexo-theme-next" target="_blank">
NexT.{{ theme.scheme }}
</a>
</div>-->

设置之后的底栏效果请翻到本文底部查看,然后你可以点击左上角目录返回回来。

标题下添加「阅读量」

参考:为NexT主题添加文章阅读量统计功能

效果:

embed.js 本地化

使用 Chrome 抓包可以得到多说评论核心脚本 embed.js 的远程文件地址:

1
http://static.duoshuo.com/embed.js

在浏览器中打开,右键另存为,放到 \theme\next\source\js\ 文件夹中。

再打开 \themes\next\layout\_scripts\comments\duoshuo.swig。搜索 //static.duoshuo.com/embed.js,把它改成 /js/embed.js

如法炮制,把加载慢的 .js 都本地化。目前GitHub的响应速度非常快。

其他处理的 js 有:

  • \themes\next\layout\_partials\searchswiftype.swig 中的

    1
    //s.swiftypecdn.com/install/v2/st.js

美化多说评论

添加浏览器、操作系统信息

  1. 博客中找一条自己的留言,获取多说id:
    多说userid.jpg

  2. 修改 embed.js,也可以直接下载原作者的 embed.js

打开上一步本地化的 embed.js,在最顶部添加如下代码:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//管理员判断开始
function sskadmin(e) {
var ssk = '';
if (e.user_id == 14198272) {
if (checkMobile()) {
ssk = '<span class="ua"><span class="sskadmin">博主</span></span><br><br>';
} else {
ssk = '<span class="ua"><span class="sskadmin">博主</span></span>';
}
} else {
if (checkMobile()) {
ssk = '<br><br>';
}
}
return ssk;
}
//管理员判断结束
//移动客户端判断开始
function checkMobile() {
var isiPad = navigator.userAgent.match(/iPad/i) != null;
if (isiPad) {
return false;
}
var isMobile = navigator.userAgent.match(/iphone|android|phone|mobile|wap|netfront|x11|java|opera mobi|opera mini|ucweb|windows ce|symbian|symbianos|series|webos|sony|blackberry|dopod|nokia|samsung|palmsource|xda|pieplus|meizu|midp|cldc|motorola|foma|docomo|up.browser|up.link|blazer|helio|hosin|huawei|novarra|coolpad|webos|techfaith|palmsource|alcatel|amoi|ktouch|nexian|ericsson|philips|sagem|wellcom|bunjalloo|maui|smartphone|iemobile|spice|bird|zte-|longcos|pantech|gionee|portalmmm|jig browser|hiptop|benq|haier|^lct|320x320|240x320|176x220/i) != null;
if (isMobile) {
return true;
}
return false;
}
//移动客户端判断结束
//显UA开始
function ua(e) {
var r = new Array;
var outputer = '';
if (r = e.match(/FireFox\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_firefox"><i class="fa fa-firefox"></i> FireFox'
} else if (r = e.match(/Maxthon([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_maxthon"><i class="fa fa-globe"></i> Maxthon'
} else if (r = e.match(/BIDUBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> 百度浏览器'
} else if (r = e.match(/UBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> UCBrowser'
} else if (r = e.match(/UCBrowser([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_ucweb"><i class="fa fa-globe"></i> UCBrowser'
} else if (r = e.match(/MetaSr/ig)) {
outputer = '<span class="ua_sogou"><i class="fa fa-globe"></i> 搜狗浏览器'
} else if (r = e.match(/2345Explorer/ig)) {
outputer = '<span class="ua_2345explorer"><i class="fa fa-globe"></i> 2345王牌浏览器'
} else if (r = e.match(/2345chrome/ig)) {
outputer = '<span class="ua_2345chrome"><i class="fa fa-globe"></i> 2345加速浏览器'
} else if (r = e.match(/LBBROWSER/ig)) {
outputer = '<span class="ua_lbbrowser"><i class="fa fa-globe"></i> 猎豹安全浏览器'
} else if (r = e.match(/MicroMessenger\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-weixin"></i> 微信'
/*.split('/')[0]*/
} else if (r = e.match(/QQBrowser\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-qq"></i> QQ浏览器'
/*.split('/')[0]*/
} else if (r = e.match(/QQ\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_qq"><i class="fa fa-qq"></i> QQ浏览器'
/*.split('/')[0]*/
} else if (r = e.match(/MiuiBrowser\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_mi"><i class="fa fa-globe"></i> Miui浏览器'
/*.split('/')[0]*/
} else if (r = e.match(/Chrome([\d]*)\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_chrome"><i class="fa fa-chrome"></i> Chrome'
/*.split('.')[0]*/
} else if (r = e.match(/safari\/([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_apple"><i class="fa fa-safari"></i> Safari'
} else if (r = e.match(/Opera[\s|\/]([^\s]+)/ig)) {
var r1 = r[0].split("/");
outputer = '<span class="ua_opera"><i class="fa fa-opera"></i> Opera'
} else if (r = e.match(/Trident\/7.0/gi)) {
outputer = '<span class="ua_ie"><i class="fa fa-internet-explorer"></i> IE 11'
} else if (r = e.match(/MSIE\s([^\s|;]+)/gi)) {
outputer = '<span class="ua_ie"><i class="fa fa-internet-explorer"></i> IE' + ' ' + r[0]
/*.replace('MSIE', '').split('.')[0]*/
} else {
outputer = '<span class="ua_other"><i class="fa fa-globe"></i> 其它浏览器'
}
if (checkMobile()) {
Mobile = '<br><br>';
} else {
Mobile = '';
}
return outputer + "</span>" + Mobile;
}
function os(e) {
var os = '';
if (e.match(/win/ig)) {
if (e.match(/nt 5.1/ig)) {
os = '<span class="os_xp"><i class="fa fa-windows"></i> Windows XP'
} else if (e.match(/nt 6.1/ig)) {
os = '<span class="os_7"><i class="fa fa-windows"></i> Windows 7'
} else if (e.match(/nt 6.2/ig)) {
os = '<span class="os_8"><i class="fa fa-windows"></i> Windows 8'
} else if (e.match(/nt 6.3/ig)) {
os = '<span class="os_8_1"><i class="fa fa-windows"></i> Windows 8.1'
} else if (e.match(/nt 10.0/ig)) {
os = '<span class="os_8_1"><i class="fa fa-windows"></i> Windows 10'
} else if (e.match(/nt 6.0/ig)) {
os = '<span class="os_vista"><i class="fa fa-windows"></i> Windows Vista'
} else if (e.match(/nt 5/ig)) {
os = '<span class="os_2000"><i class="fa fa-windows"></i> Windows 2000'
} else {
os = '<span class="os_windows"><i class="fa fa-windows"></i> Windows'
}
} else if (e.match(/android/ig)) {
os = '<span class="os_android"><i class="fa fa-android"></i> Android'
} else if (e.match(/ubuntu/ig)) {
os = '<span class="os_ubuntu"><i class="fa fa-desktop"></i> Ubuntu'
} else if (e.match(/linux/ig)) {
os = '<span class="os_linux"><i class="fa fa-linux"></i> Linux'
} else if (e.match(/mac/ig)) {
os = '<span class="os_mac"><i class="fa fa-apple"></i> Mac OS X'
} else if (e.match(/unix/ig)) {
os = '<span class="os_unix"><i class="fa fa-desktop"></i> Unix'
} else if (e.match(/symbian/ig)) {
os = '<span class="os_nokia"><i class="fa fa-mobile"></i> Nokia SymbianOS'
} else {
os = '<span class="os_other"><i class="fa fa-desktop"></i> 其它操作系统'
}
return os + "</span>";
}
//显UA结束

然后搜索:

1
data-qqt-account="' + (r.qqt_account || "") + '">' + u(r.name) + "</span>"),

在后面添加:

1
t += sskadmin(s.author) + "<span class=\"ua\">" + ua(s.agent) + "</span><span class=\"ua\">" + os(s.agent) + "</span>",

  1. 添加对应 CSS。打开 \themes\next\source\css\main.styl,在文件开头插入代码:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    /*博主标记 CSS开始*/
    .sskadmin {
    background-color: #00a67c!important;
    border-color: #01B171!important;
    border-radius: 4px;
    padding: 0 5px!important;
    opacity: 1;
    }
    /*博主标记 CSS结束*/
    /*多说UA开始*/
    span.ua{
    margin: 0 1px!important;
    color:#FFFFFF!important;
    /*text-transform: Capitalize!important;
    float: right!important;
    line-height: 18px!important;*/
    }
    .ua_other.os_other{
    background-color: #ccc!important;
    color: #fff;
    border: 1px solid #BBB!important;
    border-radius: 4px;
    }
    .ua_ie{
    background-color: #428bca!important;
    border-color: #357ebd!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_firefox{
    background-color: #f0ad4e!important;
    border-color: #eea236!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_maxthon{
    background-color: #7373B9!important;
    border-color: #7373B9!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_ucweb{
    background-color: #FF740F!important;
    border-color: #d43f3a!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_sogou{
    background-color: #78ACE9!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_2345explorer{
    background-color: #2478B8!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_2345chrome{
    background-color: #F9D024!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_mi{
    background-color: #FF4A00!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_lbbrowser{
    background-color: #FC9D2E!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_chrome{
    background-color: #EE6252!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_qq{
    background-color: #3D88A8!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_apple{
    background-color: #E95620!important;
    border-color: #4cae4c!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .ua_opera{
    background-color: #d9534f!important;
    border-color: #d43f3a!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }


    .os_vista,.os_2000,.os_windows,.os_xp,.os_7,.os_8,.os_8_1 {
    background-color: #39b3d7!important;
    border-color: #46b8da!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }

    .os_android {
    background-color: #98C13D!important;
    border-color: #01B171!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .os_ubuntu{
    background-color: #DD4814!important;
    border-color: #01B171!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .os_linux {
    background-color: #3A3A3A!important;
    border-color: #1F1F1F!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .os_mac{
    background-color: #666666!important;
    border-color: #1F1F1F!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .os_unix{
    background-color: #006600!important;
    border-color: #1F1F1F!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    .os_nokia{
    background-color: #014485!important;
    border-color: #1F1F1F!important;
    border-radius: 4px;
    padding: 0 5px!important;
    }
    /*多说UA结束*/

效果:
显UA、OS、Root信息.jpg

动感头像

效果和CSS代码见 多说自定义CSS 让你的多说评论动感起来

然后打开多说后台,按下图操作,把代码粘贴进去
自定义多说CSS.jpg

大功告成。

原作者还添加了网上搜集的其他代码,详见注释:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*头像样式 圆形,鼠标移上会旋转*/
#ds-reset .ds-avatar img{
width:54px;height:54px; /*设置图像的长和宽,这里要根据自己的评论框情况更改*/
border-radius: 27px;/*设置图像圆角效果,在这里原作者直接设置了超过width/2的像素,即为圆形了*/
-webkit-border-radius: 27px;/*圆角效果:兼容webkit浏览器*/
-moz-border-radius:27px;
box-shadow: inset 0 -1px 0 #3333sf;/*设置图像阴影效果*/
-webkit-box-shadow: inset 0 -1px 0 #3333sf;
-webkit-transition: 0.4s;
-webkit-transition: -webkit-transform 0.4s ease-out;
transition: transform 0.4s ease-out;/*变化时间设置为0.4秒(变化动作即为下面的图像旋转360读)*/
-moz-transition: -moz-transform 0.4s ease-out;
}
#ds-reset .ds-avatar img:hover{/*设置鼠标悬浮在头像时的CSS样式*/
box-shadow: 0 0 10px #fff; rgba(255,255,255,.6), inset 0 0 20px rgba(255,255,255,1);
-webkit-box-shadow: 0 0 10px #fff; rgba(255,255,255,.6), inset 0 0 20px rgba(255,255,255,1);
transform: rotateZ(360deg);/*图像旋转360度*/
-webkit-transform: rotateZ(360deg);
-moz-transform: rotateZ(360deg);
}

/*评论列表背景*/
#ds-thread #ds-reset li.ds-post {
background: rgba(255, 255, 255, .2);
}
#ds-thread #ds-reset li.ds-post:hover {
background-color: rgba(255, 255, 255, .6) !important;
}

/*发布按钮背景 去掉背景图,修改底色,去掉文字阴影。*/
#ds-thread #ds-reset .ds-post-button {
background-image: none;
background: rgba(136, 172, 219, .2);
text-shadow: none;
}

/*工具栏背景*/
#ds-reset .ds-gradient-bg {
background: rgba(255, 255, 255, .5);
}

/*评论框背景*/
#ds-thread #ds-reset .ds-textarea-wrapper {
background: rgba(255, 255, 255, .5);
}

/*未登录用户名字颜色,与登录用户一致*/
#ds-thread #ds-reset .ds-user-name {
color: #ef7c6c !important;
}

/*用户名等超链接颜色*/
#ds-thread #ds-reset .ds-highlight {
color: #ef7c6c !important;
}

/*评论、文本框字体, 默认字体偏小,稍作调整。*/
#ds-thread #ds-reset .ds-comment-body p, #ds-thread #ds-reset .ds-textarea-wrapper textarea {
font-size: 1.15em;
color: #717171;
font-family: inherit;
}

/*社交账号登陆透明度*/
#ds-thread #ds-reset .ds-login-buttons {
opacity: .5;
}
#ds-thread #ds-reset .ds-login-buttons:hover {
opacity: 1;
}

SEO 优化

更改首页标题格式为「关键词-网站名称 - 网站描述」。打开 \themes\next\layout\index.swig 文件,找到这行代码:

1
{% block title %} {{ config.title }} {% endblock %}

把它改成:

1
2
3
{% block title %}
{{ theme.keywords }} - {{ config.title }} - {{ theme.description }}
{% endblock %}

项目主页添加 README

GitHub 上博客的仓库主页空荡荡的,没有 README。如果把 README.md 放入 source 文件夹,hexo g 生成时会被解析成 html 文件,放到 public 文件夹,生成时又会自动删除。

解决方法很简单,在 source 目录下新建文件README.mdown,在里面写README即可。hexo g 会把它复制到 public 文件夹,且不会被解析成 html


Git 相关

自动备份博客源文件

参考:自动备份Hexo博客源文件

多 PC 同步

需要在公司和家里电脑上写博客,打包拷来拷去太麻烦。原作者使用 Coding.net 的免费私有仓库来同步 hexo 文件夹。

  1. 删除根目录和 \theme\next\ 下的 .git 文件夹。

  2. 修改根目录下的 .gitignore 文件为:

1
2
/.deploy_git
/public

其实第一行留不留都一样,它是 hexo 默认的 git 配置文件夹,里面也有一个 .git,使 /.deploy_git 里的文件无法被提交。public 是每次 hexo g 新生成的静态博客文件,不需要同步。

  1. push & pull

如果没接触过 Git,可以看这本书学习一个:《Pro Git》

Pull 失败:Filename too long

在 Terminal 里面,输入

1
git config --global core.longpaths true

关闭换行符警告

部署时会出现如下警告

1
warning: LF will be replaced by CRLF

LF 为换行符,CR 为回车符。Windows 结束一行用 CRLF,Mac 和 Linux 用 LF。Git 默认在你提交时自动地把行结束符 CRLF 转换成 LF,而在签出代码时把 LF 转换成 CRLF。

要关闭警告,执行如下命令:

1
git config --global core.autocrlf false

上述命令中:

false 表示取消自动转换功能。适合纯 Windows
true 表示提交代码时把 CRLF 转换成 LF,签出时 LF 转换成 CRLF。适合多平台协作
input 表示提交时把 CRLF 转换成 LF,签出时不转换。适合纯 Linux 或 Mac

补充
Git 还提供了一个换行符检查功能 core.safecrlf,可以在提交时检查文件是否混用了不同风格的换行符。可以用同样的命令更改设置。
选项如下:

false - 不做任何检查
warn - 在提交时检查并警告
true - 在提交时检查,如果发现混用则拒绝提交

建议使用最严格的 true 选项

博客部署的 Message

\node_modules\hexo-deployer-git\lib\deployer.js 文件末尾找到这一句:

1
Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}.

改得个性化一点:

1
这个勤奋的家伙又更新了: {{ now(\'YYYY-MM-DD HH:mm:ss\') }}.

在 GitHub 对应项目中可以看到效果:
又更新了.png


参考资料


本文转自 loveNight,略有删改。

联系

  • Mail: echo bGVvZGF4aWFAZ21haWwuY29tCg== | base64 -D
  • GitHub: iTofu