淘口令的实现机制


淘口令的实现机制

一、前言

 

基于微信分享做裂变的童鞋应该知道,分享域名很容易被封掉,导致拉新数据降低;再加上最近微信对于裂变,变态级别的严格管理,导致各大电商巨头哀鸿遍野,拉新数据惨不忍睹。所谓道高一尺,魔高一丈,不造马云爸爸是不是提前预知到微信分享的不靠谱,细心的小伙伴可以发现,淘宝很少会通过微信的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)