淘口令的實現機制
一、前言
基於微信分享做裂變的童鞋應該知道,分享域名很容易被封掉,導致拉新數據降低;再加上最近微信對於裂變,變態級別的嚴格管理,導致各大電商巨頭哀鴻遍野,拉新數據慘不忍睹。所謂道高一尺,魔高一丈,不造馬雲爸爸是不是提前預知到微信分享的不靠譜,細心的小伙伴可以發現,淘寶很少會通過微信的API去做裂變分享,而是采用一種新的產品“淘口令”來應對微信帶來的風險;
在微信危機下,於是各公司開始尋求突破,把目光投向了 “淘口令”,以期突破微信的重重封鎖;
二、原理及機制
“淘口令”大體原理其實並不怎么復雜,起實現方式,不外乎是,用戶復制淘口令的文本, 打開APP的時候,APP會自動讀取剪貼板中的數據,然后截取對應的口令,上傳到服務端,然后解析出來相應的信息;
這里便實際貼出一個淘口令,以便分析:
【拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥MxwAYuKMXH8¥后咑閞👉淘灬寳👈
可以看到所有的淘口令,都會有一個 特殊字符 【¥ +(數字或大小寫字符)+ ¥】,這里¥就是口令標識符, 而客戶端,就是通過截取口令兩邊的特殊字符來得到口令,然后上傳到服務端來解析,並進行相應的操作(彈窗或跳轉);
我們都知道,想要一大串長的字符串,縮短到8位左右的字符串的話,不外乎兩種方式:
- 鍵值對方式(key => value)
- 進制轉換方式(低進制轉為高進制)
2.1 鍵值對方式
假設 我們有一個分享的口令信息:
10@user_id=654321&goods_id=123456@maidian
第一@前面是業務編號(10),第二個@(maidian)后面的字符串是埋點信息,中間的是分享人及分享的商品信息;如果直接分享的話,按照淘口令的形式為:
【拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥10@user_id=654321&goods_id=123456@maidian¥后咑閞👉淘灬寳👈
可以看到,信息被透露出去,且太長一串,也不夠友好;
鍵值對方式很好理解,就是通過key/value,將口令和口令信息進行一一對應的方式來進行實現,但是這樣有很大的局限性,首先鍵值對的話,要保證口令的位數不能太多,另外不能位數差異太大,不能一個口令是3位的,另外一個口令是8位;口令太多的話,整個分享文案,一眼望去全是數字,營銷文案就沒心思看下去了;
隨機數字 數字對應的信息
如果是利用純數字存儲分享信息的話:
拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥101¥后咑閞👉淘灬寳👈 拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥10123230000¥后咑閞👉淘灬寳👈
兩個口令,長短不一,保存的信息有限,如果想包含更多信息,需要加大位數;
2.2 進制轉換的方式
【拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥10@user_id=654321&goods_id=123456@maidian¥后咑閞👉淘灬寳👈
依舊是該口令,因為該口令包含特殊字符,想使用進制轉換的方式卻不那么理想,而進制轉換的最理想的方式卻是將10進制的數字轉為62進制,這樣才能顯著的降低位數:
表一:進制范圍表
進制 |
范圍 |
10 |
0-9 |
26 |
小寫字母 |
32 |
不含ILOU的小寫字符 + 10數字 |
36 |
數字 + 小寫字符 |
52 |
大寫字母 + 小寫字母 |
58 |
不包含 0OlI 字符 |
62 |
數字 + 小寫字母 + 大寫字母 |
表二:10進制轉為62進制結果
10進制 |
轉為62進制的結果 |
1234567890 |
1ly7vk |
9999999999 |
aUKYOz |
10000000000 |
aUKYOA |
123456789 |
PNFQ |
從上表可以看出,在10進制轉為62進制,縮短的效果還是比較明顯的,從原來的10位字符,縮短到6個字符串,且比較穩定,10億-到100億的范圍都是6位字符,還是比較短的;
下面將兩者的進行結合進行淘口令生成實戰;
三、淘口令實戰
上面介紹的兩個方式【鍵值對】和【進制轉換】的方式,都有或這或那的局限性,可能有童鞋就想,能否兩者結合起來,下面來進行實際操作下;
依舊假設我們有以下的口令信息:
10@user_id=654321&goods_id=123456@maidian
第一步:獲取一個隨機10億到百億之間的隨機數字:10000000000
第二步:將數字轉為62進制,結果為:aUKYOA
第三步:將字符串和口令信息進行匹配緩存(例如以鍵值對的形式存到Redis緩存中):aUKYOA => 10@user_id=654321&goods_id=123456@maidian
第四步:拼接,得到淘口令:
拜托幫我點一下!雙11狂歡節非常贊!我有一張【金稻旗艦店】20元限量優惠券送給你,快來看看!】,復zんíゞ整句話¥aUKYOA¥后咑閞👉淘灬寳👈
- 解析口令
(1)從剪貼板中截取口令:aUKYOA
(2)根據口令從緩存(如redis)中查找鍵值對關聯信息:
10@user_id=654321&goods_id=123456@maidian
(3) 做一些業務處理(跳轉或記錄分享數據)
注意:
這里其實還有一個小問題,那就是取數字的方式,如果是隨機取數字的話,可能會導致重復,雖然在100億到1000億之前重復的概率比較小,但是還是會有重復的可能,所以生成的數據,需要去判斷一下重復;在這里,我推薦使用發號器,設置一個初始值然后遞增的發放數據,這樣就能保證生成的數據,是全局唯一的;
(轉載自安sir,原文地址:https://www.yuque.com/ansir/egwww1/itupzp)