Selenium+Chrome实现一个投票工具

前几天有朋友要参加一个投票,想要刷票一开始我是拒绝的,因为要是在微信的话那就只好去找刷手了,他说投票是在一个app中进行的,我一听:哦?有戏!那我们下下来看一看发现app的逻辑做的很不友好,不用登陆就可以投票,那他是怎么做的限制呢?

第一次尝试:
用chrome抓一下他的post包得到:

POST /*****/******/vote.jsp HTTP/1.1 UserNo=101&UserNo=103&UserNo=104&ServiceId=sjds2020&groupname=1&act=do&openid=&openidMd5=

关注到有openid和openidMd5,首先考虑的是在APP内有一个生成openid的函数,那么在手机端执行一次APP数据清理,打开惊奇的发现又可以投票了,那说明openid和IMEI也不挂钩,那么有没有可能是把openid的相关函数嵌入在webview里呢?分析了一下页面的js很遗憾的是没有,也就是说openidMd5的算法是在APP里面的

那么下面就得开始第二次尝试了:我们要把重心放在如何解开这个APP,这APP在安卓下用了加固保,两个办法闲鱼大法或者下他的IPA,当然我选择第一种:在源码里我发现

OutUrlActivity.this.n = n.a(OutUrlActivity.this.o + "xxxKey123");

那么问题就迎刃而解了:

第二次尝试:
首先构造一个openid,九位数,随机生成九位数
1
2
3
4
5
6
7
8
9
  	def id():
j = 9
id = []
id = ''.join(str(i) for i in random.sample(range(0,9),j)) # sample(seq, n) 从序列seq中选择n个随机且独立的元素;
return id
def gen():
openid = id()
openidMd5 = openid+'xxxKey123'
openidMd5 = hashlib.new('md5', openidMd5.encode("utf-8")).hexdigest()

然后就可以构造post了,但是遇到了一个问题,我默认post的是json一直提示外部投票,当时也没有仔细研究后来发现他的post是raw格式

payload=’UserNo=’+str(user)+’&ServiceId=sjds2020&groupname=’+str(group)+’&act=do&openid=’+openid+’&openidMd5=’+openidMd5

第二次没法发现这个细节于是迫不得已转向了selenium,
不得不说selenium真是一个有利的武器,尤其是结合了jquery那真的太无敌了

1
2
3
4
5
6
7
8
var liarray=$('li');//因为投票的人物都在li标签里,所以获取一下全部的li元素
var num = 0;//找到目标id在标签里的排序
for(var i = 0; i < liarray.length; i++){
if(liarray[i].innerText.indexOf("+str(user)+")>=0){//如果包含则记录num
num = i;
}
}
$(liarray[num]).find('input').click();//找到li元素下面的input点击

将这段结合selenium:
driver.execute_script(js)这样就搞定了一次投票,后来发现效率太低,那得改改策略:
于是发现了raw格式的post,成功进行冲票

不得不说这种投票确实很无聊天天靠刷票,要不是利益相关谁能保证给你投票呢?

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信