云打码平台:超级鹰
规避浏览器selenium检测js:stealth.min.js
代码参考文章:csdn博主Yi_Kong
感谢Yi_Kong博主的文章
完整代码(自己输用户名,密码,软件ID)
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
from selenium import webdriver
from time import sleep
from PIL import Image
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
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()
if __name__ == '__main__':
path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver'
# 规避浏览器selenium检测
a = Options()
a.add_experimental_option("excludeSwitches", ["enable-automation"])
a.add_argument("--disable-blink-features=AutomationControlled")
with open('./stealth.min.js') as f:
js=f.read()
# 实例化一个浏览器对象
bro = webdriver.Chrome(path, options=a)
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js})
chaojiying = Chaojiying_Client('111111', '111111', '111111') #用户中心>>软件ID 生成一个替换 96001
url = 'https://kyfw.12306.cn/otn/resources/login.html'
# 窗口最大化
bro.maximize_window()
bro.get(url)
sleep(2)
log = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
log.click()
sleep(1)
# 截图获取验证码
bro.save_screenshot('1.png')
img = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
# 手动处理偏移
px = 210
py = 73
location = img.location
print(location)
size = img.size
print(size)
rangle = (int(location['x'])+px,int(location['y'])+py,int(location['x'])+int(size['width'])+px+120,int(location['y'])+int(size['height'])+py+50)
img1 = Image.open('1.png')
img2 = img1.crop(rangle)
img2.save('2.png')
# 登录
u = bro.find_element_by_xpath('//*[@id="J-userName"]')
u.send_keys('111111')
sleep(1)
p = bro.find_element_by_xpath('//*[@id="J-password"]')
p.send_keys('111111')
sleep(1)
#'''
im = open('2.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
s = chaojiying.PostPic(im, 9004)['pic_str'] #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
# s = '260,183|346,180'
print(s)
s_list = s.split('|')
for s in s_list:
x = int(s.split(',')[0])
y = int(s.split(',')[1])
ActionChains(bro).move_to_element_with_offset(img,x-80,y-45).click().perform()
sleep(1)
login = bro.find_element_by_xpath('//*[@id="J-login"]')
login.click()
#'''
# a = input('error:')
# 滑块验证码
sleep(4)
slide = bro.find_element_by_xpath('//*[@id="nc_1_n1z"]')
action = ActionChains(bro)
action.click_and_hold(slide)
action.move_by_offset(300, 0).perform()
action.release()