selenium自动登录12306
from selenium import webdriver
import time
import requests
from hashlib import md5
from PIL import Image
from selenium.webdriver import ActionChains
from selenium.webdriver import ChromeOptions
options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
dr = webdriver.Chrome(options=options)
dr.get('https://kyfw.12306.cn/otn/resources/login.html')
script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'
dr.execute_script(script)
time.sleep(3)
a_tag = dr.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
a_tag.click()
user_name = dr.find_element_by_id('J-userName')
pass_word = dr.find_element_by_id('J-password')
time.sleep(2)
user_name.send_keys('12306用户名')
time.sleep(2)
pass_word.send_keys('12306密码')
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
dr.save_screenshot('listing.png')
code_img_ele = dr.find_element_by_xpath('//*[@id="J-loginImg"]')
location = code_img_ele.location
print('location:', location)
size = code_img_ele.size
print('size:', size)
rangle = (
int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height'])
)
a = Image.open('./listing.png')
frame = a.crop(rangle)
frame.save('./code.png')
chaojiying = Chaojiying_Client('超级鹰用户名', '密码', '软件id')
im = open('code.png', 'rb').read()
print(chaojiying.PostPic(im, 9004)['pic_str'])
result = chaojiying.PostPic(im, 9004)['pic_str']
all_list = []
list_1 = result.split('|')
for i in list_1:
xy_list = []
x = int(i.split(',')[0])
y = int(i.split(',')[1])
ActionChains(dr).move_to_element_with_offset(code_img_ele, x, y).click().perform()
time.sleep(0.5)
login = dr.find_element_by_id('J-login')
login.click()
time.sleep(1)
hk = dr.find_element_by_xpath('//*[@id="nc_1_n1z"]')
ActionChains(dr).click_and_hold(hk).perform()
for j in range(3):
ActionChains(dr).move_by_offset(100, 0).perform()
while True:
try:
info=dr.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').text
print(info)
if info=='哎呀,出错了,点击刷新再来一次':
dr.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span/a').click()
time.sleep(0.2)
span = dr.find_element_by_xpath('//*[@id="nc_1_n1z"]')
action = ActionChains(dr)
action.click_and_hold(span).perform()
action.drag_and_drop_by_offset(span, 400, 0).perform()
time.sleep(7)
except:
print('ok!')
break