用Python给Github的README.md做一个访客统计功能

摘要:
README.md是每个Github项目的必备文件。用户打开项目链接时,可以第一眼看到它。接下来,输入文本并介绍我的一个Python项目:访客计数徽章。这是一个徽章生成服务,用于统计README页面打开的次数。原则在README.md中插入一个markdown图像,图像的src指向服务器地址。repo_Id=${将与您的repo对应的唯一字符串放在这里。例如,使用您的github用户名+仓库名称,并保持其简短的唯一性。})复制代码将计算当前README.md的访问者总数,如下图所示。请尝试刷新此页面?

README.md 是每一个 Github 项目必不可少的文件,用户打开你的项目链接第一眼看到的就是它。如果可以给这个文件添加一个访客统计功能,那么不就知道每天有多少个用户或者一共有多少个用户打开过你的项目了吗?

答案是肯定的,但是因为普通的访客统计系统都需要在 HTML 页面中用 <script> 标签引入一个 js 文件, 而 Github 的 markdown 是不会解析 <script> 的标签的,那么该怎么办呢?看到这里先别急着往下看,开动下脑筋想一想,看看和我实现的方式是不是一样的呢?


下面进入正文,介绍一下我的一个 Python 项目: visitor-count-badge

这是什么

这是一个统计README页面被打开多少次的 badge 生成服务。

原理
  1. 在 README.md 中插入一个 markdown 格式的图片,图片的 src 指向某个服务器地址。
  2. 当你每次打开这个页面, 浏览器加载图片时就会向指定的服务器地址发送一个请求。
  3. 部署在服务器上的 visitor-count-badge 项目会处理这个请求,将该页面对应的访问数量加1
  4. 之后 visitor-count-badge 会将最新的访客数量生成出一张 svg 图片返回给浏览器即可。
技术点
  1. badge的生成, 直接使用了google的开源项目pybadges, 非常简单
  2. 利用Flask写了非常简单的web服务, 接受请求, 缓存访问量, 生成svg并返回
遇到的问题
  1. 缓存

Github使用了camo作为图片的代理服务器, 当你审查README上的图片元素时, 你会发现所有的图片都不是指向真实的服务器地址, 而是一串https://camo.githubusercontent.com/xxxxxxxxxxxxxxxxxxxxxxxxx/yyyyyyyyyyyyyyy/zzzzzzzzzzzzzzzz.jpg的网址, 如下:

image

而camo的服务器会对被代理的图片进行缓存, 使得当第一次刷新页面时, camo会像badge生成服务发起请求, camo记录访问次数为1, 之后再次刷新页面, camo会缓存这个badge图片, 从而无法达到我们想要的效果.

经过一番搜索和研究发现, 在badge生成服务返回的http响应的header中, 需要动一些小手脚:

  1. Cache-Control

设置Cache-Control的内容为no-cache,max-age=0, 告诉camo服务器在使用缓存之前进行验证

  1. Expires

这里我手动将资源的过期时间设置成了当前时间减去10分钟

这样的话, 当用户打开README页面之后, camo服务器在返回缓存内容之前, 会像源服务器发起请求, badge生成服务收到请求之后会将访问量加1并生成相应的svg内容同时携带以上2个header信息返回.

而正是由于这两个header的设置, 每次打开页面加载图片时,camo服务器发现缓存的资源在10分钟之前已经过期, 于是就将最新的svg返回给了浏览器.

使用方法

在你的README里面, 添加一个图片:

![Total visitor](https://visitor-count-badge.herokuapp.com/total.svg?repo_id=${这里放你的repo对应的唯一的字符串, 如用你的github用户名+仓库名, 总之保持唯一就好了})
复制代码

就会统计当前 README.md 的总访客数量, 如下图, 刷新下这个页面试试?

Total visitor

由于掘金会转存文章中的图片,所以上面的数字可能不会变化,你可以点击 这里 查看。

最后留一个思考题,你知道为什么很多邮件客户端都会建议你或者默认地不去加载邮件正文里的图片吗?

免责声明:文章转载自《用Python给Github的README.md做一个访客统计功能》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇逆向实验小结tcp keepalive下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)

前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶。老师讲得太好了。 Java内存模型,感觉以前学得比较抽象。很繁杂,抽象。 这次试着系统一点跟着2个老师学习一下。 学习Java内存模型目的: 1.高并发情况下,java内存模型是怎么提供支持的? 2.一个对象创建后,在内存中的布局? 为什么在聊JVM内存模型、ha...

我们为什么需要 lock 文件

前言 从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的。 为什么需要 lock 文件 之所以需要 lock 文件,我觉得主要有 4 个...

重新导入依赖的常见方式

  下面图中的刷新按钮,在我的机器上,并不能每次都正确导入pom.xml中写的依赖项,而是导入之前pom.xml的依赖(读了缓存中的pom.xml)。      当然除了这些,还可以下面这样:     存在的问题   上面虽然是重新导入Maven依赖,按理说,IDEA应该根据当前最新的pom.xml来导入依赖;   reimport操作常常不能导入...

SQL Server里的闩锁介绍

在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch)。闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构。文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有你如何能对它们进行故障排除。 为什么我们需要闩锁?闩锁首次在SQL Serve...

大型网站技术架构

一、使用缓存减轻数据库的压力,提升网站性能。二八定律,80%的业务访问集中在20%的数据上。 1.缓存在应用服务器上的本地缓存。(Session) 2.缓存在专门的分布式缓存服务器上的远程缓存。可以采用集群的方式,理论上可以做到无限扩充。(Redis、memcached等) 二、使用服务器集群改善网站的并发处理能力。 1.单一服务器无法满足需求时,不要企...

闲话缓存:ZFS 读缓存深入研究-ARC(二)

Solaris ZFS ARC的改动(相对于IBM ARC) 如我前面所说,ZFS实现的ARC和IBM提出的ARC淘汰算法并不是完全一致的。在某些方面,它做了一些扩展: ·         ZFS ARC是一个缓存容量可变的缓存算法,它的容量可以根据系统可用内存的状态进行调整。当系统内存比较充裕的时候,它的容量可以自动增加。当系统内存比较紧张(其它事情需要...