keyDown和keyUp selenium.webdriver之间的自定义延迟

2024-06-17 15:08:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为网站制作bot,它通过比较keyUp和keyDown之间的时间来检测bot,在网站的源代码中发现了这一点。因此,当使用webdriversend_keys()键入时,所有时间都太小(1ms)/类似,我会被阻塞。每次登录网站时,我需要键入的文本都不一样

我的当前代码,使我被阻止:

import time
import random 

text = "Some text"
for l in text:
    time.sleep(random.uniform(0.12, 0.4))
    element.send_keys(l)

例如,我需要键入字母“s”,所以我确实发送了_键(“s”),根据我对selenium的理解,这个引擎盖下会产生keyDownkeyUp事件来模拟按键“s”的按下和释放。在他们之间是我需要延迟的地方,但我找不到这样做的方法。
keyUpkeyDown之间的一些随机类人延迟可能会欺骗机器人检测。请随时留下任何关于如何解决此机器人检测问题的想法。
提前感谢您的帮助:)


Tags: textimport键入源代码time网站bot时间
2条回答
import time

for i in "somestring":
    time.sleep(1)
    element.send_keys(i)

这会在每个字符之间产生1秒的延迟

这是一个相当棘手的问题。我能想到的唯一方法就是使用ActionChains,特别是keyUp和keyDown函数。在Selenium文档中,它说keyup和keydown仅用于“修改器”键(CTRLENTERSHIFT,等等)。但我认为我们也可以用它们来表示普通的字母数字字符。我浏览了大量Selenium源代码,最终发现传入send_keys()key_up()key_down()的内容被处理为KeyInput,一个在this file from the selenium python bindings中定义的类。谢天谢地,这个类似乎非常乐意接受任何密钥,所以希望我们可以继续使用key_up('a')之类的东西

那么现在,如何实现您的实际目标,在所有key_upkey_down之间有一个延迟,然后在下一次按键之前有另一个延迟。我相信你会想玩随机等待时间的范围,因为现在我只是复制了你所做的

from selenium.webdriver.common.action_chains import ActionChains
import time
import random 

text = "Some text"
for l in text:
    action = ActionChains(driver)
    action.key_down(l).pause(random.uniform(0.12, 0.4)).key_up(l).perform()
    time.sleep(random.uniform(0.12, 0.4))

相关问题 更多 >