如何把微信二维码藏进命令行里

目录


我在博客的“关于”页面里写了我的联系方式,但没有以明文的形式展示,而是写了一行 shell 命令。已经有一些童鞋破解了这道小谜题,添加我为微信好友。我很开心,能认识到志同道合的朋友。

我之所以搞这么一道弯弯绕,不是我装 X,只是怕联系方式被爬虫爬到,或者被搜索引擎错误收录。正如同很多人会藏住自己的邮箱一样:“xxxxx[at]abc.com,把 [at] 换成 @”,初衷是相同的。

出乎我意料的是,大家似乎对这个把微信二维码藏进命令行的小技巧格外感兴趣,很多朋友来问是如何制作的,我总是笼统地回复一句用:“用 qrencode 生成的”,自以为言简意赅,却发现很容易误导人,甚至把一位童鞋带沟儿里去了。所以我决定弥补一下,写一篇如何把微信二维码藏进命令行里的教程。不,“教程”这两个字太严肃了,还是叫“攻略”吧,“游戏攻略”的“攻略”。

以上都是扯皮,下面正式开始。

首先,你要准备你的微信二维码,打开微信 APP,找到自己的“二维码名片”,下载图片到本地。

注意,这个下载这个二维码图片只是为了方便提取里面的内容,和生成的命令行里的二维码没有关系。

可以通过一些工具,比如这个网站,提取出二维码图片里的内容:

image

下面那个扫码结果就是我们要的东西,拷贝下来,为了方便后面继续演示,我们假设内容为:

https://u.wechat.com/EC2fu-y9csQRnUNXXXXXXXX

事实上,这个长得很像网址(只能说”像“,浏览器是打不开这个地址的)的字符串就是“微信二维码名片”的核心内容,你可以用任何工具将其转化为二维码,微信都可以正确扫出来。

下面就是比较酷的部分了:基于微信名片内容,生成一个可以在命令行里展示的文本二维码。

这里需要借助一个工具:qrencode,在各个 linux 发行版或 mac 上都能轻松安装它:

apt-get install qrencode # for ubuntu
yum install qrencode # for centos
brew install qrencode # for macos

这个工具的功能就是将任意字符串生成为二维码图片,而图片的格式你可以任意指定,可以是 PNG、SVG 等,然而酷的地方在于,你还可以指定格式为 ASCII、UTF8 等字符集,举例来说,现在把文本”hello“分别转化为用 ASCII 和 UTF8 字符集组成的二维码:

$ qrencode -t UTF8 hello
█████████████████████████████
█████████████████████████████
████ ▄▄▄▄▄ █▀ █ ▄█ ▄▄▄▄▄ ████
████ █   █ █▄ █▀▄█ █   █ ████
████ █▄▄▄█ █ ██▀ █ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ ▀ ▀ █▄▄▄▄▄▄▄████
████▄ ▀ ▀▀▄ ▀ ▄███ ▄▄█▄ ▀████
██████▄ █ ▄▄ █▄▀▄▄███ ▄▀ ████
████████▄█▄▄▀  ▀▄█▄▀ █▀█▀████
████ ▄▄▄▄▄ █▄  ▀▀ █ ▀▄▄▄█████
████ █   █ █▀▄▀ ██▄ ▄▀▀▀ ████
████ █▄▄▄█ █▀  █▄▀▀█▄█▄█▄████
████▄▄▄▄▄▄▄█▄█▄▄▄██▄█▄█▄█████
█████████████████████████████
█████████████████████████████

$ qrencode -t ASCII hello




        ##############    ##  ####  ##############
        ##          ##  ####  ##    ##          ##
        ##  ######  ##  ####    ##  ##  ######  ##
        ##  ######  ##    ##  ##    ##  ######  ##
        ##  ######  ##  ##      ##  ##  ######  ##
        ##          ##  ##    ####  ##          ##
        ##############  ##  ##  ##  ##############
                        ##########
        ####  ##    ####  ####      ######  ####
          ##########  ######        ##        ####
            ####  ########  ##  ####      ####  ##
              ##  ##    ##    ##          ##  ####
                ##  ####  ####  ##  ##  ##
                        ########      ####  ##  ##
        ##############  ######    ##  ##  ######
        ##          ##    ##########  ####
        ##  ######  ##    ##  ##    ######      ##
        ##  ######  ##  ##  ####      ##  ########
        ##  ######  ##    ####  ##      ##  ##  ##
        ##          ##  ######    ####
        ##############  ##  ######    ##  ##  ##



所以,按照这个套路,我们自然可以很轻松地生成一个用字符组成的微信二维码名片,字符集使用 UTF8 或 ASCII 都可以。

但是我在实际使用中发现,UTF8 组成的二维码虽然识别成功率更高,所需的字符数更少,但有个让人头疼的问题,就是要求终端设置必须是 UTF8 编码,否则显示出的就是乱码。我一开始就是使用 UTF8 格式生成的二维码,然后藏到命令里,神秘兮兮地发给同事,让他执行看看,一副深藏功与名的表情。结果悲剧了,同事的终端设的 GBK,于是一屏幕的乱码和一脸蛋的懵逼就相映成趣了。

退而求其次使用 ASCII 字符集,但识别成功率就要低很多,其由于大多数终端是黑底白字的(是吧?至少我的习惯是这样),而微信扫码时似乎更容易识别出“白底黑字”的二维码。可以转到请客里面看我的支付二维码,都是白底的,是不是?你扫扫看……

所以最终我建议使用 ASCII 字符集进行“反色”生成,选项是 ASCIIi,操作为:

$ qrencode -t ASCIIi https://u.wechat.com/EC2fu-y9csQRnUNXXXXXXXX
##########################################################################
##########################################################################
##########################################################################
##########################################################################
########              ####      ######  ##      ####              ########
########  ##########  ########    ##  ##      ##  ##  ##########  ########
########  ##      ##  ####      ##        ######  ##  ##      ##  ########
########  ##      ##  ##  ##    ##    ####    ##  ##  ##      ##  ########
########  ##      ##  ##  ##  ##          ######  ##  ##      ##  ########
########  ##########  ####    ######  ####    ##  ##  ##########  ########
########              ##  ##  ##  ##  ##  ##  ##  ##              ########
##########################  ####      ######      ########################
########    ######      ##    ##  ##    ##  ##  ########    ##############
######################  ####  ########    ##      ####    ##    ##########
########  ########      ##  ##          ##  ####    ##    ################
##############  ######    ##    ##        ##  ##            ##############
########    ######    ##      ######  ##  ######  ##    ########  ########
########  ##  ########  ##    ##          ####    ##      ####    ########
##########    ##  ##    ##  ######  ##  ########        ##    ############
######################      ####          ####  ####      ##  ##  ########
########  ####  ##      ####  ##                ######  ##    ############
########  ####      ####    ########  ##          ##      ##      ########
########    ##    ##  ####    ##  ####  ##  ##  ##      ##  ####  ########
########  ##    ######  ######  ####  ########  ##  ##  ##################
########  ##    ##        ##    ####        ####          ##      ########
########################  ##  ##    ######  ####  ######    ##############
########              ##  ########        ##      ##  ##      ############
########  ##########  ##      ##    ##  ######    ######  ######  ########
########  ##      ##  ####        ####  ####                ##    ########
########  ##      ##  ####  ##########      ####    ######    ##  ########
########  ##      ##  ####  ##    ####    ##      ##  ##        ##########
########  ##########  ##  ##    ####      ########            ##  ########
########              ##  ##      ####  ##  ######  ##        ############
##########################################################################
##########################################################################
##########################################################################
##########################################################################

现在,我们已经获得了一个字符二维码了,下面要做的是把它“藏”到命令里。

可以看到,生成的二维码其实是由大量重复的 # 字符组成的,这就意味着使用 gzip 等工具对其压缩时,压缩效果会非常显著,可以测试一下:

$ qrencode -t ASCIIi https://u.wechat.com/EC2fu-y9csQRnUNXXXXXXXX | wc -c
    2775
$ qrencode -t ASCIIi https://u.wechat.com/EC2fu-y9csQRnUNXXXXXXXX | gzip | wc -c
     282

可以看到,压缩前是 2775 字节,压缩后是 282 字节,压缩率差不多 10%。

然而,gzip 的压缩结果不是可打印字符集,没有办法在终端里展示,所以需要使用 base64 编码一下:

$ qrencode -t ASCIIi https://u.wechat.com/EC2fu-y9csQRnUNXXXXXXXX | gzip | base64
H4sIAM2lMFwAA92VzQ7CMAyD7zwF0t7/HXdAVf05TsvPDhORhlqWmMR2y3FcFY/LkO4O9UTMb8Zb3ddcg5r4c/1KVaDx1FxAabruan+eu4Qa+/HJDr+AUl4+6oprlntXS66oyvpZKlgjWUJLPdAVC2gEH62CNl2NjlhIkzpcoJ1skb0MErvSIdlLovwtrtIJ1LXOEAdkAnvy8dx7GDApln6ECrdcsUBLVVNyFwes95I7u2MsQiUWqi2qNEXB5CDlK91qsSsOwLE1i3fDAqpq5HbYDOhBY9QOnfTNfcU36XS2A/qwya6ZzcgVFVSHJY81Zuhlzn5zIjZQBKhcba6+qh6LOnk2/zjKlZ+/VsHf4/+hTmqvFZHXCgAA

最终,我们得到了一串 base64 编码的字符串,要还原成二维码,只需要将上述过程进行反向操作即可:

$ echo H4sIAM2lMFwAA92VzQ7CMAyD7zwF0t7/HXdAVf05TsvPDhORhlqWmMR2y3FcFY/LkO4O9UTMb8Zb3ddcg5r4c/1KVaDx1FxAabruan+eu4Qa+/HJDr+AUl4+6oprlntXS66oyvpZKlgjWUJLPdAVC2gEH62CNl2NjlhIkzpcoJ1skb0MErvSIdlLovwtrtIJ1LXOEAdkAnvy8dx7GDApln6ECrdcsUBLVVNyFwes95I7u2MsQiUWqi2qNEXB5CDlK91qsSsOwLE1i3fDAqpq5HbYDOhBY9QOnfTNfcU36XS2A/qwya6ZzcgVFVSHJY81Zuhlzn5zIjZQBKhcba6+qh6LOnk2/zjKlZ+/VsHf4/+hTmqvFZHXCgAA | base64 --decode | gzip -d
##########################################################################
##########################################################################
##########################################################################
##########################################################################
########              ####      ######  ##      ####              ########
########  ##########  ########    ##  ##      ##  ##  ##########  ########
########  ##      ##  ####      ##        ######  ##  ##      ##  ########
########  ##      ##  ##  ##    ##    ####    ##  ##  ##      ##  ########
########  ##      ##  ##  ##  ##          ######  ##  ##      ##  ########
########  ##########  ####    ######  ####    ##  ##  ##########  ########
########              ##  ##  ##  ##  ##  ##  ##  ##              ########
##########################  ####      ######      ########################
########    ######      ##    ##  ##    ##  ##  ########    ##############
######################  ####  ########    ##      ####    ##    ##########
########  ########      ##  ##          ##  ####    ##    ################
##############  ######    ##    ##        ##  ##            ##############
########    ######    ##      ######  ##  ######  ##    ########  ########
########  ##  ########  ##    ##          ####    ##      ####    ########
##########    ##  ##    ##  ######  ##  ########        ##    ############
######################      ####          ####  ####      ##  ##  ########
########  ####  ##      ####  ##                ######  ##    ############
########  ####      ####    ########  ##          ##      ##      ########
########    ##    ##  ####    ##  ####  ##  ##  ##      ##  ####  ########
########  ##    ######  ######  ####  ########  ##  ##  ##################
########  ##    ##        ##    ####        ####          ##      ########
########################  ##  ##    ######  ####  ######    ##############
########              ##  ########        ##      ##  ##      ############
########  ##########  ##      ##    ##  ######    ######  ######  ########
########  ##      ##  ####        ####  ####                ##    ########
########  ##      ##  ####  ##########      ####    ######    ##  ########
########  ##      ##  ####  ##    ####    ##      ##  ##        ##########
########  ##########  ##  ##    ####      ########            ##  ########
########              ##  ##      ####  ##  ######  ##        ############
##########################################################################
##########################################################################
##########################################################################
##########################################################################

最后

最后我们来总结一下。

将字符串生成为二维码、再压缩、最后编码:

qrencode -t [ASCIIi 或 UTF8] 信息字符串 | gzip | base64 

将编码结果还原成一个字符二维码:

echo 编码结果字符串 | base64 --decode | gzip -d

以上便是全部内容。Have fun and good luck!

祝大家 2019 年工作顺利、学习顺利,bug 更少,money 更多~