3

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

 2 years ago
source link: https://blog.wolfogre.com/posts/qrcode-in-shell/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

2019/01/05.

Tools , Shell 1.0k+ 4

我在博客的“关于”页面里写了我的联系方式,但没有以明文的形式展示,而是写了一行 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 更多~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK