刷票平台
当前位置: > 刷票平台微信刷票Python脚本教程
在这个阶段,在微信朋友圈里举行的投票活动是无止境的,我相信很多学生都为此感到困扰,因为总会有个人(亲戚,朋友或其他)不时要求你帮助TA投票。本文不打算从道德或情感层面探讨这个问题。我感兴趣的是,目前大多数投票活动实际上都是明显的漏洞,“刷票”可以通过简单的技术手段实现。
一、探查敌情
第一步是弄清楚具体的投票过程和可能的限制。
经过研究,总结如下:
投票需要登录
注册帐户需要验证电子邮件地址
登录不需要验证码
每个账户每天可以投票一次,投票数可以选择,从0到10
投票不需要验证码
请注意红字,是的,这是最关键的地方。
二、工欲利其事
这语言必须是我喜欢的Python。
在工具的情况下,我实际上之前做过模拟登录。简单地说,我使用了一个模拟浏览器的Python插件,然后执行各种模拟用户操作,例如单击按钮并输入信息。
2,但这种类型的插件有两个主要问题:
很小的无头
基本上,HTML页面的操作只能应用于表单。
什么是无头的它可以简单地理解为后台操作。如果你不能做无头,你仍然需要在运行时打开浏览器,但脚本将操作浏览器。
所以我们可以看到,如果你不能做无头,它看起来不是很低端(想象一下电脑屏幕上的浏览器,然后自动输入东西,你只能坐在任何东西上,什么也做不了) ,并且使用起来非常不方便,例如没有图形界面的系统。
4,什么只能应用于表单,我们采取jQuery来比较它。 jQuery可以从HTML中出现的所有内容中进行选择,但只应用于表单意味着您只能操作表单,而您无法对其他元素做任何事情。我不知道为什么会这样。可能是对底层插件有一些限制。无论如何,大多数插件只能操纵表单。
三、给大家提供三个方案以供参考吧:
Ghost.py支持无头并且可以操纵所有元素,甚至运行js,你知道它有多强大。唯一的缺点是依靠PyQt或PySide,你知道这两个项目,你会折磨死者。因此,如果您不想折腾,请不要再使用它。
Splinter 半支持无头 splinter默认不支持headless,但在使用zope插件的前提下可以无头,因为我使用默认,所以如何做无头没有研究,有兴趣自己动手做我们开始做吧。但是,估计80%不强。 。 。 Splinter也非常强大,可以处理所有元素。
Mechanize 支持无头但只能操作形式
四、Just Do It
重复我们的想法:
登录投票
因为我决定采用无头解决方案,所以我使用机械化。
如果您登录,则没有问题。登录框最初是一个表单。投票。 。 。先走吧!我们首先登录。
直接在代码上:
复制代码
#coding: utf-8
导入cookielib
导入机械化
导入urllib
Br=mechanize.Browser()
Cj=cookielib.LWPCookieJar()
Br.set_cookiejar(CJ)
Br.open('http://k4w.cn/user/index.html')
Br.select_form(NR=0)
Br.form ['mail']='xxxx@xxx.com'
Br.form ['password']='xxxxxxx'
Br.submit()
复制代码
Cookielib用于操纵cookie。因为我们需要在登录后跳转到投票页面,如果我们不保留cookie,那么网站会将我们视为未登录别忘了,你正在使用代码来模拟登录,所以不要以为他会自动给你保存cookie。
代码很简单,我不解释。简而言之,打开页面输入用户名和密码提交
您可以输出结果以查看:
.....同上......
Response=br.submit()
打印response.read()
我们可以看到输出HTML的单词“xxx,welcome you”,表示您已成功登录。
这是的重点。如何投票。
首先指定投票操作:
从下拉列表中选择“10”,然后单击“确定”。
我们已经知道机械化只能操纵形式,它对其他元素无能为力,所以我们无法直接模拟人类操作。
那该怎么办
让我们先考虑5秒 。 。 。 。 。 。 。 。
好的,我知道你拒绝了。
那个时候我想了很久! ! !
我们可以改变主意,投票,表面上是人工操作,但发送到服务器的最终消息实际上是一个POST请求!所以,我们可以跳过模拟并直接发送请求!
好的,这是一个明确的想法。让我们从开始吧我们POST什么
投票,告诉服务器我们投了票。
但代码是一个非常严格的事情,如果格式错误,服务器无法识别它!
好的,这次不要考虑,直接告诉你答案。
我们先投票一次,然后查看POST请求中的数据格式。
我用firebug,打开firebug,然后选择投票数,按OK按钮,你可以在firebug中看到这个POST请求的具体信息。
我们可以打开信息,您可以看到数据的格式:
Z_data: 10
Id: 99
希德: 78
现在我可以看到它!
Z_data是投票数,id是项目编号,sid。 。 。好的,我不知道这是什么。简而言之,写78.
获取数据格式,让我们回到代码并模拟POST请求:
参数={'z_data':'10',
'id':'99',
'sid':'78'
} # POST数据
Data=urllib.urlencode(参数)
响应=br.open('http://k4w.cn/zone/z_num.html',数据)
非常简单
别忘了导入urllib!
好的,让我们试验前面的代码并看看效果。
发现的投票数确实增加了,我们的方法是可行的。
然后,让我们改变它,添加一个for循环,这样我们就可以自动登录所有用户并根据我们设置的用户名和密码进行投票。
基本功能是这样的,但在使用它几天后,我发现了一个不好的地方:如果我想在投票后检查投票,我必须手动打开页面。如果你能直接显示当前的票数,就好了!
所以我们继续这个旅程。
五、微信刷票Python脚本教程迭代好吃吗
首先,这个想法是:
打开项目页面获得投票数显示
打开我们已经拥有的页面,br.open()将会这样做。显示也很简单,打印。那你怎么得票呢
介绍一种新工具 BeautifulSoup,汤!
我承认名字有点。 。 。 。
无论如何,继续我们的编程路径。
汤是一个解析HTML的插件,并被介绍。
我们可以用汤解析获得的HTML,然后找到与我们需要的票数相对应的元素,我们就可以得到票数。
这很简单!我们将HTML放入汤中。 。 。 。
我怎么能弄错
谷歌很长一段时间,原来HTML中有不规则的标签,分析失败了。
微软的网页最初并不符合标准。 。 。
好的,我无法解决,我该怎么办
有人给出了一个解决方案:使用lxml。
什么是lxml Lxml是一个用于解析xml的插件,但它可以解析HTML和注意力,并忽略不受管制的标记。
它恰好是我们需要的!
好的,使用官方文档〜
亮代码:
Br=mechanize.Browser()
Response=br.open('http://k4w.cn/level_search/1/78/0/0/0.html')
Page=etree.HTML(response.read()。lower()。decode('utf-8'))
Hrefs=page.xpath(uquot; //span [@ class='number n_99']quot;)
打印“当前投票:” + hrefs [0] .text
还是很简单,不解释,看看吧。
好的,所以我们整个刷票脚本已经完成了~~
拍下所有代码的照片
复制代码
#coding: utf-8
导入cookielib
导入机械化
导入urllib
来自lxml import etree
All_data=[['username1','password1'],['username2','password2']]
对于all_data:中的i
br=mechanize.Browser()
cj=cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.open('http://k4w.cn/user/index.html')
br.select_form(nr=0)
br.form ['mail']=i [0]
br.form ['password']=i [1]
br.submit()
response=br.open('http://k4w.cn/level_search/1/78/0/0/0.html')
parameters={'z_data':'10',
'id':'99',
'sid':'78'
} # POST数据
data=urllib.urlencode(参数)
response=br.open('http://k4w.cn/zone/z_num.html',数据)
printquot;%s已成功投票! %i [0]
Br=mechanize.Browser()
Response=br.open('http://k4w.cn/level_search/1/78/0/0/0.html')
Page=etree.HTML(response.read()。lower()。decode('utf-8'))
Hrefs=page.xpath(uquot; //span [@ class='number n_99']quot;)
打印“当前投票:” + hrefs [0] .text
复制代码
把它做完。
六、总结
我们用了:
Mechanize 模拟用户操作 模拟POST请求
Firebug 获取POST数据格式
Lxml 解析HTML内容
我们实现了:自动登录,自动投票,输出投票
好的,只需将此脚本放在服务器上并将其设置为每天运行。
美发网上商店(以下简称S商城)在微信平台上举行网上投票活动。微信用户可以通过活动链接访问投票页面,对喜爱的美发工作进行投票;每个微信账号每天只能提供。对单个作品进行单一投票。
投票活动页面如下所示:
漏洞分析
从表面上看,S Mall已经对投票活动进行了反作弊,因为它限制了每个微信用户每天只有一票。如果用户通常通过微信投票来访问该投票服务,那么它确实可以达到预期的效果。
但是,如果您查看投票页面的原始地址,只需按住页面并向下拖动,您会发现屏幕顶部显示为“此页面由XXX提供”,应注意“XXX”不在这里“ Mp.weixin.qq.com“,但是S Mall的域名。换句话说,投票程序在S Mall的服务器上运行。
基于以上分析,可以推断出用户投票操作的网络拓扑图应如下所示:
当微信用户访问投票页面时,微信服务器只转发请求,具体的投票计数和验证在S商城的服务器上。
那么,S Mall如何区分投票用户呢
以下是微信公众平台上的OpenID概念。 OpenID的官方解释是:加密的微信号,每个用户对每个公共号码OpenID都是唯一的。
验证这一点也很容易。您只需使用多个微信帐户进行投票,并进行投票过程的网络捕获。您可以在POST中确认参数。
基于此,当微信公众平台转发投票请求时,它将在POST参数中包含用户的OpenID;在收到投票的POST请求后,S商城可以通过查询当前的OpenID是否已在同一天投票来阻止该单一。用户重复投票。
但是,它有一个很大的漏洞!
S Mall只能判断OpenID是否重复,但无法验证OpenID的有效性,因为它无法调用WeChat服务器来检查此OpenID。
VoteRobot实施
澄清此漏洞后,实现刷票非常简单。
微信用户正常执行投票操作,并在设备上执行网络数据包捕获,以在投票过程中获取HTTP层请求参数和响应内容。
使用Fiddler(或Python脚本)构建投票HTTP POST请求,保持每个参数与实际投票期间捕获的参数内容一致;
随机生成不同的OpenID参数并重复POST请求。
如果要实现批处理刷票或刷票自动化,可以通过Python脚本实现刷票请求;甚至LoadRunner也没关系。
运行VoteRobot.py并输出日志如下:
========开始投票zpid(38),总票数: 3
1票已经投票,下一张票将在35秒后投票。
2票已经投票,下一张票将在31秒后投票。
3票已经投票,下一张票将在10秒后投票。
========投票结束!
应该注意的是,在自动化刷票时通常最好有一个随机时间间隔,最好动态模拟不同的设备,即修改User-Agent。否则,服务器可以轻松识别作弊行为。
作弊和反作弊
看到这一点,也许我的一些同学心里很开心。他们可以用这种方式投票“刷票”吗
不幸的是,当然不是。
事实上,本文中案例的漏洞非常低级。但是,目前仍有大量投票活动在使用。
判断投票活动是否可以通过这种方式被欺骗也很简单。使用本文中的方法,如果活动的URL未被正式称为微信,并且在整个投票过程中没有额外的验证,那么作弊的可能性很大;然后,通过捕获分组,使用通信交互过程。在网络请求工具修改参数和重新请求后,您可以验证是否可以实际作弊。
另外,有些人可能想问一下,网络上的投票活动能不能消除“刷票”的行为
答案是完全消除它真的很难。你听说过12306牛派吗您是否听说Apple Store Professional已应用应用列表你听说过“网络水军”和“五毛党”吗
但是,活动的组织者可以通过某种方式大大提高作弊的门槛。例如,目前有许多活动采用以下方法:
投票用户需要注意活动组织者的公开号码,然后拨打微信的官方投票功能;
要求投票用户在投票组织者的网站上注册(手机号码验证,实名验证)
无论使用哪两种方法,本文中的“刷票”方法都是完全无效的。
作弊与反作弊
看到这一点,也许我的一些同学心里很开心。他们可以用这种方式投票“刷票”吗
不幸的是,当然不是。
事实上,本文中案例的漏洞非常低级。但是,目前仍有大量投票活动在使用。
判断投票活动是否可以通过这种方式被欺骗也很简单。使用本文中的方法,如果活动的URL未被正式称为微信,并且在整个投票过程中没有额外的验证,那么作弊的可能性很大;然后,通过捕获分组,使用通信交互过程。在网络请求工具修改参数和重新请求后,您可以验证是否可以实际作弊。
另外,有些人可能想问一下,网络上的投票活动能不能消除“刷票”的行为
答案是完全消除它真的很难。你听说过12306牛派吗您是否听说Apple Store Professional已应用应用列表你听说过“网络水军”和“五毛党”吗
但是,活动的组织者可以通过某种方式大大提高作弊的门槛。例如,目前有许多活动采用以下方法:
要求投票用户注意事件组织者的公开号码,然后调用微信官方投票功能;要求投票用户在投票组织者的网站上注册(手机号码验证,实名验证),无论两种方法是哪一种,本文中的“刷票”方法完全无效。
上一篇:微信专业手册刷票如何运作