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


    你好呀,我是歪歪。

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

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

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

    然后知乎上一个 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技术呀,老有意思了。

  • 相关阅读:
    Spring 中众多的的Initializer
    Spring Factories
    spring 的各种context
    @import和@Bean的区别,以及ImportSelector和ImportBeanDefinitionRegistrar两个接口的简单实用
    Spring 配置的方式
    记一次JAVA FULL GC问题处理【3】
    关于String, StringBuilder,StringBuffer 的一些测试数据
    记一次JAVA FULL GC问题处理【2】
    ThreadLocal 结构
    记一次JAVA FULL GC问题处理【1】
  • 原文地址:https://www.cnblogs.com/thisiswhy/p/16392880.html
Copyright © 2020-2023  润新知