• 小了,小米这波格局确实小了。


    你好呀,我是歪歪。

    正如标题说的,我觉得小米这波的格局显得有点小了。

    事情是这样的 8 月 10 日晚上雷总不是发布会吗,就小米十周年那个。

    我全程看完了,后来雷总给我整感动了,刚好那段时间在物色一个平板,想要提升一下生产力,所以我当即就在小米有品的APP 上预定了一款:

    隔了段时间,我上去看,发现有一个晒单赠保护壳和钢化膜的活动。

    点击详情一看,活动规则是这样的:

    所以我收到平板之后,当天晚上里面就给它刷了一个五星好评。

    说真的,评论中的“惊艳”、“音效”都是我拆箱体验后的真实感受,直到现在我都被它的八扬声器折服。

    但是如果它没有这个活动,我肯定也懒得去评论这一波。

    我评论的时候特意看了一下,评论总数确实没有超过 1000,可惜当时忘记截图了。

    反正当时心里觉得这波肯定是稳得一笔。

    就坐等收货就完事了。

    啪的一下,很快啊,一个月过去了,时间就来到了 9 月 18 号。

    我突然又想起了这事,然后登陆 APP 去看了一下中奖名单。

    这个时候,有意思的事情就出现了。

    首先,它公布的名单居然是一个长图,图片里面只包含序号、订单号、用户 ID 这三个信息:

    图片意味着什么你知道吧?

    意味着我不能搜索我的订单号或者用户 ID。

    于是我就一个个的看。

    看了大概两分钟我就觉得这事不对,不知道是出于什么目的给了图片,完美屏蔽了搜索功能,反正这样的用户体验让我感到恶心。

    当时我就幡然醒悟:我为什么要傻乎乎的自己看呢?1000 个订单号啊,我得看到什么时候去?

    在那个时刻,我的内心想法还是:这里面一定有我,只是我懒得找而已。

    所以,我决定向客服求助,于是发生了这样的对话:

    但是在这里我必须要说一句,当时对接我的那个客服态度是真的很好,很不错,让我感觉很舒服。

    但是这用户体验是真的很神奇,为了让你有个直观的感受我把图片也放在这里一下:

    怎么样,想在这里面找到指定的订单号,是不是稍显困难了一点?

    而且,这才 150 个订单...

    假设,我真的从 1000 个里面去找自己,可能要把自己眼睛看瞎吧。而且看完一次后发现:咦,怎么没有我?我看漏了?再来一次。

    于是眼睛得更加仔细的又瞎一次。

    总之,最后让客服帮我看了,最后的结论就是没有我。

    我当时心想没有就算了吧,这玩意又不公开透明的,我也没法啊。

    但是隔了几天后,我偶然间看小米社区里面再说这个事。

    于是我又打开有品 APP 的评论页,随手翻了几条评论,发现下面说这个事情的还挺多,我随便截取几个:

    原来不是我一个人有这样的困惑呀,那就有点意思了。

    我决定玩一玩。

    图片识别

    首先,我要明确的是那 1000 个订单号的图片里面确实没有我,因为我确实没有一个个的去看。

    所以,我要再次确认一下。

    当然了,我肯定不可能一个个的去找。

    所以,我想起了图片识别技术。

    于是我再某浏览器按照关键字搜索,一看到前两个就是熟悉的味道:

    自己给自己打广告,没毛病。

    点进去一看,好家伙,免费使用。

    正合我意,那就用起来吧。

    之前也没接触过这个领域,让我徒手撸代码肯定是不现实的。

    但是按照我多年作为程序员的直觉肯定是有 SDK 包,然后把里面的参数改改就能跑起来,Demo 嘛,能出结果就行了,没有这么多讲究。

    所以我第一件事就是找官方文档,文档里面肯定有 SDK 包的下载地址。

    https://cloud.baidu.com/doc/OCR/s/Ek3h7xypm

    果不其然,一眼就被我发现了:

    很快我就把代码拉下来了,在 idea 里面配置好了。

    然后按照文档上的提示把这个方法粘到项目里面去:

    接下来有两个问题。

    第一个是按照代码提示,我需要 APP_ID、API_KEY、SECRET_KEY。

    这个问题很好解决,去创建一个应用,非常简单的点几个下一步,就可以拿到对应的这些参数了:

    我这有一个配置,你要想玩的话可以直接拿去用,但是免费版,有调用次数限制


    public static final String APP_ID = "24883148";

    public static final String API_KEY = "VVBoWjFADAOPTONBRif5DG6G";

    public static final String SECRET_KEY = "u7w61bHlaDpKRbWaXM8GzxDrifLKwVXS";

    第二个问题是我需要找到调用的接口,这个也是在官方文档上面一下就找到了:

    它这里有很多的场景,我现在需要的场景就是数字识别。

    在 SDK 里面也可以找到:

    现在都齐活了,我只需要把 main 方法跑起来应该就能看到结果了。

    可是当我跑起来之后...

    图片太大了。

    于是,我先截了个小的图片,先试验一下功能是不是正常。

    再次跑起来,发现没毛病了,识别出来了:

    现在只剩下最后一个问题,图片太大了,怎么解决呢?

    很简单,图片拆分嘛,把一个图片拆分成多张,我在网上找到的下面这串代码就能干这事:


    public class ReadPicNum1 {

        

        private static final String IMAGE_FILE_PATH = "D:\Pic\1.jpg";

        //横向分隔个数

        private static final int SEP_X_NUM = 1;

        //纵向分隔个数

        private static final int SEP_Y_NUM = 3;

        public static void main(String[] args) throws Exception {

           cutPic();

        }

        public static String cutPic() throws Exception {

            File file = new File(IMAGE_FILE_PATH);

            if (!file.exists() || !file.isFile()) {

                throw new RuntimeException("file not exists or un-file:" + IMAGE_FILE_PATH);

            }

            BufferedImage image = ImageIO.read(file);

            int totalWidth = image.getWidth();

            int totalHeight = image.getHeight();

            int width = totalWidth / SEP_X_NUM;

            int height = totalHeight / SEP_Y_NUM;

            File dirFile = new File(file.getParent(), file.getName().substring(0, file.getName().lastIndexOf(".")));

            if (!dirFile.exists()) {

                dirFile.mkdir();

            }

            for (int y = 0, j = 1; y <= totalHeight - height; y += height, j++) {

                for (int x = 0, i = 1; x <= totalWidth - width; x += width, i++) {

                    File targetFile = new File(dirFile, j + "_" + i + ".jpg");

                    BufferedImage targetImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

                    Graphics g = targetImage.getGraphics();

                    g.drawImage(image.getSubimage(x, y, width, height), 0, 0, null);

                    ImageIO.write(targetImage, "JPG", targetFile);

                }

            }

            return dirFile.getPath();

        }

    }

    最终呈现出来的效果是这样的:

    现在程序就位,可以大刀阔斧的开始干了。

    我只需要把中奖名单的那个长图的链接找到,然后通过链接把图片下载到本地,再用上面的程序把图片分割成 100 张,最后一张张的识别出来,把结果直接输出到控制台,不就能知道有没有我的订单号了吗?

    我可真是个天才。

    但是,当我再次打开页面,想要实施我的计划的时候,好家伙,中奖名单没有了!

    我寻思这也没公布几天呀,怎么就没了呢

    于是我再次看了活动规则,只说了公布开始时间,没说啥时候撤销公布:

    看来此路是行不通了,而且我预计就算是我识别出来了,里面肯定也是没有我的,我只是不到黄河不死心而已。

    虽然在活动规则里面没有看到名单公布的截止时间,但是我看到了另外一个东西,让我眼前一亮,故事也随之峰回路转:

    如果我没有猜测的话,它这句话的意思就是:按照评论的系统时间排序,取前 1000 个有效评论,即为中奖名单。

    等等,评论?

    评论我还是可以看到的呀,就在商品详情页面:

    在这里我可以看到所有的评论和所有的评论时间。

    那么...

    我是不是不经意间把评论全部扒下来,然后一不小心把数据都放到数据库里面去,接着莫名其妙的按照评论时间排个序,最后非常偶然的瞟一眼自己的名字,不就可以知道自己是不是在按照时间排序的评论的前 1000 之内了吗?

    说干就干,干之前我查了,这事合法的,放心。

    扒评论

    果然,在不经意间我就发现了这样的一个地方:

    好巧啊,这不就是我的评论吗?

    而且经过分析,我发现它返回的 ctime 字段就是评论时间,只是它按照时间戳的方式返回的,我在后面加上三个 0,就是我的真实评论时间:

    接下里的事情就简单了,我只需要写一段代码,写代码的时候一不小心把这些评论数据都放到数据库里面去:

    3751条评论,一不小心就都在这里面来了。

    查一下自己,看看有没有重名的:

    查出来之后,我发现我的准确评论时间是 2021-08-18 22:40:28。

    然后,我又莫名其妙的写了这样一条 SQL,反正我也不懂啥意思:

    如果我的数学老师没有骗我,那么我可以大胆的推测 959 应该是小于 1000 的。

    也就是说,我应该是中奖了呀?为什么名单上没有我呢?

    当然了,也有可能还有一部分评论在后台审核中,还没放出来,这玩意谁知道呢?

    只是我觉得这活动都结束了,审核还没结束,会不会有点牵强呀?

    咱也不敢问,咱也不敢说呀。

    既然评论数据都有了,我就顺便看看那个版本的小米平板卖的最好吧:

    果然是 6+128G 的黑色,2499 元的价格,还要啥自行车。性价比拉满了好嘛。

    虽然我买的是 6+256G 的,但是首发价 2699 元,加 200 多 128G 内存,我觉得这波不亏。

    最后,评论都有了,来都来了,那就顺手做个词云吧。

    这是基于所有评论做的词云,一片叫好:

    这是过滤出来评论中和 1000 名活动相关的评论做出来的词云,略有不佳:

    反正我感觉吧,这活动,你直接说抽奖不就完了吗?

    哦,抽奖的话我可能就不会去参与了。

    当然了,这只是我个人的一些吐槽,小米在我心中就是一家非常伟大的公司,向雷布斯致敬。

    但是一码归一码,在小米有品上搞的这个活动,没搞好,不透明,格局小了。

    再说说图片识别

    其实我在做图片识别的时候发现还有其他很多好玩的东西:

    比如图像特效我就玩了一下,如果你也想玩一下的话,需要更换一下参数。

    其他的按照官方文档自己玩就行了:


    public static final String APP_ID = "24886324";

    public static final String API_KEY = "hxSlOK6C5BTjHyXxkQuNuL7V";

    public static final String SECRET_KEY = "skST5eXm861Cw4az5vPZbevNlcOmaKYZ";

    这是黑白照片上色后的效果,反正我是觉得有点诡异:

    但是我试了一下家里的多年前爷爷奶奶辈的黑白照片,效果还稍微可以一点。

    然后试了试人物动漫化的接口,我实在忍不住想笑:

    最后,其实前面出现的图片拆分的代码,还有另外一个功能,比如你把它修改为 3*3 的模式:

    那么最终出来的效果就是这样的:

    你明白我的意思吧?

    就可以在朋友圈装逼了,虽然我觉得没有任何卵用:

    本文已收录自个人博客,欢迎大家来玩。

    https://www.whywhy.vip/

    同时博客也修复了一些大家反馈的问题。谢谢大家的支持,我会慢慢的持续优化的:

  • 相关阅读:
    Java接收Cordys中webservice接口的返回数据并解析xml获取相应节点数据
    初识jenkins之-jenkins的安装与配置
    Linux(centos6.8)下Tomcat的安装与配置
    [置顶] Linux下(centos6.8)JDK1.8的安装与配置
    小白五一期间个人建站
    声明一些事
    js中apply()的用法淺談
    angularJS中的服务
    PHP中的常用关键字
    PHP中三大特性---继承性
  • 原文地址:https://www.cnblogs.com/thisiswhy/p/15337601.html
Copyright © 2020-2023  润新知