最多就只能做到这里了,不想再搞了,下面是代码
# 以前的支线任务搞完了,直接一次干完知乎的验证码 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轴抖动。
还有一个简短点
但是只要有加速度变化的,我就看不懂了,别人的复制上去也跑不动。