绕过微信爬取猩便利特价信息并推送到微信

前言

公司里又多了一个无人货架——就是前阵子新闻说融资好几亿的猩便利
我是搞不太懂这玩意儿怎么突然火起来而且能骗到那么多融资的,按理说这玩意儿应该没啥盈利能力啊。虽然货架成本低廉,但需要每天人工四处给货架补货,零售价也就普通小卖部水平,也不向企业收取租金之类的,还有商品被偷取的风险。总体来说感觉每包零食赚的那几毛、几块并不足以承担补货员每天跑的成本以及商品被偷取、损坏的风险
感觉和现今的共享单车行业十分相似,售价低了赚不回本,售价高了没人买。现在突然爆火,过不了一年肯定绝大部分都要倒闭
我突发奇想,不如空出一个会议室来,专门放各个品牌的无人货架,等这些公司倒闭之后…… 手动斜眼

想太多了,还是现实点进入正题吧
这个猩便利相比我司之前的某品牌无人货架最大的一点优势就是经常搞活动 (不愧是融了几个亿) 。单价降幅从几毛到几块都有,而且活动基本不断。最优惠的时候零食饮料只要一块甚至几毛,应该是亏本在卖。一位同事甚至养成了每天到公司先扫码看看今日特价商品的习惯
再者,货架本身不大,种类繁多,每种商品库存不到5。特价商品一旦被同事发现并传播,极有可能瞬间被秒完
怎样才能让我第一时间获取到特价信息呢?
既然价格是显示在网页上的,那就不好意思了

目标

自动获取猩便利特价信息,根据降价幅度大小排序,并将特价列表推送到微信

分析

获取商品页面URL

爬取数据之前,首先得知道URL
于是微信扫码——点右上角菜单键——嗯?复制链接按钮呢?
估计是用微信的JSSDK之类的东西屏蔽了那个按钮吧
这也难不倒我。于是我找到一个 草料二维码扫描器 ,把货架上的二维码拍下上传,得出商店链接:
https://www.xingbianli.com/openrack/abcd9e80-ab4d-a66d-a7cd-abcd377abcdb/buy

尝试直接访问

可以看出中间那段“乱码”应该是货架ID之类的。浏览器直接访问,被跳转到:
https://h5.xingbianli.com/app/app-openrack-h5/main.html#/platform/common
看样子是判断了UA,我们给浏览器设置一个微信的UA糊弄它一下:

以全球第一的Chrome浏览器为例。F12 - 右上角Settings - Devices - Add custom device...
device name 随便填,user agent string填我上面提供的UA,点击add
然后toggle device toolbar,在最左侧选择你刚添加的device即可

再次访问,跳到了微信开放平台的域名并白屏,看来是需要获取微信的openid之类。虽然骗过了猩便利,但普通浏览器毕竟是无法获取微信用户信息的,因此卡在这里白屏
怎么办?不得不放弃了吗?

绕过微信开放平台

做过微信公众号网页授权的都知道,这个授权过程只能在微信内置浏览器中进行,可以杜绝用户使用微信以外的APP进行访问
但总不能每次操作都先往微信的接口跳转一遍再跳回来啊?为了保证操作正常进行,即便是依赖于微信的开放平台体系,也还是得自己维护登陆态——也就是Cookie
如果没猜错的话,我可以先用微信正常打开这个页面。获取到猩便利的登陆态Cookie后,再抓包出来给爬虫用,这样就能绕过微信网页授权了

动手

获取猩便利Cookie

首先,抓包我喜欢用Fiddler,填写邮箱即可免费下载免费使用
以前抓微信浏览器的包还得电脑开代理,手机跟电脑连接同一个路由器,然后通过电脑代理才能用Fiddler去抓。现在有了微信PC版,一切都更加方便了
首先,使用微信PC版访问之前提到的商店链接

为了避嫌,上文中出现的商店链接里面的货架id是我乱敲的

然后打开Fiddler,如图所示:
75266d7bfb3102556f98ec189af1ba91.png

  1. 拖动准星,移动到微信PC版浏览器窗口上,松开左键。准星右侧显示wechat后刷新页面
  2. 找到这条记录,选中
  3. 切换到Cookies标签页
  4. 这两条Cookie就是猩便利的登陆态了

获取商品信息

现在我们有了UA和Cookie,首先我们得把Cookie应用起来
方法有很多,我推荐EditThisCookie。在任意页面打开此扩展,点击+,把刚才拿到的两条Cookie添加进去,域名填.xingbianli.com,过期时间随意
现在,我们可以试着访问商店链接了……耶!成功打开!

接着就是查看页面源码格式,准备正则表达式……
嗯?源码里怎么没有商品数据的???

以上纯属臆想,聪明的小伙伴们早就在上面找Cookie的步骤中就跟我一样发现了——猩便利的商品信息是ajax加载的。是的没错,就是上图我框出来的那个请求。查看Response的JSON标签页,我们可以看到一个超大的JSON串,里面有我们所需要的一切信息:
bb8207563c9065684420d6b0c3460753.png
我们只需要关注discountcommodityList这两个数组就行了,分别是特价信息和商品信息

实现思路

循环discount数组,获取里面的商品id和特价价格currentPrice。然后从commodityList里找出商品原价basicPrice,相减得出降幅,以此排序。接着拼接上一些相关的商品信息,最后推送到微信即可。

实现推送

上述思路的最后一步要如何实现呢?其实有个很方便的免费服务叫做Server酱,Github登陆后稍加配置即可实现,方便快捷,还支持Markdown哦

最终成果

718ec67c941762129430fa500f62281e.jpg
是的没错,昨晚撸出来的小项目

结语

上述项目其实只是个开始,还远远不能让我满意。据我简单的观察,猩便利并非在每天固定的时间点刷新特价信息,而是按照一定算法(or随机)在一天内变动几次的,因此理想状态下应该要能够:

  • 使用数据库存储本次爬取的价格信息
  • 每次爬取时对比上次爬取的价格,将降价的商品列出,推送到微信
  • 设定一个爬取频率,例如5分钟一次之类。及时获取特价信息

而不是像现在这样,每次爬取都得到整个特价信息列表
等以后有空再继续完善加强吧 咕咕咕

开源

既然都写好了,当然要顺手开源。注释够多功能够简单所以没有文档
https://github.com/mokeyjay/xingbianli-sale-spider
很久没脱离框架写代码了,写的很随意,求不吐槽
因为不想造轮子所以引入了一个curl包,体积不大所以干脆整个vendor丢上来了

7 条评论

昵称
  1. 左手

    很给力,微信有很多机会哇。一起研究

  2. laycher

    思路很有意思,token是否会有过期的时候?
    我觉得还是模拟微信登陆,然后获取cookies好一点?

    1. mokeyjay

      暂时没发现会过期,我换手机购物后推送也正常。至于模拟微信登陆?这个暂时没有思路

  3. NNVCB

    小伙子,明天来猩便利报道

  4. liwanglin12

    推送页应该做成 Steam 那样的,比较有吸引力。 :-)

    1. mokeyjay

      我也想过,可Server酱不支持html,好气噢

  5. Ice-Hazymoon

    我们学校才放了两台,今天就看到这篇文章,好实用啊2333