小了,小米這波格局確實小了。

why技術發表於2021-09-26

你好呀,我是歪歪。

正如標題說的,我覺得小米這波的格局顯得有點小了。

事情是這樣的 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/

同時部落格也修復了一些大家反饋的問題。謝謝大家的支援,我會慢慢的持續優化的:

相關文章