10.案例:自动登录12306
一、流程分析
1 打开连接:https://kyfw.12306.cn/otn/resources/login.html
2 点击账号登录
3 找出用户名,密码框,输入正确的用户名密码
4 扣除验证码
-方案一:截屏幕,取到验证码的位置和大小,pillow取大图中扣除验证码
-方案二:验证码图是base64编码,把编码转成图片
5 超级鹰验证
6 使用动作链点击坐标
7 点击登录
8 滑动验证
9 进入
二、代码示例
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
import base64
from chaojiying import Chaojiying_Client
from PIL import Image
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
driver=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=options)
driver.implicitly_wait(10)
driver.get('https://kyfw.12306.cn/otn/resources/login.html')
driver.maximize_window()
try:
user_login=driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
user_login.click()
username=driver.find_element_by_id('J-userName')
password=driver.find_element_by_id('J-password')
username.send_keys('18953675224')
password.send_keys('lqz12345')
driver.save_screenshot('main.png')
j_login_img=driver.find_element_by_id('J-loginImg')
img_base64=j_login_img.get_attribute('src').split(',')[-1]
img_content=base64.b64decode(img_base64)
with open('code1.png','wb') as f:
f.write(img_content)
chaojiying = Chaojiying_Client('306334678', 'lqz123', '903641')
im = open('code1.png', 'rb').read()
res=chaojiying.PostPic(im, 9004)
print(res)
result=res['pic_str']
all_list = []
if '|' in result:
list_1 = result.split('|')
count_1 = len(list_1)
for i in range(count_1):
xy_list = []
x = int(list_1[i].split(',')[0])
y = int(list_1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
else:
x = int(result.split(',')[0])
y = int(result.split(',')[1])
xy_list = []
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
print(all_list)
for item in all_list:
ActionChains(driver).move_to_element_with_offset(j_login_img,item[0],item[1]).click().perform()
time.sleep(1)
login_btn=driver.find_element_by_id('J-login')
time.sleep(5)
login_btn.click()
span=driver.find_element_by_id('nc_1_n1z')
ActionChains(driver).drag_and_drop_by_offset(span,300,0).perform()
time.sleep(10)
except Exception as e:
print(e)
finally:
driver.close()