Python自动打开携程旅行并进行验证

一、识别图片验证码

1.代码实现

#验证码图片验证
import ddddocr
#打开图片
f=open('yzm.jpg',mode='rb')
img=f.read()
#实例化对象
ocr=ddddocr.DdddOcr()
result=ocr.classification(img)
print(result)

2.步骤

I 导入ddddor库

II 打开验证码图片

III 实例化ddddor对象,命名为ocr

IV 使用ocr.classification(img)识别图片上的验证码

二、识别滑动验证码&点选验证码

这里拿携程旅行官网举例

1.代码实现

"""
滑动验证
"""
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

from chaojiying import Chaojiying_Client
driver=webdriver.Edge()

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{
    "source":"""Object.defineProperty(navigator,'webdriver',{get:() => undefined})"""})

driver.get('https://passport.ctrip.com/user/reg/home')
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="agr_pop"]/div[3]/a[2]').click()
time.sleep(1)

#xpath定位
driver.find_element(By.XPATH,'//*[@id="mobilephone"]').send_keys('#这里输入自己的手机号')
time.sleep(1)


#获得滑块需要滑动的距离和定位滑块,h是滑块,l是滑块需要走的距离
h=driver.find_element(By.XPATH,'//*[@id="slideCode"]/div[1]/div[2]/div/i[1]')
l=driver.find_element(By.XPATH,'//*[@id="slideCode"]/div[1]/div[4]/span')
#print(l.size['width'])

#在浏览器上的动作
action=ActionChains(driver)
#对滑块的行为,按住并执行(perform)
action.click_and_hold(h).perform()
#让动作位移
action.move_by_offset(l.size['width'],l.size['height'])
action.release()
time.sleep(1)

"""
点选验证
"""

img=driver.find_element(By.XPATH,'//*[@id="slideCode-choose"]/div[2]/div[3]/img')
time.sleep(1)
img.screenshot('yzm.png')

im=open('yzm.png','rb').read()
chaojiying=Chaojiying_Client('超级鹰账号','密码','96001')
pic_str=chaojiying.PostPic(im,9004)['pic_str']
print(pic_str)
for i in pic_str.split('|'):
    x=i.split(',')[0]
    y = i.split(',')[1]
    action=ActionChains(driver)
    action.move_to_element_with_offset(img,int(x),int(y)).click()
input()

2.步骤

I 准备工作:导入selenium库,注册超级鹰,下面是超级鹰链接,

https://www.chaojiying.com/

注册好账号后,在下面链接下,下载超级鹰图像识别python语言demo,解压其中的py文件到自己的python工程中,并导入

https://www.chaojiying.com/api-14.html

II 打开网站,driver=webdriver.Edge(),这里用的Edge浏览器。也可以用谷歌浏览器,driver=webdriver.Chrome()

III 链接到携程旅行,driver.get('https://passport.ctrip.com/user/reg/home')

IV 后面需要点击携程旅游的同意按钮,但是程序运行的太快可能还没加载出来同意按钮,会报错无法找到该按钮,所以需要导入time库,延迟1秒运行time.sleep(1),后面time.sleep(1)都是这个道理,就不过多赘述

V 点击携程旅游的同意按钮,driver.find_element(By.XPATH,'//*[@id="agr_pop"]/div[3]/a[2]').click(),这里运用的是xpath定位,也可以用css定位

VI 按按钮后,需要输入自己的手机号,driver.find_element(By.XPATH,'//*[@id="mobilephone"]').send_keys('#这里输入自己的手机号'),也可以用css定位driver.find_element(By.ID,'fm-login-id').send_keys('手机号')

VII 滑块验证

(1)定位滑块,h=driver.find_element(By.XPATH,'//*[@id="slideCode"]/div[1]/div[2]/div/i[1]'),h就代表这个滑块。

(2)后面要拖动滑块移动,所以需要获取滑块需要移动的距离。l=driver.find_element(By.XPATH,'//*[@id="slideCode"]/div[1]/div[4]/span'),因为滑块是有高度的,l.size['width'],l.size['height']分别代表滑块水平移动的距离和滑块的高度

(3)要移动滑块,申请动作请求action=ActionChains(driver)

(4)模拟滑块移动的过程,按住滑块->拖动滑块一定距离->松开滑块

(5)按住滑块:action.click_and_hold(h).perform()

(6)移动滑块:action.move_by_offset(l.size['width'],l.size['height']),l.size['width'],l.size['height']分别代表滑块水平移动的距离和滑块的高度

(7)松开滑块:action.release()

VIII 点选验证

(1) 定位需要点选的图片,img=driver.find_element(By.XPATH,'//*[@id="slideCode-choose"]/div[2]/div[3]/img')

(2) 剪切保存下来,img.screenshot('yzm.png')

(3) 打开图片,im=open('yzm.png','rb').read()

(4) 链接超级鹰平台,chaojiying=Chaojiying_Client('超级鹰账号','密码','96001')

(5)超级鹰识别:pic_str=chaojiying.PostPic(im,9004)['pic_str']
(6) 取出识别出的文字并点击

for i in pic_str.split('|'):
    x=i.split(',')[0]
    y = i.split(',')[1]
    action=ActionChains(driver)
    action.move_to_element_with_offset(img,int(x),int(y)).click()