分享一个我给 Github README.md 做的访客统计功能

2020-06-16 07:58:12 +08:00
 jwenjian

这个是我很久之前准备开始用 Github issue 做博客时做的,从 hexo 迁移过去之后 发现用 github issue 写博客没有访客统计功能(虽然本来也没人看)。

但是由于不管是 github issues,还是 github 的 README,都只支持 markdown 语法,不能使用各种第三方统计了。

就自己做了一个访客统计的徽章( badge )服务。

原理很简单,徽章是一个 svg,你只需要在你的 issues 或者 readme 中添加一个 markdown 的图片:

![]( https://visitor-badge.glitch.me/badge?page_id=<your_page_id>)

当有人打开你的 issue 或者 github 仓库时,浏览器会加载这个图片,服务器就会发出一个请求。

之后根据请求里的 page_id 来计数,并将最新的数量生成到一个 svg 图片中,将这个 svg 返回,浏览器就可以显示出来了。

注意这里的参数:page_id, 需要自己手动给一个唯一的字符串,没有特定规则,只要能唯一标识当前页面即可。

最开始想用 http request header 里面的 referrer 字段,但是后来发现 github 对图片进行了代理,服务器收到的图片请求中没有了原先的 referrer 字段。

另外实现过程中还有一点,就是缓存,github 的图片代理服务器会对你的图片进行缓存,所以我在做第一版的时候发现这个 svg 图片更新有问题,就开始研究 github 用的这个 camo 服务器,后来在返回 svg 的时候在 response 的 header 中做了点手脚:

  1. 添加一个 no-cache 的 header: 'Cache-Control': 'no-cache,max-age=0'
  2. 将 Expires header 的值设置为了当前时间减去 10 分钟

这样设置了之后,就可以绕过 camo 的缓存策略,每次都可以顺利的 +1, 实际效果:

刷新一下这个页面试试?


Github:visitor-badge

12033 次点击
所在节点    分享创造
89 条回复
raaaaaar
2020-06-16 10:00:10 +08:00
挺不错,能看见自己打开了多少次 T_T
jwenjian
2020-06-16 10:01:47 +08:00
感谢哪位大哥给的置顶…… 我都没注意
jwenjian
2020-06-16 10:08:58 +08:00
@raaaaaar 同惨……
Pyrex23
2020-06-16 10:23:16 +08:00
呃呃 是不是不行了?
This project has received too many request, please try again later
metrue
2020-06-16 10:25:57 +08:00
已经挂了?....
WittBulter
2020-06-16 10:29:37 +08:00
和我的 `views.show` 有点像: https://docs.views.show/
我一开始也支持 GitHub,后来我发现如果不对 Referrer 做识别,就无法避免暴力刷 views 的问题,虽然服务是在 Serverless 上无所谓压力,但是数据会很不准确。后面当我想实现只读、访客识别等功能的时候,就只好抛弃了 GitHub ...
没有找到特别好绕过 camo 的办法,所以我就转型只做个人博客或者网站的 views 统计了...
jwenjian
2020-06-16 10:33:54 +08:00
@metrue glitch 免费版 每分钟有最大次数限制好像... 你可以部署在 giki 的服务器上一份, :)
jwenjian
2020-06-16 10:35:56 +08:00
@WittBulter camo 绕不过去,本来用 referrer 是最合适的,不过因为有 camo 就只能这样了,不能说完美,只能说能用吧。
wysnylc
2020-06-16 10:42:43 +08:00
这就是 N 年前论坛里签名图片显示 IP 位置 系统信息的东西,上面大吃一惊的是装的吗
slmaaw
2020-06-16 10:51:25 +08:00
这应该也是 Google 的埋点原理吧 请求一个 1 像素的图片
jwenjian
2020-06-16 11:06:10 +08:00
iamkun
2020-06-16 11:10:28 +08:00
leetao94
2020-06-16 11:12:11 +08:00
有没有统计下载次数的功能呢?
xcodebuild
2020-06-16 11:12:28 +08:00
有个类似的服务 https://hits.dwyl.com/
jwenjian
2020-06-16 11:13:29 +08:00
@iamkun 嗯 你可以重点看下我提到的绕过 缓存服务器 camo 的部分,应该是没问题的。每一次生成的图片 github 都会缓存的,你再刷新一下,看看这两个 github 缓存的图片地址,应该是不一样的。
jwenjian
2020-06-16 11:14:47 +08:00
@xcodebuild 看起来比我薅 glitch 的羊毛靠谱 :)
iamkun
2020-06-16 11:15:29 +08:00
@jwenjian 哦刚才没看太仔细 这思路不错
jwenjian
2020-06-16 11:15:45 +08:00
@leetao94 这个就用各种统计平台的埋点功能就可以了
jwenjian
2020-06-16 11:19:45 +08:00
@xcodebuild 刚看了一下 hits 应该是用的同一种策略绕过 camo 的:

cache-control: no-cache, no-store, must-revalidate
cf-cache-status: BYPASS
cf-ray: 5a4161bc6ebbe80d-LAX
cf-request-id: 035cbb69be0000e80dc7069200000001
content-encoding: br
content-type: image/svg+xml
date: Tue, 16 Jun 2020 03:18:08 GMT
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
expires: 0
pragma: no-cache
server: cloudflare
status: 200
vary: Ac

或者说这应该是一个标准的 http 缓存策略的设置。
wuhaoworld
2020-06-16 11:28:02 +08:00
这个方式已经不行了吧? 我看 Github 会把外链的图片抓取并保存到 githubusercontent.com 的域名下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX