世纪伯乐是嵌友的老朋友了,年前他再一次收到了来自github的警告邮件,这到底是怎么回事呢?一起听他来说说。。。
有好多朋友很好奇,上次已经有一波被github警告的事儿了,我是怎么又被github封号了的。。。
正好外面下着鹅毛大雪,让我慢慢来谈谈这个小故事。代码和数据我都已经下架了,这里就算我故事的结尾,冒个泡装个逼,算是个技术分享吧。
事情要从当年美工怀孕生小孩去了说起,公司美工还是个能画图,能ps,能敲html、css、js,懂php,能上linux的大牛,这边公司项目催着赶工,没有美工的我只能硬着头皮用美工留下的素材,自学html、css、js,在3天内赶工上项目。
毕竟临时抱佛脚,画图和ps肯定是不行的,身为一个嵌入式程序猿,学习html,css,js还是很快的。接着很长一段时间,我就这么硬着头皮顶上了公司的前端美工,虽然css代码我肯定调不了,但是我可以去github上抄啊~
身为一个做底层的,记不住那么多html小细节的情况下,很快,研究前端代码的注意力就放在了js上,而做了很多之后也开始震惊,现在的前端代码一点都不简单,各种强大的前端框架,我就是来顶包几十天,那些框架我肯定是不会去看的。但抛开前端框架不谈,html5+css3+es6的原生前端代码,能实现的事情就已经快顶上整套站点了。支持元编程技术和eval的JavaScript,超高的灵活性和自定义语法的玩法,根本就是一个几乎媲美lisp复杂度的东西。尤其在了解了websocket和websql之后,如果再配合一个严格意义上不属于前端工作的chrome插件代码。我发现整套站点甚至可以在完全不使用后端代码的情况下实现出来。
因为很早期就学习过lisp语言,读过《SICP》,学过scheme和common lisp。而JavaScript语言,几乎是一个模仿C风格的lisp,玩lisp的时候,代码生成器、宏语言、多级宏代码早就玩得很顺了。在不使用任何后端语言辅助的情况下,用JavaScript语言编写整套站点,思维方式与lisp模型一样,我只是需要多几层预处理器。js作为一个C风格的lisp语言,相当多的地方都有着eval的影子,那这事儿就好办了。
然后后面就是我第一次被github发邮件警告的故事了。github pages功能可以支持github库里的数据http推送服务,而且使用官方提供的接口,可以转挂一个域名到github pages。我先使用github pages功能,纯静态的html5+css3+es6的写法,写了一个纯静态站点。因为需要让js拿到数据,当然就不能走常规的html标签请求数据。而因为我从最一开始就没准备接触任何前端框架,虽然我也知道ajax,但我选用的还是js原生代码,xmlhttprequest做js跟http协议数据通信的入口,github pages当然就是按部就班地把库里的数据按照文件系统的路由结构推送给我。我这里玩的一个小花样就是通过js编写一个类似eval模型的另外一套语言模型的小型解释器,解释器语法设定则是读取资源文件的路径,通过路径命名和文件命名、文件名的分隔符、分隔符位置的方式解析该文件资源的定位。这样只要文件系统的路径和文件名按照我设定的语法规则起名,一个简单的github pages静态数据库就实现出来了。
接下来就是站点该展示些什么呢?玩了一点小玩意儿,把腾讯漫画和网易漫画的库爬了下来。然后按照我设定的路径命名模型,通过一个脚本,将所有漫画图片资源按照该语法模型重组了一下。这其实就是一个简单的预处理工作,然后分到不同的项目,不同的库,上传到github上。毕竟拖了几百GB的数据,一个库还是承担不了的,哪怕一次git push都会不停地超时中断。熟悉我的会了解到,有一段时间我一直在发一个我自己写的漫画小站,我也没什么好推广的。毕竟基于github pages的http静态推送服务,整套站点后台没有服务器,没有数据库,仅靠前端代码就支撑了整个站点。我是没有维护成本,也不花一分钱的。
做过前面的工作后,很长时间里github都没有多说什么,我也没收到什么警告。而之后我得寸进尺的第二步操作,就是大家了解的我被github警告的第一个事儿了。
现在的视频网站大体上都使用两种视频加载方式,使用adobe flash player插件,或者使用html5原生的video标签。如果能将静态视频资源放到github pages的http推送上,其实这事儿并没有那么困难。但是github项目就不允许单个文件超过5MB,如果个别文件超过5MB会给警告,超过10MB直接无法上传。无法存放大文件,我怎么用静态代码写站点呢。经过很长时间的摸索,通过我自己编写预处理代码,将视频数据分片的方式,提前将单个视频文件分片数据,一个视频是一堆碎片保存到一个文件夹里的方式。再添加一套跟上面套路一样的针对视频文件处理的路径命名规则,添加js的处理代码。
这样我就能在没有后端代码的情况下,没有后台服务器,没有公网ip,没有本地存储,不需要维护流量带宽,仅支持http静态数据推送的环境,写出了一个按流播放的视频站点。
这个站点上就没有去爬谁的数据了,单纯是我收藏的电影、动漫、视频等,我拿他当随时随地播放的云盘来用了。速度还每秒5MB多起,简直爽翻了~
当然,后面的故事你们就清楚了,我被github发信警告删资源,当时我上传的视频资源已经达到470GB多了。迫于资本主义的淫威,我屈服了,然后就删库删代码了~
既然漫画这种大量的图片资源不让我放,视频这种很大的二进制资源不让我放,我用别人的资源总行了吧。就这样,我又写了一个漫画小站,这次我只有代码,没有图片,图片链接使用别的网站的图片链接。写完这样一个非常传统的山寨漫画网站之后,我感觉非常无趣,一点技术含量没有,链接经常失效,我又没兴趣维护,本来就是来玩的,也不准备挂广告卖钱。再说了,我这么一个没有后端的畸形站点,广告貌似都挂不上吧???
停滞了一段时间之后,我想到了一个新玩法,首先是盯上了我经常上的黑白漫画等几个质量不错,没什么太多垃圾,而且后台没有使用cookie,没有使用签名时效等的小山寨漫画网站。简单分析了一下他们的前端代码。写了一个简单的爬虫,不爬资源,只爬数据列表和资源结构。再稍微多上一步,在我自己家里的服务器上写了一个对所有漫画列表的重新爬取和图片资源验证是否404等简单的,类似登录验证的工作。最后再通过间隔时间验证,验证后通过配置好证书的'git add-A; git commit -m "自动生成备注"; git push'自动提交站点更新。通过这样,成功实现了一个没有服务器,没有后台,没有后端代码,甚至没有任何图片资源的漫画站点。因为验证代码的存在,我的漫画站点是没有打不开的那种垃圾链接的,而且站点也会自动更新,盯着的几个站点自动更新,我甚至后来自己都忘了这事儿了,程序默默地在我家里的服务器上跑着,我自己都很久没进过自己做的那个站点了。
本以为又没有大资源,而且还都是写辅助的数据列表,都是github那边能看到的文本数据,不至于找我麻烦了吧。
结果还是来找我麻烦了,这好几个小站的数据列表更新,再加上我后台程序的定期git push,好几千次,近万次的git push还是引起了github官方的注意。让我删项目来了。。。
项目已删,本来后来那个站点我自己都没怎么进过了,这里面除了折腾和技术研究,只有收获,也没什么损失。基本都是算法在处理,我也没在数据处理和维护上花过太多的精力,只能说,很多事儿哪怕技术上能完成,“人”的问题才是真正的瓶颈。
我还会继续折腾出一些更好玩的玩法的,虽然免费的不让玩了,正经做收费项目的时候,这些积累早晚还都是用得上的嘛~
If it's not fun? why do it?
1.2019年第1期《单片机与嵌入式系统应用》电子刊新鲜出炉!