Contents
  1. 1. 运行效果
  2. 2. 0x01 Selenium
  3. 3. 0x02 安装驱动
  4. 4. 0x03 打开目标网站
  5. 5. 0x04 分析url
  6. 6. 0x05自动化操作
  7. 7. 0x06姓名和留言
  8. 8. 0x07 翻页功能实现
  9. 9. 0x08完整代码
  10. 10. 0x09致谢

首先吐槽下学校,在学校带个信息安全社团,社团联合会那边经常很多形式主义的活动,没有实际意义,但是还得必须做,其中尤其这个会长测评,很是麻烦,于是写了个自动化工具,就是效率低点,不过挺实用的

运行效果

images

0x01 Selenium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样
多用于自动化测试

安装 Selenium模块
命令提示符下输入:

1
pip install selenium

0x02 安装驱动

这里我使用的是Chrome浏览器

驱动下载地址:
https://chromedriver.storage.googleapis.com/index.html?path=2.26/

将解压后的chromedriver.exe放到chrome浏览器的安装目录下。
image

这里要注意,一定要驱动和浏览器版本对应

将Chrome浏览器安装路径添加环境变量

测试是否配置成功
运行以下代码

1
2
3
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

如图所示,可以正常启动说明配置成功

images

0x03 打开目标网站

投票系统为问卷网系统,并且设置了只能在微信中打开,通过检测user-agent头的方式来实现,所以要将chrome浏览器的user-agent头设置成微信的

1
2
3
4
5
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('User-Agent="Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255"')
drive = webdriver.Chrome(chrome_options=options)

这样就可以打开网站了

0x04 分析url

1
https://www.wenjuan.in/s/nquiae/?openid=obncMj4OuQkDB9zsyY_nDEQnydOo&token=4_yKkaVVGiOQp525vOfDug_q9Gu4OigqoykF0_VAQ4_PPZkWmlTNk9CooYJV-VAJbsvorvcxkRRxGPp6abTDZFXcw2c4wKWFOCGhsS-0LGc00&bookid=default

经过不断的尝试可以发现

1
https://www.wenjuan.in/s/nquiae/

中的nquiae表示不同的问卷,每个社团的都不一样

1
?openid=obncMj4OuQkDB9zsyY_nDEQnydOo&token=4_yKkaVVGiOQp525vOfDug_q9Gu4OigqoykF0_VAQ4_PPZkWmlTNk9CooYJV-VAJbsvorvcxkRRxGPp6abTDZFXcw2c4wKWFOCGhsS-0LGc00

中的openidtocken可能代表每个填写答卷的用户id
分析发现openid参数的数值以obncMj开头的,长度为28的随机字符(也许是加密后的,我们这里用随机字符来模拟),tocken是以4_开头的长度为109的随机字符(也许是加密后的,我们这里用随机字符来模拟)

构造randome函数来模拟(
random.sample会从字符串中随机取出指定长度的字符)

1
2
3
4
5
6
def randoms():
seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'
randomlist = []
randomlist.append('obncMj'+''.join(random.sample(seq,22)))
randomlist.append('4_' + ''.join(random.sample(seq,107)))
return randomlist

mian调用

1
url = 'https://www.wenjuan.in/s/eqe6Bn/?openid='+randoms()[0]+'&token='+randoms()[1]+'&bookid=default'

0x05自动化操作

利用selenium模块,来模拟人进行投票操作

首先分析页面元素

  • 两个文本框
  • 若干个单选按钮
  • 一个提交按钮
1
2
3
find_element_by_xpath() 来进行定位元素位置
send_keys(name) 来进行填写文本框内容
click() 来进行模拟点击操作,用来选择单选按钮和提交

xpath路径查找

安装火狐浏览器中的firebug和firepath插件
成功后,按F12
选中元素即可看到其XPATH路径
images

0x06姓名和留言

会长测评需要提交姓名和留言,姓名使用社团内的同学名字或者学校内的同学名字,留言在自己搜即可

创建user.py来实现功能,由主程序直接调用,每调用一次返回一条姓名和留言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding=utf-8
import random
s = """
张三
...
"""
text = """
评论1
评论2
评论3
评论4
"""
def name():
name = s.split('\n')
number = int(random.uniform(0,len(name)))
return name[number]

def advice():
name = text.split('\n')
number = int(random.uniform(0,len(name)))
return name[number]

调用

1
2
3
import user
user.name() 返回姓名
user.advice() 返回留言

0x07 翻页功能实现

经过之前的研究初步可以写出实现功能的代码,但是老是有报错,刚开始以为是页面未全部加载完,加入更多的等待时间后发现还是报错,最后发现,selenium寻找元素只能是在当前页内,对于下一页的元素即使设置好了xpath路径后也是不能够定位到,所以最后利用js做了一个翻页功能

1
2
js = "var q=document.documentElement.scrollTop=555"
drive.execute_script(js)

至此,程序已经完全实现

0x08完整代码

script.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# coding=utf-8
from selenium import webdriver
import random,time
import user

def request_url(url):
options = webdriver.ChromeOptions()
options.add_argument('User-Agent="Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255"')
drive=webdriver.Chrome(chrome_options=options)
drive.get(url)
try:
post_from(drive)
except:
drive.close()
return 'a'

def post_from(drive):
name = user.name().decode('utf-8')
advise = user.advice().decode('utf-8')
drive.find_element_by_id('5ab113d992beb51853e24996').send_keys(name)
time.sleep(3)
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e2498b']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e2498c']/div[2]/ul/li[1]/div/span").click()
js = "var q=document.documentElement.scrollTop=555"
drive.execute_script(js)
drive.find_element_by_xpath(".//*[@id='question_6ab113d992beb51853e2498d']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e2498e']/div[2]/ul/li[1]/div/span").click()
js = "var q=document.documentElement.scrollTop=1055"
drive.execute_script(js)
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e2498e']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e2498f']/div[2]/ul/li[1]/div/span").click()
js = "var q=document.documentElement.scrollTop=1555"
drive.execute_script(js)
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e24990']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e24991']/div[2]/ul/li[1]/div/span").click()
js = "var q=document.documentElement.scrollTop=2000"
drive.execute_script(js)
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e24992']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e24993']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_xpath(".//*[@id='question_5ab113d992beb51853e24994']/div[2]/ul/li[1]/div/span").click()
drive.find_element_by_id('5ab113da92beb51853e249c9').send_keys(advise)
drive.find_element_by_xpath(".//*[@id='next_button']").click()
time.sleep(3)
drive.close()

def randoms():
seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'
randomlist = []
randomlist.append('obncMj'+''.join(random.sample(seq,22)))
randomlist.append('4_' + ''.join(random.sample(seq,107)))
return randomlist
if __name__ == "__main__":
i = 0
while(i<20):
url = 'https://www.wenjuan.in/s/eqe6Bn/?openid='+randoms()[0]+'&token='+randoms()[1]+'&bookid=default'
if not request_url(url):
i=i+1
print '成功做完第%d份测评问卷'%i
else:
continue
print '结束'

user.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding=utf-8
import random
s = """
张三
...
"""
text = """
评论1
评论2
评论3
评论4
"""
def name():
name = s.split('\n')
number = int(random.uniform(0,len(name)))
return name[number]

def advice():
name = text.split('\n')
number = int(random.uniform(0,len(name)))
return name[number]

0x09致谢

1
2
3
4
寻找xpath
https://blog.csdn.net/qiyueqinglian/article/details/49280221
Selenium-Python 中文文档
http://selenium-python-zh.readthedocs.io/en/latest/index.html
Contents
  1. 1. 运行效果
  2. 2. 0x01 Selenium
  3. 3. 0x02 安装驱动
  4. 4. 0x03 打开目标网站
  5. 5. 0x04 分析url
  6. 6. 0x05自动化操作
  7. 7. 0x06姓名和留言
  8. 8. 0x07 翻页功能实现
  9. 9. 0x08完整代码
  10. 10. 0x09致谢