NightFlightCaptain / WeiXinVote

:wave: 微信朋友圈投票活动刷票脚本

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

WeiXinVote

最近看到发的一个微信拉票,闲来无事研究了一下,发现这个活动是可以刷票的,简要的记录一下写刷票脚本的过程。实际上,这种爬虫代码的实现永远都是小问题的,重要的是你要知道别人的页面的逻辑,如何去分析和爬取才是难点

打开微信的投票页面,将屏幕往下拉会发现屏幕顶端显示为"本网页由XXX提供",需要注意的是,这里的"XXX"并不是"mp.weixin.qq.com",而是活动举办方的域名。也就是说,这个投票活动的程序是运行在S商城的服务器上面的。这里就涉及到微信公众平台OpenID的概念了,官方对OpenID的解释是:加密后的微信号,每个用户对每个公众号的OpenID是唯一的。也就是一个用户对一个公众号有一个唯一的OpenId。

投票的逻辑是用户在投票请求时,会在POST参数中提供用户的OpenID;S商城服务器在接收到投票的POST请求后,通过查询当前OpenID是否在4小时已经投过票,就可以阻止单一用户重复投票的行为了。

然而,这里面却存在一个很大的漏洞!

S商城只能判断OpenID是否出现了重复,但是却无法校验OpenID的有效性,因为它是无法调用微信服务器来对这个OpenID进行校验的。

那么我们只需要生成符合格式OpenId然后发送post请求就可以了。

但是一次投票也很奇怪,实际上是分两步完成的。第一次是一个get请求(图片中被打码的部分设计到隐私,只需要知道一次投票是通过两个请求来完成的就行了

在这里插入图片描述

当我看到第一个请求的名字的时候,我以为是这次请求就完成了,但当使用爬虫访问这个接口时,并不能使得票数增加。仔细观察后发现是有另外一个请求。

在这里插入图片描述

这个请求的path很奇怪,是一串乱码,而且每次不一样。只触发了第一个请求之后没有再进行其余的操作,这时我就能我就能确定,一次投票是通过第一个请求得到一些随机生成的参数,然后再第二次请求带上这些参数来保证第二次请求的合法性,这样来完成一次投票过程。所以第一个请求的页面中一定有地方调用了第二个请求。这个时候查看源代码时发现在页面中有一串这样的代码

当在页面中发现乱码的时候,往往是代码被加密了

在这里插入图片描述 其中有两个参数是第二个请求的path,可以看出这串乱码是和第二个请求有关联的,而那一串颜文字是对js代码的加密。虽然我们看不懂这串乱码是什么意思,但我们可以按分号(;)将这串乱码格式化之后直接在chrome控制台中跑,发现这串颜文字代码的效果就是执行第二个请求。(这个地方应该是可以还原代码的,有知道的可以讲解一下)

总结

到这里基本上就算做完了,剩下的就是代码实现,总的来说,就是访问第一个请求,用正则在页面中爬取参数,将参数作为第二个请求的path进行对第二个请求的访问。 当然还有ip代理,访问的随机的时间间隔,最好能动态模拟不同的设备,即修改User-Agent这些常见问题就不做说明,如果对这些有什么问题可以发邮件。

总的来说,使用python进行代码实现并没有多大的难度,难度在于一步步的分析,掌握网站的逻辑,并不断的尝试。这点只有多做才有效果

About

:wave: 微信朋友圈投票活动刷票脚本


Languages

Language:Python 100.0%