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

你好呀,我是歪歪。

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

事情是这样的 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/

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

posted @ 2021-09-26 12:53  why技术  阅读(6904)  评论(58编辑  收藏  举报