查看原文
其他

关于在网上突然多了一个“孙子”这件事,我是服气的!

歪歪 why技术 2022-09-23

你好呀,我是歪歪。

今天又带大家用新姿势来带吃个的瓜,这瓜老好吃了。

老规矩,先把瓜吃干净,再解锁新的技术姿势。

事情是这样的,上周五的时候不是中国第三艘航空母舰福建舰下水了嘛。

然后知乎上一个 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(是王怜花的评论){
    发微信通知
}

简单的扣脚,多加一个分支判断而已。

好了,瓜已吃完,打完收工。

荒腔走板

上周六凌晨的时候我发了一个纯文字的推送:《嘿,来评论区聊聊天吧。》

其实我当时是有点深夜 emo 的,所以我就抽空花了几分钟发了一个纯文字的推送,当时我想着这么晚了,再加上这种推送的内容应该看的人不多,所以还在评论区留下了“每条评论,我都回复”的 flag。

微信公众号最多能放出 100 条留言,我没想到的是这条推送的留言居然超过 100 条了。

不管你有没有在留言区释放你的压力、你的负面情绪或者你的无聊,至少你愿意点进来,看一下,然后留下一条评论。

我谢谢你,这是对我的一种鼓励和认可。

我也做到了每个评论都回复的承诺。

大多数留言都在说自己的困惑,迷茫和苦难,我也一样有自己的困惑,迷茫和苦难。

其中有一部分是来自于网络上的消息,而我的应对之法,在之前的文章里面提到过:

分清网络上发生的事情和身边发生的事情。前者即使让我再开心、再愤怒、再悲伤,它对我当下的生活影响并不大,我只需要给它 20%,甚至更少的注意力。我更应该关注的是围绕在自己身边真真切切发生的事情,更应该在意的是自己生活,提升自己的修养。

红红火火的生活,比深不见底的网络,有意思的多。

祝好。

··················END················

推荐👍JDK的BUG!

推荐👍对不起,是我错怪IDEA了。

推荐👍 :细节都在魔鬼里。

推荐👍 :之后,我再也没去过北京。

推荐👍 :2021,我这一年。

你好呀,我是歪歪。我没进过一线大厂,没创过业,也没写过书,更不是技术专家,所以也没有什么亮眼的title。

当年高考,随缘调剂到了某二本院校计算机专业。纯属误打误撞,进入程序员的行列,之后开始了运气爆棚的程序员之路。

说起程序员之路还是有点意思,可以点击蓝字,查看我的程序员之路

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存