使用selenium模拟登录解决滑块验证问题

news2024/11/27 3:37:42

目录

1.登录入口

2.点击“账号密码登录”

3.输入账号、密码并点击登录

4.滑块验证过程

5.小结


本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟请求,需要的参数太多了,找的心累。不过好在TX的滑块验证是他们自己开发的,没有极验那么复杂,当然相反的,想要模拟就得自己去一点点探索了,毕竟对极验滑块的破解,网上已经可以找到现成的代码来用了。下面说一下模拟的实现过程和我遇见的问题。

1.登录入口

我是通过来当做登录入口的

部分代码实现:

1

2

3

driver = webdriver.Chrome()

  

driver.get(url)

2.点击“账号密码登录”

selenium可以实现对网页元素的定位,我这里是通过id属性来定位“帐号密码登录”按钮的。这里需要注意的是,有时候可能会因为网络不好等问题导致加载登录入口页会很慢,所以在点击“帐号密码登录”按钮前,需要做一个判断:判断代表“帐号密码登录”的HTML元素是否已经加载完成。

“账号密码登录”按钮的id属性截图:

部分代码实现

1

2

3

4

5

6

element = WebDriverWait(driver, 50.5).until(

  

EC.presence_of_element_located((By.ID"switcher_plogin")))

 <br># from selenium.webdriver.common.by import By

  

element.click()

  

3.输入账号、密码并点击登录

这一步比较简单,直接上代码:

1

2

3

4

5

driver.find_element_by_id('u').send_keys('123456'# 输入用户名

  

driver.find_element_by_id('p').send_keys('ccccc'# 输入密码

  

driver.find_element_by_id('login_button').click() # 点击登录

  

4.滑块验证过程

1)简要说明

因为主要目的就是为了模拟滑块验证,所以在输入用户名和密码的时候直接选择输入“123456”和“ccccc”,这样就必然会跳到滑块验证的页面:

接下来的问题就是如何模拟滑动的过程。这里首先要说一下,经过多次测试发现,TX的滑块验证每次需要拖动的距离是有一定范围的,“缺口”部分的位置基本上都在靠右侧的一面,不像极验的滑块验证,“缺口”部分可能出现在任意的位置,这样在实现“滑动”过程前,就必须判断每次滑动的距离是多少,具体可以看看学习一下大神们都是如何实现极验滑块验证的。所以,对于TX的滑块验证,只要设置一个大概的距离“模拟滑动”即可,失败的时候可以通过增减移动距离进行重试,后面会进一步说明。

2)为什么找不到“蓝色滑块”

前面已经点击了“登录”并跳转到“安全验证”的页面,接着就是去模拟“拖动”截图中的“蓝色滑块”,所以首先要告诉driver,代表“蓝色滑块”的html元素是什么。代表“蓝色滑块”的html元素截图:

通过上面的截图可以知道,id值为"tcaptcha_drag_button"的div标签代表的就是“蓝色滑块”,所以最开始我是直接尝试去拖动它,但是这时候发现报错了,部分截图如下:

报错的原因很明显,在当前得到的所有html元素中,找不到id值为"tcaptcha_drag_button"的div标签。这是为什么?

3)切换frame

为什么出现上面的问题?通过查找相关的资料才知道,在跳转到“安全验证”的页面的时候,“进入”了一个新的frame,可以理解为,在“登录页面”嵌套了一个“验证页面”,而当前的driver加载的html元素全部都是“登录页面”的,想要找到并拖动“蓝色滑块”,就要先切换到“验证页面”,这里通过driver.switch_to方法实现:

1

2

3

iframe = driver.find_element_by_xpath('//iframe'# 找到“嵌套”的iframe

  

driver.switch_to.frame(iframe)     # 切换到iframe

4)模拟拖动

切换到iframe之后,就可以通过driver.find_element_by_id('tcaptcha_drag_button')找到“蓝色滑块”并拖动它了。拖动操作会用到selenium.webdriver的ActionChains类,部分代码如下:

1

2

3

4

5

6

7

8

9

button = driver.find_element_by_id('tcaptcha_drag_button')    # 找到“蓝色滑块”

  

action = ActionChains(driver)            # 实例化一个action对象

  

action.click_and_hold(button).perform()  # perform()用来执行ActionChains中存储的行为

  

action.reset_actions()

  

action.move_by_offset(1800).perform()  # 移动滑块

  

5)构造移动轨迹

为了使拖动过程模拟的更“真实”,可以构造一个滑动轨迹,我这里也是参考了别人的代码看这里,简单实现了一下,实际上TX新闻的滑块验证对这方面好像要求不是很严格:

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

def get_track(distance):

  

track = []

  

current = 0

  

mid = distance * 3 / 4

  

= 0.2

  

= 0

  

while current < distance:

  

if current < mid:

  

= 2

  

else:

  

= -3

  

v0 = v

  

= v0 + * t

  

move = v0 * + 1 / 2 * * * t

  

current += move

  

track.append(round(move))

  

return track

  

6)如何确定已经“验证成功”了

接下来的问题就是,我如何告诉程序,已经“验证成功”了呢?经过测试发现,当拖动滑块完成拼图“验证成功”后,网页又从“安全验证”的页面又跳回了“登录页面”,滑动前截图:

滑动验证成功的截图:

成功后跳转回“登录”页面:

通过上面的截图我们可以知道,在“验证通过”之前,在“安全验证”页面我们一直可以看到“拖动下方滑块完成拼图”的文字提示,也就是说,如果验证没有通过,那么在当前的所有html元素中,我们是可以找到文本为“拖动下方滑块完成拼图”的标签的:

通过截图可以知道,该标签的class为"tcaptcha-title",通过driver.find_element_by_class_name('tcaptcha-title').text来判断验证是否成功。

7)重试

前面说了,我们可以通过提前设置一个“可能的”值当初始距离来移动滑块,如果移动的距离“过长”,就减小该值当做下次移动的距离,所以可以加一个while循环。以上过程实现的完整代码如下:

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

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

# encoding=utf8

  

  

  

from time import sleep

  

from selenium import webdriver

  

from selenium.webdriver import ActionChains

  

from selenium.webdriver.common.by import By

  

from selenium.webdriver.support import expected_conditions as EC

  

from selenium.webdriver.support.wait import WebDriverWait

  

  

  

url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?&low_login=0&appid=636014201&target=self&border_radius=1&maskOpacity=40&s_url=http%3A//www.qq.com/qq2012/loginSuccess.htm'

  

  

  

def get_track(distance):

  

track = []

  

current = 0

  

mid = distance * 3 / 4

  

= 0.2

  

= 0

  

while current < distance:

  

if current < mid:

  

= 2

  

else:

  

= -3

  

v0 = v

  

= v0 + * t

  

move = v0 * + 1 / 2 * * * t

  

current += move

  

track.append(round(move))

  

return track

  

  

  

def main():

  

driver = webdriver.Chrome()

  

driver.set_window_position(90010)

  

driver.get(url)

  

# 检测id为"switcher_plogin"的元素是否加在DOM树中,如果出现了才能正常向下执行

  

element = WebDriverWait(driver, 50.5).until(

  

EC.presence_of_element_located((By.ID"switcher_plogin"))

  

)

  

element.click()

  

  

  

sleep(1)

  

# 输入用户名和密码

  

driver.find_element_by_id('u').clear()

  

driver.find_element_by_id('u').send_keys('123456')

  

driver.find_element_by_id('p').clear()

  

driver.find_element_by_id('p').send_keys('ccccc')

  

sleep(1)

  

# 点击登录

  

driver.find_element_by_id('login_button').click()

  

  

  

sleep(5)

  

  

  

# 切换iframe

  

try:

  

iframe = driver.find_element_by_xpath('//iframe')

  

except Exception as e:

  

print 'get iframe failed: ', e

  

sleep(2# 等待资源加载

  

driver.switch_to.frame(iframe)

  

  

  

# 等待图片加载出来

  

WebDriverWait(driver, 50.5).until(

  

EC.presence_of_element_located((By.ID"tcaptcha_drag_button"))

  

)

  

try:

  

button = driver.find_element_by_id('tcaptcha_drag_button')

  

except Exception as e:

  

print 'get button failed: ', e

  

  

  

sleep(1)

  

# 开始拖动 perform()用来执行ActionChains中存储的行为

  

flag = 0

  

distance = 195

  

offset = 5

  

times = 0

  

while 1:

  

action = ActionChains(driver)

  

action.click_and_hold(button).perform()

  

action.reset_actions() # 清除之前的action

  

print distance

  

track = get_track(distance)

  

for in track:

  

action.move_by_offset(xoffset=i, yoffset=0).perform()

  

action.reset_actions()

  

sleep(0.5)

  

action.release().perform()

  

sleep(5)

  

  

  

# 判断某元素是否被加载到DOM树里,并不代表该元素一定可见

  

try:

  

alert = driver.find_element_by_class_name('tcaptcha-title').text

  

except Exception as e:

  

print 'get alert error: %s' % e

  

alert = ''

  

if alert:

  

print u'滑块位移需要调整: %s' % alert

  

distance -= offset

  

times += 1

  

sleep(5)

  

else:

  

print '滑块验证通过'

  

flag = 1

  

driver.switch_to.parent_frame()    # 验证成功后跳回最外层页面

  

break

  

  

  

sleep(2)

  

driver.quit()

  

print "finish~~"

  

return flag

  

  

  

if __name__ == '__main__':

  

main()

  

5.小结

其实上面的代码还可以进一步“优化”。例如,当尝试三次滑动后如果仍然没有“验证成功”,就应该主动跳回“登录”页面,重新输入账号密码登录,进入下一次验证过程,而不是无休止的进行“滑块验证”。除此之外,以上只是对“滑块验证”部分进行了分析和模拟,实际情况是,通过了“滑块验证”后,有可能账号或密码错误了,这时候是不是应该重新输入账号密码进入新一轮验证过程呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给大家演示 InsCode Stable Diffusion 美图活动一期

给大家演示 使用 InsCode Stable Diffusion 今天有点无聊&#xff0c;难得领导出差的出差&#xff0c;请假的请假&#xff0c;开会的开会。 心想&#xff0c;此时不摸鱼更待何时。 下面给大家随便验收一番Diffusion &#xff0c;在这之前也使用了很多&#xff0c;讲真&#xf…

谈谈VPN是什么、类型、使用场景、工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解VPN是什么、以及它的类型、使用场景、工作原理。 目录 一、VPN是什么&#xff1f; 二、VPN的类型 1、站点对站点VPN 2、…

单片机第一季:零基础6——定时器和计时器

目录 1&#xff0c;单片机定时器原理 2&#xff0c;51单片机定时器/计数器结构 3&#xff0c;定时器配置 4&#xff0c;示例代码-通过定时器控制LED灯间隔1s闪烁 51 单片机有两组定时器/计数器&#xff0c;因为既可以定时&#xff0c;又可以计数&#xff0c;故称之为定时…

【R语言】机器学习-手撕逻辑回归

【R语言】机器学习-手撕逻辑回归 算法原理 逻辑回归是一种常用的分类算法&#xff0c;它在机器学习领域有着广泛的应用。在介绍具体的实现细节之前&#xff0c;我们先来了解一下逻辑回归的算法原理。 sigmoid函数 逻辑回归使用sigmoid函数&#xff08;也称为逻辑函数&#…

《TCP IP网络编程》第四章

第 4 章 基于 TCP 的服务端/客户端&#xff08;1&#xff09; 根据数据传输方式的不同&#xff0c;基于网络协议的套接字一般分为 TCP 套接字和 UDP 套接字。因为 TCP 套接字是面向连接的&#xff0c;因此又被称为基于流&#xff08;stream&#xff09;的套接字。 TCP …

烧屏现象对OLED屏幕质量的影响:如何保持画面清晰度?

OLED&#xff08;Organic Light Emitting Diode&#xff09;屏幕作为一种高品质、高对比度和鲜艳色彩的显示技术&#xff0c;越来越受到消费者的青睐。然而&#xff0c;一些用户可能会担心OLED屏幕烧屏的问题。本文将探讨OLED屏幕烧屏的原因、如何预防烧屏以及如何进行正确的维…

一个完整的项目是怎么做性能测试?资深8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 突然有一天&#…

解决问题:解除HUE下载10万行的限制

解决问题&#xff1a;解除HUE下载10万行的限制 这个目录下的 vim /opt/cloudera/parcels/CDH/lib/hue/apps/beeswax/src/beeswax/conf.py可以调整数量 也可以更改为-1&#xff08;表示不限制&#xff09;

有测试媛的IT团队,产品质量更高

我们都知道&#xff0c;在绝大部分技术团队中&#xff0c;往往阳盛阴衰。而测试团队&#xff0c;可能情况要好一些&#xff0c;据部分机构调查来看男女比例在3:2左右。 根据过往经验来看&#xff0c;有测试媛的IT团队&#xff0c;往往软件质量能更好的得到保证&#xff08;强调…

【单片机】MSP430F5529单片机的Flash读写控制,MSP430 flash 读写

文章目录 内存模型程序 内存模型 https://qq742971636.blog.csdn.net/article/details/108892807 单片机的Flash里面的区域不是全都能写的&#xff1a;https://blog.csdn.net/u014470361/article/details/79297601 找一下手册看看MSP430F5529单片机哪些地址区域能写&#xf…

nginx常用命令以及安装

目录 前言&#xff1a; 安装&#xff1a; 常用命令&#xff1a; 前言&#xff1a; Nginx的设计理念是高性能、稳定性、开放性和易用性。它的并发能力优秀&#xff0c;可以处理数万个并发连接&#xff0c;并且占用较少的资源。此外&#xff0c;Nginx支持热部署&#xff0c;即…

如何将企业联系方式API接口应用于你的移动端APP?

在现代商业世界中&#xff0c;企业需要提供一种快速&#xff0c;高效的方式来让用户获取联系方式。因此&#xff0c;企业联系方式API接口应运而生&#xff0c;它是一种提供了企业联系方式的开放接口&#xff0c;在用户调用时&#xff0c;可以实现即时获取企业的联系方式信息。本…

python-计算两个矩阵的相似度。

余弦相似度 在pytorch中&#xff0c;有一个专门的函数用于计算相似度&#xff1a;torch.cosine_similarity() https://pytorch.org/docs/stable/nn.functional.html#cosine-similarity import torch import torch.nn.functional as F input1 torch.randn(100, 128) input2 t…

【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类

前情提要&#xff1a; 【2023&#xff0c;学点儿新Java-31】测试&#xff1a;整型和浮点型变量的使用 | 附&#xff1a;计算机存储单位&#xff08;转换关系&#xff09;| 企业真题&#xff1a;为什么0.10.2不等于0.3【2023&#xff0c;学点儿新Java-30】变量的基本使用&#…

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实…

安全不“放假”,VR安全教育等你沉浸式体验

暑期开启&#xff0c;孩子们将迎来一段丰富且快乐的时光&#xff0c;暑假虽快乐&#xff0c;但是安全不能“放假”&#xff0c;许多地方开展形式多样的暑假安全宣传活动&#xff0c;想不想沉浸式体验下VR安全教育宣传呢&#xff1f;通过VR演示&#xff0c;身临其境的了解防溺水…

MySQL-概述-数据模型SQL简介

数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库数据库管理系统&#xff1a;DataBase Management System&#xff08;DBMS&#xff09;&#xff0c;操作和管理数据库的大型软件。SQL&#xff1a;Structured Query Language&#xff0…

「提高你的CSS技能」:15个重要的CSS属性详解

这篇文章介绍了15个重要的CSS属性&#xff0c;旨在提高读者的CSS知识和技能。文章以清晰的方式解释了每个属性的作用和用法&#xff0c;并提供了相应的示例代码。通过这篇文章&#xff0c;读者可以了解到一些有趣且实用的CSS属性。 1:in-range 和:out-of-range 伪类 CSS的:in…

KafKa 3.x(三、Eagle、Kraft、压测调优,源码解析)

6. Kafka-Eagle监控 Kafka-Eagle框架用于监控Kafka集群运行状况。官网https://kafka-eagle.org 6.1 Mysql 前置mysql。 6.2 Kafka环境 关闭集群 kf.sn stop修改vim /bin/kafka-server-start.sh 并同步到其他节点 if [ "x$KAFKA_HEAP_OPTS" "x" ]; t…

vue使用html2canvas实现一键截图并赋值到剪贴板,只截取当前显示器上可视的内容

使用html2canvas 和 clipboard API实现整页截图并填充至剪切板。 访问剪切板的api只支持在https或者本地localhost上使用&#xff0c;如果是http&#xff0c;则无法使用 首先需要从npm安装html2canvas npm install html2canvas然后在代码中导入这个包&#xff1a; import ht…