你好呀,我是歪歪。
正如标题说的,我觉得小米这波的格局显得有点小了。
事情是这样的 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/
同时博客也修复了一些大家反馈的问题。谢谢大家的支持,我会慢慢的持续优化的: