你好呀,我是歪歪。
今天又带大家用新姿势来带吃个的瓜,这瓜老好吃了。
老规矩,先把瓜吃干净,再解锁新的技术姿势。
事情是这样的,上周五的时候不是中国第三艘航空母舰福建舰下水了嘛。
然后知乎上一个 7 年前,也就是 2015 年的赌约被翻了出来。
也就是这个链接:
https://www.zhihu.com/question/28103817/answer/39400041
从这个问题的编辑记录可以看出,最早是一个叫做王怜花的同学在 2015 年 2 月 10 日提出了这个问题:
然后在这个问题下面当时有这样的一个回答,我先给大家搬运一下:
大概意思就是题主是一个嘴硬王者,之后会被现实打脸,啪啪的,打的老疼的那种。
结果题主还来劲儿了,当即在评论区留下了“叫爷爷”的赌注。
于是一个 2015 年的,时间跨度长达 15 年的赌局就这样立下来了:
着重看一下我框起来的赌约的部分,为了让你看的更清楚,我单独拿出来,强调一下:
现在是 2015 年,15 年内,也就是 2030 年我国会拥有装有能够弹射作战状态战斗机的航空母舰。
你输了:如果是蒸汽弹射,你给我当儿子;如果是电磁弹射,你给我当孙子。
我输了:我也不会一毛不拔,虽然我没有乱认爸爸爷爷的习惯,不过我可以在你在知乎的所有答案下面叫你大哥。
结果大家也都知道了。2022 年 6 月 17 日,福建舰下水了,配置的电磁弹射:
如果你不知道什么是蒸汽弹射,什么是电磁弹射的话,没关系,不影响你吃瓜,你只要知道电磁弹射更牛一点、逼格更高一点就行。
2015 年到 2022 年,只有 7 年,中国只花了 7 年时间就让这个原本 15 年的赌局有了结果。
那么这个赌约最后履约了吗?
还是得去评论区找答案。
所以,当你一打开评论区,这个题主就排在第一个:
好,我敬你是个汉子,是个守诺之人。
但是要完整的掌握这个瓜的来龙去脉,按照我的经验是一定要把 722 条评论都看完的。
所以...
传统手艺,再来一次。
传统手艺
这个手艺我之前已经在《我宣布,这是我2022年吃的最有意思的瓜!》这篇文章中展示过了。
幸好当时的代码还在,所以我只要替换一个链接,就可以一键拉去评论,然后吃瓜了。
对了,之前还有人问我代码能不能开源,我觉得很刑啊,你们迟早是要让我把小日子过的越来越有判头嘛。
我只能给你说思路,明白吧。而且我已经在那篇文章里面把思路给你说的很清楚了,写代码加起来也就不超过 100 行。
好了,我们先把着这个瓜吃了,一会在给你补充几个技术细节,绝对够本的。
评论拉下来之后,可以看到这个回答下面的第一个评论来自 2015 年 2 月 10 日 15 点 01 分,内容就是题主主动立下的赌注:
然后就一直 battle 到了第二天凌晨 2 点过:
慢慢这个回答也就沉寂下去了,整个 2018 年到 2021 年,跟贴的数量一共也才 9 条:
直到 2022 年 6 月 17 日,这个帖子突然爆了,突然好多好多人来认孙子的:
我想看一下这个时间之后,题主王怜花的一个回复是什么,所以我直接只过滤了他的回复。
但是过滤出来之后,我看到了他这样的一条评论,又不由得燃起一些敬意:
知道我为什么说叫你爷爷值得吗?因为只要我的国家强大了,我叫你爷爷算什么,叫祖宗都乐意,我也不想自己的国家老是被他国欺负啊!一片赤诚之心在此!
其实他也不是一个彻底的喷子,甚至我觉得他根本都不是喷子。
然后在 2016 年 8 月 18 日的时候,他就已经意识到这场赌约,他要输了:
但是在 2022 年 6 月 17 日现实已经啪啪打脸,众多网友召唤他出来叫履行赌约的时候,他是这样的:
看起来还是有点嘴硬啊,似乎是要赖账的意思。
但是在进行了不到 30 分钟的心理建设之后,他还是愿赌服输:
确实比网上的很多说话不算数的人有魄力的多。
你注意他回复问题的这个时间点:
好家伙,这基本上是一夜没睡啊,看来还是遭受到了一定的心理创伤。
在题主的“爷爷,是我错了。”这句评论下面的回复中,大家都对题主的愿赌服输表示了自己的尊敬:
在这个评论中,我去截取两个我比较认同的放在这里:
同时,我还看到了这个评论:
我立马敏锐的感觉到:这肯定是另外一个瓜啊。
于是简单的看了一眼,果然:
你说你赌啥不好,你赌这玩意...
现在赌局结束了,你又拒不承认。这行为,属于骗吃骗喝啊。
接着,还按照追评最多这个维度排了个序:
时隔 7 年,content_id 的长度变化了这么多,也算是侧面见证了知乎这几年突飞猛进的发展吧。
最后,在吃瓜的过程中,还出现了一个乌龙。
真正的王怜花的名片是这样的:
有个点赞量很高的评论里面艾特了王怜花:
但是这个王怜花不是正确的王怜花:
导致这个王怜花感受到了一丝丝无助,并吐槽了一波:
我看了一下他过往回答中的评论,也是莫名躺枪:
随便我也去看了真的王怜花的过往回答的评论区。
果然:
最后,这瓜总体来说是真不错。
时间跨度这么长,赌约背景如此宏大,当事人也愿赌服输,比较爽快的履行了承诺。
是我在网上冲浪这么多年,难得一见的奇观。互喷的、嘴硬的、抵赖的看的太多太多了,冷不丁的看到一个信守承诺的,还感觉挺新奇的呢。
技术吃瓜
这次吃瓜,我在之前的技术上小小的迭代了一把。
另外先说一句,知乎是有防爬机制的,我这次就遇到了。
评论拉着拉着就突然要你去做个验证:
但是只要你请求的不是那么的频繁就好,像我这种抱着学习、吃瓜的态度去的,一般没问题。
而且,退一万步说,真写爬虫,谁用 Java 啊,这不扯淡呢么?
好了,不说远了,说一下我这次的小迭代是什么。
之前的方式是一次性拉取所有评论,针对后续新增的评价其实我是没有搜集到的。
按理来说,所有的评论都应应该收集到才对。
那么应该怎么处理呢?
你看这里,有一个按照评论时间排序的功能:
那么我是不是找到这个功能背后的链接,就可以拿到按照时间顺序倒叙返回的数据。
巧了,我数据库里面不是也存了时间吗?
那么我是不是可以搞个定时任务,比如每 10 分钟轮询一次这个接口。
每次从数据库里面按照时间倒序排序,拿出第一条数据上的时间。这个时间是不是代表我当前数据库里面存储的最近一次评论的时间?
那么我拿着这个时间,和前面说的接口返回的数据集合中取第一条进行对比,如果时间变化了,说明有新的评论了,那我就保存下来。
然后再取下一条,直到时间相等或者时间小于数据库里面的时间时,就停止循环。
这样,是不是就能解决新增评论的问题。
效果嘛,大概是这样的:
当我能实现新增评论也落库的这个需求之后,我发现还是差点意思。
数据倒是有了,但是我总不可能实时盯着数据库里面有没有新数据过来吧?
我希望新数据来了之后,能主动通知我一下。
所以,我也随手试了一下微信的模板消息通知功能。
我想要的功能大概是这样的:
首先我们已经可以通过定时任务感知到有新的评论过来了,然后怎么把评论推送到我的微信,让我火速赶往吃瓜现场呢?
这个功能怎么实现呢?
其实我做这个 Demo 非常的简单,你按照我的流程来,超过 10 分钟算我输。
首先如果你有一个公众号的话,登录之后,你可以看到一个叫做“开发者工具”的菜单栏,点进去之后长这样:
然后选“公众平台测试账号”,官方就会给你一个可以调用所有高级接口的测试账号。
自己玩一玩,熟悉一下微信的接口是绰绰有余了。
当然了,大多数人没有微信公众号,那么可以直接通过下面这个链接搞到一个公众平台测试账号:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
进来之后,你可以看到这个测试账号的 appID 和 appsecret, 这两个参数非常的重要,后面的接口中会用到:
然后下面可以看到下面有一个“体验接口权限表”,接口非常的多,但是我的需求用“模板消息”就能满足了:
点开模板消息接口文档里面写了具体调用方法:
但是说真的,这个文档写的太简陋了,我给你说另外一个地方的文档:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#5
从这里可以看到发生模板消息,有四个必须的参数。
ACCESS_TOKEN:访问凭证 touser:接收者openid template_id:模板ID data:模板数据
这四个参数怎么来呢?
我一个个的给你说。
首先是 ACCESS_TOKEN,看接口文档:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
从接口文档中我们知道,access_token 是调用一个接口后返回的参数。
而这个接口的入参有三个:grant_type 传固定值 client_credential,appid 和 secret 你也有。
所以你可以获取到 access_token。
按照接口文档写代码,这个没有问题吧?
但是,微信还给你提供了一个直接获取 access_token 的工具页面:
https://mp.weixin.qq.com/debug
把你的参数填进去之后,就可以获取到一个 access_token。
而且你要记住,access_token 的有效期只有 2 个小时,我在这里获取只是为了先拿到一个可以用的参数而已。
接下来的一个入参是 touser,也就是接收者的 openid。
openid 也是可以通过接口获取的,获取方式网上一抓一大把,我就不细说了。
把接口文档链接放一下:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
openId 在微信的接口里面是一个非常、非常、非常重要的参数,如果感兴趣的话,我建议你仔细研读一下。
想要通过编码获取 openId 还是要稍微花一点时间的。
但是,朋友们,我要但是了。
在当前这个测试的账号下,你扫码关注自己的这个测试号二维码,这里的这个微信号,就是自己的 openId,所以直接拿来用就行,你甚至不用写一行代码:
第三个和第四个参数分别是 template_id 和 data,这两个参数都是直接在页面上新增就有了。
现在参数齐了,我就可以直接写个 main 方法来跑一把了:
代码里面的链接和 json 结构我都是从接口文档里面粘过来的,然后把 main 方法一跑,你就能收到微信给你推送的消息了。
我说了,按照我的这个流程来,写个 Demo 超过 10 分钟算我输。
真正编码的时候就是要注意维护好 access_token 就行了,因为这个玩意是有时间限制的。
现在回到我们的需求中,当新增评论之后,我是不是可以直接发一个微信通知,这样我就能主动感知到有新评论了,就可以火速赶往现场吃瓜?
或者我再提一个简单的需求,我只关心题主王怜花的新评论,其他的新评论我不关心。
这个需求对应的伪代码是不是这样的:
if(是xx银行的储户){
赋红码
}
对不对,这个逻辑很清楚嘛,肯定不会有什么错的。
额...
不好意思,阿 sir,写错了,这是我在网上直接复制的代码,不能用,还得改改。
改成这样:
if(是王怜花的评论){
发微信通知
}
简单的扣脚,多加一个分支判断而已。
好了,瓜已吃完,打完收工。
最后,欢迎关注公众号why技术呀,老有意思了。