关于知乎滑动验证码我是怎么投降的

最多就只能做到这里了,不想再搞了,下面是代码

# 以前的支线任务搞完了,直接一次干完知乎的验证码
import time
import cv2
import requests
from selenium import  webdriver
from selenium.webdriver.common.by import  By
from selenium.webdriver.support.ui import  WebDriverWait
from selenium.webdriver.support import  expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import random
driver=webdriver.Chrome()
url='https://www.zhihu.com/signin?next=%2F'
driver.get(url)
WebDriverWait(driver,10,0.8)
driver.find_element(By.CSS_SELECTOR,'#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-tabs > div:nth-child(2)').click()
# element = WebDriverWait(driver, 10).until(
#     EC.visibility_of_element_located((By.ID, "myElementId"))
# )
driver.find_element(By.CSS_SELECTOR,'#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-account > div > label > input').send_keys('1572848175')
driver.find_element(By.CSS_SELECTOR,'#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-password > div > label > input').send_keys('123456789')
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,'#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > button').click()
# 获取两个图片
time.sleep(0.8)
bg_img_url=driver.find_element(By.CSS_SELECTOR,'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_bg-img').get_attribute('src')
jigsaw_url=driver.find_element(By.CSS_SELECTOR,'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_jigsaw').get_attribute('src')
print(bg_img_url,jigsaw_url)
# 然后发起请求对这两个链接
bg_img_content=requests.get(url=bg_img_url)
jigsaw_content=requests.get(url=jigsaw_url)
with open('image/zhihu_img_pack_test/bg_img_content.png',mode='wb') as f:
    f.write(bg_img_content.content)
with open('image/zhihu_img_pack_test/jigsaw_content.png',mode='wb') as f:
    f.write(jigsaw_content.content)
# 然后开始opencv部分
time.sleep(0.8)
bg_im_rpg=cv2.imread('image/zhihu_img_pack_test/bg_img_content.png')#读取大背景图
# cv2.imshow('bg_im_rpg',bg_im_rpg)
bg_img_gray=cv2.cvtColor(bg_im_rpg,cv2.COLOR_BGR2GRAY)#把大背景图灰度处理
jigsaw_rpg=cv2.imread('image/zhihu_img_pack_test/jigsaw_content.png',0)#读取小背景图
# image1=cv2.resize(jigsaw_rpg,500,500)
# cv2.imshow('jigsaw_rpg1',image1)
# print(bg_im_rpg)
# print(jigsaw_rpg)
res=cv2.matchTemplate(bg_img_gray,jigsaw_rpg,cv2.TM_CCOEFF_NORMED)#模版匹配
lo=cv2.minMaxLoc(res)#找到最大最小值
x_transverse=lo[3][0]#这是我要的x坐标
# 然后获取滑动按钮,开始移动,
slide_button=driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div/div/div[2]/div/div[2]/div[2]/span')

print(lo)
print(lo[3][0])
distance=lo[3][0]
distance=distance*(320/400)
# cv2.waitKey(-1)
# ActionChains(driver).drag_and_drop_by_offset(slide_button,x_transverse,0).perform()#动作链
def get_track(distance):
    '''
    获得移动轨迹,模仿人的滑动行为,先匀加速后匀减速匀变速运动基本公式:
    ①v=v0+at
    ②s=v0t+0.5at^2
    :param distance: 需要移动的距离
    :return: 每0.2s移动的距离
    '''
    #初速度
    v0 = 0
    #单位时间0.2s
    t = 0.2
    #轨迹列表,每个元素代表0.2s的位移
    tracks = []
    #当前的位移
    current = 0
    #达到mid开始减速
    mid = distance*5/8
    # print(mid)
    #先滑过一点,最后再反着滑动回来
    distance+=10
    while current<=distance:
        # 增加运动随机性
        t = random.randint(1,4)/10
        # print('t>>>',t)
        if current < mid:
            #加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
            a = random.randint(2,7) #加速运动
        else:
            a = -random.randint(2,6) #减速运动
        #0.2s时间的位移
        s = v0*t + 0.5*a*(t**2)
        # print('位移s>>>',s)
        #当前位置
        current+=s
        #添加到轨迹列表
        tracks.append(round(s))
        #当前速度,作为下次的初速度
        v0 = v0+a*t
        # print('v0>>>',v0)
   # #反着滑动到大概准确位置
    # for i in range(4):
    #     tracks.append(-random.randint(1,3))
    tracks.append(-random.randint(1, 3))
    print(tracks)
    return tracks



def move_slice2(distance):
    "2、牛顿运动定律模拟人工移动"
    # elem = driver.find_element_by_class_name('geetest_slider_button')
    elem=slide_button
    ActionChains(driver).click_and_hold(elem).perform()
    tracks = get_track(distance)
    for track in tracks:
        ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()
    ActionChains(driver).release(elem).perform()

# get_track(distance)
# print(get_track(100))
# move_slice2(distance)
# time.sleep(10)
# input()
action_chains = webdriver.ActionChains(driver)
action_chains.click_and_hold(slide_button)  # 鼠标左键点击但不释放
action_chains.pause(0.2)
action_chains.move_by_offset((0.3*distance), 0)
action_chains.pause(0.6)
action_chains.move_by_offset((0.3*distance), 0)
action_chains.pause(0.9)
action_chains.move_by_offset((0.4*distance), 0)
action_chains.release()
action_chains.perform()
time.sleep(3)

 第一个坑。它cv2.matchTemplate的比对结果:

(-0.2617930471897125, 0.36037442088127136, (232, 1), (145, 2))

有时候是要用这个lo[3][0]

有时候又是要用lo[2][0]

看别人博客的截图

  

还有呢,关于模拟手工移动这个别人的博客就是两个方法派别,

一个是不含加速度变化的停顿流。

 

 一个是含加速度变化的,把每步的移动距离装在tracks列表里面

 

他这个离了大谱,居然还在模拟手的y轴抖动。 

还有一个简短点

但是只要有加速度变化的,我就看不懂了,别人的复制上去也跑不动。

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值