
Hexo 博客实时访问统计图
前言
本文教程主要针对 Hexo 博客,对博客站点的的访问地图、每月访问量、访问来源的维度绘制统计图,使用的是 ECharts 开源可视化库。具体效果可以点击本站的 统计--博客统计 页面查看。
- 本文数据来源均为百度统计,请确保博客站点已加入百度统计,以 butterfly 主题为例,可参照 Butterfly 安装文档(四) 主题配置-2 的分析统计段落实现。
- 本地主机访问(localhost)也会记录到百度统计,推荐在 【百度统计】--【管理】--【统计规则设置】--【过滤规则设置】--【受访域名统计规则】--【勾选排除 localhost(本地主机)】 排除本地主机访问(貌似在勾选后生效,但是以前的访问记录仍会统计)。
- 此文是针对于文章 Hexo 博客访问统计图 改良版,实时调用百度统计 API 获取访问数据。
本教程将会泄漏属于百度统计的站点 ID 和百度统计 AccessToken,请先前往 百度统计用户手册 了解,介意者请谨慎部署。2021-05-14
新增访客数的统计,统计指标metrics
可以选择统计访问次数(PV)还是访客数(UV)。2021-05-17
新增主题“明暗模式”下统计图的颜色切换。2022-03-29
使用 LeanCloud 存储百度统计的AccessToken
和RefreshToken
,并使用 Github Action 实现每周更新。2022-05-31
更换mapChart
省份地域访问次数的请求地址,visit/district/a => overview/getDistrictRpt
(原地址获取省份不全),修改处理逻辑mapArr.push({ name: mapName[i][0].name, value: mapValue[i][0] }) => mapArr.push({ name: mapName[i][0], value: mapValue[i][0] })
。
如果想绘制博客文章发布统计图的可以参考文章 Hexo 博客文章统计图
新建 census 页面
1 | hexo new page census |
在 [Blogroot]\source\
目录下新建 census
文件夹,并在新建的 census
文件夹下新建 index.md
文件,添加以下内容:
1 | --- |
引入 ECharts.js
echarts.js 必须在渲染 echarts 实例的 JavaScript 前引入。
以 butterfly 主题为例,可以在 [Blogroot]\_config.butterfly.yml
的 inject
配置项中引入 echart.js
文件。
1 | inject: |
可以在 index.md
添加以下内容:
1 | <script src="https://npm.elemecdn.com/echarts@4.9.0/dist/echarts.min.js"></script> |
博客访问统计
获取网站统计数据
已经添加百度统计分析的小伙伴可以登录百度统计的官网网站,此处博主使用的是百度账号登录。
登录进入首页后可以点击基础报告查看网站访问统计数据(若无绑定网站,需要先在 管理页面--账户管理--网站列表 添加博客网址)。
此时我们想要获取这些数据可以调用百度统计 API,点击管理,进入管理页面后在左边侧边栏找到数据导出服务。
登录百度开发者中心控制台,创建工程,应用名称任意。
点击刚刚创建的工程,记录下 API Key,Secret Key。
填写下面链接参数后打开链接获取授权码,具体步骤可以参考 Tongji API 用户手册。
http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope=basic&display=popup
- API Key:{CLIENT_ID}
回调 URI:{REDIRECT_URI},可以填写
oob
。
复制第 6 步获取的授权码,填写下面链接参数后打开链接获取
ACCESS_TOKEN
:。http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}
- Auth Code:{CODE},第 6 步获取的授权码。
- API Key:{CLIENT_ID}
- Secret Key:{CLIENT_SECRET}
回调 URI:{REDIRECT_URI},可以填写
oob
。
注意:从上述步骤得到的数据中包含
ACCESS_TOKEN
和REFRESH_TOKEN
两个值,其中ACCESS_TOKEN
的有效期为一个月,REFRESH_TOKEN
的有效期为十年。REFRESH_TOKEN
的作用就是刷新获取新的ACCESS_TOKEN
和REFRESH_TOKEN
, 如此反复操作来实现ACCESS_TOKEN
有效期永久的机制。一旦
ACCESS_TOKEN
过期,可根据以下请求更换新的ACCESS_TOKEN
和REFRESH_TOKEN
:http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}
- API Key:{CLIENT_ID}
- Secret Key:{CLIENT_SECRET}
- Refresh Token:{REFRESH_TOKEN}
调用百度统计 API
第 7 步获取的
ACCESS_TOKEN
是所调用 API 的用户级参数,结合各 API 的应用级参数即可正常调用 API 获取数据,填写下面链接参数后打开链接获取网站 ID:https://openapi.baidu.com/rest/2.0/tongji/config/getSiteList?access_token={ACCESS_TOKEN}
Access Token:{ACCESS_TOKEN}
也可以在 Tongji API 调试工具 输入
ACCESS_TOKEN
获取网址 ID:在 Tongji API 调试工具 选择需要获取的报告数据,填写
ACCESS_TOKEN
、必填参数、选填参数获取百度统计数据。
网站统计代码
以 butterfly 主题为例,可以在 [Blogroot]\js\
目录下新建 census.js
文件,然后添加以下内容:
1 | var start_date = '20210101' // 开始日期 |
上面是博主自己三个统计图的代码,小伙伴们可以用以参考,根据自己的需求绘制百度分析统计图。
更多统计图的自定义属性可以查看 ECharts 配置项文档,根据自行喜好对 ECharts 统计图进行修改。
项目部署(可选)
使用 Github + LeanCloud + Vercel
整个部署均在云端完成。运行原理:
- 数据存储在 LeanCloud 数据库,也可以自行修改源码存储在其他数据库;
- 通过 Github Action 更新百度统计的
AccessToken
和RefreshToken
; - Vercel 部署的 API 从 LeanCloud 获取
AccessToken
,再执行请求,获取百度统计数据,返回给前端。
LeanCloud 部署
新建结构化数据,创建 Class,填写名称为
BaiduToken
,设置默认 ACL read 和 write 权限都为所有用户;点击添加列,分别新增
accessToken
和refreshToken
;点击新增行,填写前面获取到的
access_token
和refresh_token
;
GitHub 部署
由于在 js 文件中请求百度统计 API 获取数据会出现跨域请求的错误。
博主参考 Akilar 的 基于 Butterfly 主题的首页置顶 gitcalendar 自建 Vercel API 部署教程,以及冰老师的 python_github_calendar_api 搭建了获取百度统计数据的 Vercel API,力求解决百度统计 API 的跨域请求问题。
虽然 Vercel 的访问应当没有次数限制,但是不排除存在因访问次数过多而限流等限制。所以还是建议各位自建 API。使用 Vercel 部署,完全免费。且无需服务器。
在 baidu-tongji-api 项目 【Settings】--【Security】--【Secrets】--【Actions】 中添加以下秘钥:
APIKEY
: 百度统计 API KeySECRETKEY
:百度统计 Secret KeyAPPID
:LeanCloud AppIDAPPKEY
:LeanCloud AppKey
Vercel 部署
部署 Vercel 项目后添加 LeanCloud 的环境变量。
添加环境变量完成后,将获取到的默认域名替换 census.js
文件中的 dataUrl
,如:
1 | - var dataUrl = 'https://baidu-tongji-api.vercel.app/api?access_token=' + access_token + '&site_id=' + site_id |
如果使用了数据库存储 AccessToken
,则可以省略 access_token
参数。
1 | - var dataUrl = 'https://baidu-tongji-api.vercel.app/api?access_token=' + access_token + '&site_id=' + site_id |
使用统计图
在上文新建的 [Blogroot]\source\census\index.md
文件中添加以下内容:
1 | <!-- 访问地图 --> |
当然也可以在其他页面引入博客访问统计图。
可能遇到的问题
控制台报错
Uncaught ReferenceError: echarts is not defined
。解决方案:
需要在统计图的前引入
echarts.js
文件,最好是在页面的头部引入。控制台报错
Access to fetch at 'https://baidu-tongji-api.vercel.app/api?...' from origin 'http://...' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
解决方案:
仍在努力解决跨域问题。