手把手教你写一个博客园访问统计

介绍

使用博客园的朋友都知道,博客园提供了强大的定制功能,供用户定制自己的博客。其中很多人在侧边栏添加了”访问统计“组件,用于展示博客的统计数据,主要是按国家划分的访问量,如下图:

image

而这个”访问统计“组件的提供方大部分来自国外,如flagcounter,amazingcounters等,因此服务在稳定性和传输速度上相对来说不够好,那如何解决国外服务提供商提供的服务体验不够好而国内的又没有类似的可直接使用的服务呢?答案是自己造一个。

原理分析

首先我们先分析一下访问统计功能的核心功能,共有三个:数据收集,IP地址转物理地址和数据获取。以flagcounter为例,它提供的是一个HTML代码块,如下:

image

详细代码如下:

<a href="https://info.flagcounter.com/LGdk"
  ><img
    src="https://s11.flagcounter.com/count2/LGdk/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_10/viewers_0/labels_0/pageviews_0/flags_0/percent_0/"
    alt="Flag Counter"
    border="0"
  />
</a>

其中核心的部分为<img>标签,src属性中的链接便是用于收集数据和获取数据,至于IP地址转物理地址的功能则是在服务器端实现。

方案设计

通过上述的原理分析,我们要做的主要也是数据收集,IP地址转物理地址和数据获取这三个功能。有两种方案可以实现:

  1. 自己实现:功能完全可定制,但是要花较多时间
  2. 部分功能使用现有服务,自己实现剩余功能:功能受限于服务提供商,但功能稳定,也省时间

关于方案2,国内有很多可以给个人免费使用的网站统计服务,如百度统计,友盟等,360分析等,提供了数据收集和IP地址转物理地址的功能,稳定性好且传输速度快。关于数据获取,这个是要我们自己开发的,统计服务一般会提供API,我们可以将数据包装成html代码,动态加载到博客中。

这里为了节省时间,我们以选择方案2,统计服务选择百度统计,来进行系统搭建。

关于百度统计在博客园的集成,可以参考:在博客园里使用百度统计

具体实现

在百度开发者平台创建一个工程

百度统计API的使用涉及到百度开发者,需要先注册开发者然后创建一个工程:

image

百度开发者

需要设置"授权回调页":

image

集成百度统计API

具体包括两个步骤:

  • 将百度统计服务授权给上一步创建的工程:这里需要用到上一个创建的工程的CLIENT_ID,CLIENT_SECRET和REDIRECT_URI
  • 调用统计API:个人用于用的是百度账号,百度商业账号

百度统计Tongji API

百度统计提供了"按国家"和"按省"两个指标来获取访问量的地域分布,这个可以按喜好选择。

数据返回

首先将如下代码块添加到博客园的html代码框中,获取到数据之后,我们将数据格式化成html代码块,返回给前端,然后动态插入到侧边栏。

<script>
  let url =
    'https://counter.toyfun.cn/api/counters/b035d53423sds317248696c2c0b/analytics';
  fetch(url).then(res => {
    if (res.ok) {
      res.text().then(txt => {
        let element = document.getElementById('sideBarMain');
        var div = document.createElement('div');
        div.className = 'newsItem';
        div.innerHTML = txt;
        element.insertBefore(div, element.childNodes[0]);
      });
    }
  });
</script>

项目实例

技术栈

  • 前端页面:HTML+CSS+JavaScript+Pug模板引擎
  • 后端:Express框架
  • 存储:SQLite

关键代码

  1. 百度统计API的集成:
async function getTokenByCode(code, clientId, clientSecret, redirectUri) {}
async function refreshToken(refreshToken, clientId, clientSecret) {}
async function getSites(accessToken) {}
async function getAnalytics(accessToken, params = {}) {}
  1. 数据库的连接和操作
async function getDB() {
  if (!db) {
    await new Promise((res, rej) => {
      db = new sqlite3.Database(filename, error => {
         ...
      });
    });
  }
  return db;
}
async function run(sql, params) {
  let db = await getDB();
  return new Promise((res, rej) => {
    db.run(sql, params, (error, result) => {
      ...
    });
  });
}
  1. 接口路由
router.get('/counters/:id/analytics', async (req, res) => {
  // ...
  // get analytics
  let paramsForAnalytics = {
    site_id,
    ...
  };
  let result = await baiduAnalyticsService.getAnalytics(
    accessToken,
    paramsForAnalytics
  );
  let data=parseResult(result);
  // render html template
  let locals = { total, data };;
  let html = await htmlTemplateService.render('analytics', locals);
  res.send(html);
});

项目成果

项目网站:https://counter.toyfun.cn/

最终的效果图如下:

image

当然目前的效果比较简单,只是一个简单的表格,后续也可以将其美化,比如:添加国家地图(参考flagcounter),提供多种显示样式(如访问趋势,停留时间,设备类型等等),这些大家可以自由发挥。

总结

本文介绍了博客园访问统计的原理,并提供了具体的方案设计和实现,核心功能有三个:数据收集,IP地址转物理地址和数据获取。有兴趣的朋友可以自己动手来写一个,也可以直接使用本文提供的现成产品。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342