引子
“二维码真是越来越多了…”一如既往我拿起手机准备3D touch微博的icon扫码登录,突然觉得这个动作似曾相识,好像我如此重复的时候还有很多,比如:
- 电脑逛淘宝想用手机接着看的时候我要用手机淘宝扫一下
- 偶尔登一下万年不用的QQ邮箱时我要用手机QQ扫一下
- 我要做书籍记录的时候我要点开豆瓣扫一下
- 支付宝、微信支付的时候我要扫一下
- 电脑上用微信登录的时候我要扫一下
- ……
天哪,这实在太麻烦了,我要做一个workflow完成所有的扫码动作。
多合一
我想把所有要扫码的地方全部用一个扫码界面代替。
目前实现了如下功能:
- 扫描二维码登录淘宝、微博、微信、支付宝、京东、大众点评、115
- 扫描电脑版淘宝页面二维码跳转到手机淘宝相关页面
- 扫描电脑版京东页面二维码跳转到手机京东相关页面
- 扫描电脑版大众点评页面二维码跳转到手机大众点评相关页面
- 扫描书籍ISBN码跳转到手机豆瓣相关页面
- 微信扫码支付、加好友等
- 支付宝扫码支付、加好友等
- 如果既不是网页也不是ISBN码那就复制到剪贴板(万一你对象给你写了悄悄话藏在二维码里呢٩( ᐖ )و
淘宝、支付宝、豆瓣、京东、大众点评可以直达二维码链接界面。
但是微博、微信需要跳转到本身的扫码界面二次扫码。
虽说是二次扫码,但是也是极快的。具体原理可以参考微信的一篇文章。微信扫码为啥那么快?
也可以通过两张动图对比一下。
- 微信登陆(二次扫码)
- 淘宝登陆(扫码直达)
这里安利给大家一个chrome插件,可以把电脑网页转换成二维码显示在屏幕上,然后就可以愉快地扫码了。Anything to QRcode
实现原理
实现这个workflow的原理主要基于URL SCHEME的应用和豆瓣API的调用。
1. 首先获取各个App的URL SCHEME
这些信息部分网上都可以搜到。
- 淘宝:taobao://
- 微博:weibo://qrcode
- 微信:weixin://scanqrcode
- 支付宝:alipayqr://platformapi/startapp?saId=10000007
- 豆瓣:douban://
- 京东:openApp.jdMobile://virtual?params={参数}
2. 研究调用机制
示例中分为一次扫码是如何实现的呢?
一次扫码像是淘宝、支付宝和豆瓣,App本身就支持从链接跳转到App中制定页面,但是如何获取这个「链接」就是关键了。
以情况不复杂的支付宝扫码举例。复杂的情况类似于京东需要抓包分析,本文不涉及。
这个二维码包含了一个网页
https://qr.alipay.com/a6x00588utz0thcokf77vv7d
然后我试着直接打开看看
这是一个新的网址,有没有觉得有点眼熟?
https://ds.alipay.com/?from=mobilecodec&scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D10000007%26clientVersion%3D3.7.0.0718%26qrcode%3Dhttps%253A%252F%252Fqr.alipay.com%252Fa6x00588utz0thcofk77v7d%253F_s%253Dweb-other
这个URL经过了编码,首先来解码
https://ds.alipay.com/?from=mobilecodec&scheme=alipays://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https://qr.alipay.com/a6x00588utz0thcofk77v7d?_s=web-other
将其分段便于理解
https://ds.alipay.com/?from=mobilecodec
&scheme=alipays://platformapi/startapp?saId=10000007
&clientVersion=3.7.0.0718
&qrcode=https://qr.alipay.com/a6x00588utz0thcofk77v7d?_s=web-other
从上至下一眼便知:
第二行是支付宝客户端的URL SCHEME,第四行是刚刚二维码内含的网页。
把第二行和第四行结合起来去跑一下看看
alipays://platformapi/startapp?saId=10000007&qrcode=https://qr.alipay.com/a6x00588utz0thcofk77v7d?_s=web-other
果然成功了!直接进入了我的个人主页。
然后就可以在Workflow里开工了。
首先扫描二维码,把扫描到的内容保存到一个变量中,我的workflow里起名叫做code。
随后我清空了剪贴板,这是一个个人习惯。如果不需要可以删除。
接着就是Get Variable用If语句 判断刚刚读到的内容里面是否含有
qr.alipay.com
这个元素,如果有的话,那刚刚读到的应该是一个调用支付宝打开的链接。那么我们给他在他前面加上一端
alipays://platformapi/startapp?saId=10000007&qrcode=
使得链接变成这样
alipays://platformapi/startapp?saId=10000007&qrcode=https://qr.alipay.com/xxxxxxxxxxxxxxxxxxxxxx
最后使用Open URLs就可以了。
为了展示效果简化了判断是否为链接的判断,也是同样用If判断即可。
3. 罗列一下其它App的解决方案
淘宝,替换链接中https为taobao
taobao://taobao.com/xxxxxx //淘宝页面
taobao://tb.cn/xxxxx //淘宝扫描二维码登陆
微信,如包含以下关键字,调用weixin://scanqrcode二次扫码
tenpay.com //微信支付
weixin.qq.com //微信公众号、小程序、个人名片链接
微博,如包含以下关键字,调用weibo://qrcode二次扫码
weibo.cn //微博扫码登陆
豆瓣,替换链接中https为douban
douban://douban.com/book/xxxx //豆瓣读书
京东,替换商品id或者登录key
大众点评,提取id
dianping://shopinfo?id=<商户ID>
dianping://tuandeal?id=<团购单ID>
阅读前文后可以自己尝试看看。
4.调用豆瓣API
有兴趣的可以研究一下。在这个workflow里是扫描书背后的条形码跳转到豆瓣的页面里。
豆瓣的API页面:豆瓣图书Api V2
当我们扫到了书的条形码,就是那个978xxxxxxxxxx的13位数字之后,如何将它变成一个豆瓣可以打开的链接呢?
这里以《岛上书店》举例。这本书的ISBN号是9787539971810。
打开这个链接
https://api.douban.com/v2/book/isbn/9787539971810
我们可以获得如下的信息
{"rating":{"max":10,"numRaters":49715,"average":"7.7","min":0},"subtitle":"","author":["[美] 加布瑞埃拉·泽文"],"pubdate":"2015-5","tags":[{"count":8523,"name":"小说","title":"小说"},{"count":6457,"name":"外国文学","title":"外国文学"},{"count":4281,"name":"好书,值得一读","title":"好书,值得一读"},{"count":4024,"name":"美国文学","title":"美国文学"},{"count":3438,"name":"文学","title":"文学"},{"count":3267,"name":"生活","title":"生活"},{"count":3070,"name":"美国","title":"美国"},{"count":2878,"name":"深夜读书","title":"深夜读书"}],"origin_title":"The Storied Life of A. J. Fikry","image":"https://img3.doubanio.com\/mpic\/s28049685.jpg","binding":"平装","translator":["孙仲旭","李玉瑶"],"catalog":"第一部\n《待宰的羔羊》 \/ 3\n《像里兹饭店那样大的钻石》 \/ 27\n《咆哮营的幸运儿》 \/ 41\n《世界的感觉》 \/ 81\n《好人难寻》 \/ 89\n《卡拉维拉县驰名的跳蛙》 \/ 135\n《穿夏裙的女孩》 \/ 167\n第二部\n《与父亲的对话》 \/ 183\n《逮香蕉鱼的最佳日子》 \/ 197\n《泄密的心》 \/ 209\n《铁头》 \/ 223\n《当我们谈论爱情时我们在谈论什么》 \/ 249\n《书店老板》 \/ 257\n--\n注:整本书的章节标题都是文学作品的标题。\n《岛上书店》是一部小说。","ebook_url":"https:\/\/read.douban.com\/ebook\/9580262\/","pages":"271","images":{"small":"https://img3.doubanio.com\/spic\/s28049685.jpg","large":"https://img3.doubanio.com\/lpic\/s28049685.jpg","medium":"https://img3.doubanio.com\/mpic\/s28049685.jpg"},"alt":"https:\/\/book.douban.com\/subject\/26340138\/","id":"26340138","publisher":"江苏凤凰文艺出版社","isbn10":"7539971819","isbn13":"9787539971810","title":"岛上书店","url":"https:\/\/api.douban.com\/v2\/book\/26340138","alt_title":"The Storied Life of A. J. Fikry","author_intro":"加布瑞埃拉·泽文 Gabrielle Zevin\n译作目录:http:\/\/book.douban.com\/doulist\/14076\/\n译文小集:http:\/\/www.douban.com\/note\/34107135\/\n李玉瑶,编辑,译者。七十年代生人,现任职于上海译文出版社。译有《阿克拉手稿》《与狼共舞》《房间》《激情》等作品。","summary":"岛上书店是间维多利亚风格的小屋,门廊上挂着褪色的招牌,上面写着: 没有谁是一座孤岛。","ebook_price":"16.80","series":{"id":"34361","title":"全球顶级畅销小说文库:加·泽文作品"},"price":"CNY 35.00"}
很长的一段信息,包含了这本书的封面图片、简介等信息。
这一次要提取的信息是《岛上书店》这本书的豆瓣id
"title":"岛上书店","url":"https:\/\/api.douban.com\/v2\/book\/26340138",
url下有这本书的id,这本书的豆瓣网页链接也包含了这个信息
26340138
https://book.douban.com/subject/26340138/
接下来进行文字替换,打开链接即可。
https://api.douban.com/v2/book/26340138
douban://douban.com/book/26340138
下面用Workflow来完成这个动作。
5.如何把以上东西全部放到一个workflow里
以上的教程单单领出来一个可能制作起来很方便,但是要怎么自动识别读到的文字呢?
这里要用到正则表达式进行判断
首先判断一下是不是ISBN码,它的特征是13位数字,978开头。
^978[0-9]{10}$
再可以判断是不是http开头的链接,这里就不展开了,这需要一些耐心琢磨。
推荐大家两个网站可以自学,正则表达式在线测试,正则表达式30分钟入门
抛砖引玉
这个workflow还远远没有完美,希望大家一起完善。
这种东西少数派的大神肯定早就做过了吧,我心里是这样想的,希望能够抛砖引玉。
我暂时还没有办法找出手机QQ扫码界面的url。微博微信的扫码还需要跳转到App本身的扫码界面二次扫码,并不像淘宝和豆瓣那样可以直达。
欢迎留言。
workflow下载地址:https://workflow.is/workflows/b9f3db58282a46208a739bc3d65f97fd
Update
2017-01-30 暂时停止更新
2017-01-29 支付宝扫码登录将跳转到支付宝二次扫码,支持收钱吧
2017-01-23 修复了扫码复制到剪贴板的BUG,增加跳转115客户端扫码
2017-01-23 增加大众点评扫码登录&扫码跳转到手机大众点评
2017-01-22 增加京东扫码登录&扫码跳转到对手机京东
2017-01-19 增加了支付宝扫码付款&扫码加好友等功能
2017-01-18 First Release,支持淘宝、微博、微信、豆瓣