python实训第七天
生活随笔
收集整理的這篇文章主要介紹了
python实训第七天
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
# 破解博客園登錄驗證
# 1.輸入用戶名與密碼并點擊登錄
# 2.探出滑動驗證,獲取有缺口與完整的圖片
# 3.通過像素點進行對比,獲取滑動距離
# 4.模擬人的行為軌跡
# 5.開始滑動
''''''
'''
破解極驗滑動驗證
破解極驗滑動驗證
博客園登錄url:
https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
代碼邏輯:
1、輸入用戶名與密碼,并點擊登錄
2、彈出滑動驗證,獲取有缺口與完整的圖片
3、通過像素點進行比對,獲取滑動位移距離
4、模擬人的行為軌跡
5、開始滑動
'''
from selenium import webdriver # 用來驅(qū)動瀏覽器的
from selenium.webdriver import ActionChains # 破解滑動驗證碼的時候用的 可以拖動圖片
import time
from PIL import Image # pip3 install pillow
import random
# 截圖圖片函數(shù)
def cut_image(driver):
# 獲取整個頁面圖片,圖片名字為'snap.png'
driver.save_screenshot('snap.png')
# 獲取滑動小畫圖
image = driver.find_element_by_class_name('geetest_canvas_img')
print(image.location)
print(image.size)
# 獲取小圖片的左上右下的位置
left = image.location['x']
top = image.location['y']
right = left + image.size['width']
buttom = top + image.size['height']
print(left, top, right, buttom)
# 調(diào)用open方法打開全屏圖片并賦值給image_obj對象
image_obj = Image.open('snap.png')
# 通過image_obj對象對小圖片進行截取
# box: The crop rectangle, as a (left, upper, right, lower)-tuple.
img = image_obj.crop((left, top, right, buttom))
# 打開截取后的小圖片
# img.show()
return img
# 獲取完整圖片
def get_image1(driver):
time.sleep(2)
# 修改document文檔樹,把完整圖片的display屬性修改為block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block";
'''
# 執(zhí)行js代碼
driver.execute_script(js_code)
# 截取圖片
image = cut_image(driver)
return image
# 獲取有缺口圖片
def get_image2(driver):
time.sleep(2)
# 修改document文檔樹,把完整圖片的display屬性修改為block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
'''
# 執(zhí)行js代碼
driver.execute_script(js_code)
# 截取圖片
image = cut_image(driver)
return image
# 獲取滑塊滑動距離
def get_distance(image1, image2):
# 小滑塊右側(cè)位置
start = 60
# 像素差
num = 60
print(image1.size)
for x in range(start, image1.size[0]):
for y in range(image1.size[1]):
# 獲取image1完整圖片每一個坐標的像素點
rgb1 = image1.load()[x, y]
# 獲取image2缺口圖片每一個坐標的像素點
rgb2 = image2.load()[x, y]
# (60, 86, 40) (60, 86, 40) rgb
print(rgb1, rgb2)
# abs獲取絕對值, 像素點比較的值
r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2])
# 如果條件成立,則找到缺口位置
if not (r < num and g < num and b < num):
# 有誤差 - 7像素
return x - 7
# 模擬人的滑動軌跡
def get_strck_move(distance):
distance += 20
'''
滑動行為軌跡
加速公式:
v = v0 + a * t
路程公式:
s = v0 * t + 0.5 * a * (t ** 2)
'''
# 初速度
v0 = 0
# 時間
t = 0.2
# 位置
s = 0
# 滑動軌跡列表 向前滑動列表
move_list = []
# 中間值,作為加減速度的位置
mid = distance / 5 * 3
# 加減速度列表
v_list = [1, 2, 3, 4]
# 循環(huán)位移
while s < distance:
if s < mid:
# 隨機獲取一個加速度
a = v_list[random.randint(0, len(v_list) - 1)]
else:
# 隨機獲取一個減速度
a = -v_list[random.randint(0, len(v_list) - 1)]
'''
勻加速\減速運行
v = v0 + a * t
位移:
s = v * t + 0.5 * a * (t**2)
'''
# 獲取初始速度
v = v0
# 路程公式:
s1 = v * t + 0.5 * a * (t ** 2)
s1 = round(s1) # 取整
# 加速公式:
# v = v0 + a * t
m_v = v + a * t
# 把當前加/減速度賦值給初始速度,以便下一次計算
v0 = m_v
# 把位移添加到滑動列表中
move_list.append(s1)
# 修改滑動初始距離
s += s1
# 后退列表, 自定義后退滑動軌跡,必須是負值
back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1]
return {'move_list': move_list, 'back_list': back_list}
def main():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F')
# 1、輸入用戶名與密碼,并點擊登錄
user_input = driver.find_element_by_id('LoginName')
user_input.send_keys('大蜘蛛007')
time.sleep(0.2)
pwd_input = driver.find_element_by_id('Password')
pwd_input.send_keys('@bb18861558365')
time.sleep(2)
login_submit = driver.find_element_by_id('submitBtn')
login_submit.click()
# 2、獲取完整的圖片
image1 = get_image1(driver)
# 3、獲取有缺口圖片
image2 = get_image2(driver)
# 4、比對兩張圖片,獲取滑動距離
distance = get_distance(image1, image2)
print(distance)
# 5、模擬人的滑動軌跡
move_dict = get_strck_move(distance)
# 獲取前進滑動軌跡
move_list = move_dict['move_list']
# 獲取后退滑動軌跡
back_list = move_dict['back_list']
# 6、開始滑動
move_tag = driver.find_element_by_class_name('geetest_slider_button')
# 點擊摁住滑動按鈕
ActionChains(driver).click_and_hold(move_tag).perform()
# 向前滑動
for move in move_list:
ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform()
time.sleep(0.1)
time.sleep(0.1)
# 向后滑動
for back in back_list:
ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform()
time.sleep(0.1)
# 制作微妙晃動
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()
time.sleep(0.1)
# 釋放滑動按鈕
ActionChains(driver).release().perform()
time.sleep(100)
if __name__ == '__main__':
main()
# 1.輸入用戶名與密碼并點擊登錄
# 2.探出滑動驗證,獲取有缺口與完整的圖片
# 3.通過像素點進行對比,獲取滑動距離
# 4.模擬人的行為軌跡
# 5.開始滑動
''''''
'''
破解極驗滑動驗證
破解極驗滑動驗證
博客園登錄url:
https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
代碼邏輯:
1、輸入用戶名與密碼,并點擊登錄
2、彈出滑動驗證,獲取有缺口與完整的圖片
3、通過像素點進行比對,獲取滑動位移距離
4、模擬人的行為軌跡
5、開始滑動
'''
from selenium import webdriver # 用來驅(qū)動瀏覽器的
from selenium.webdriver import ActionChains # 破解滑動驗證碼的時候用的 可以拖動圖片
import time
from PIL import Image # pip3 install pillow
import random
# 截圖圖片函數(shù)
def cut_image(driver):
# 獲取整個頁面圖片,圖片名字為'snap.png'
driver.save_screenshot('snap.png')
# 獲取滑動小畫圖
image = driver.find_element_by_class_name('geetest_canvas_img')
print(image.location)
print(image.size)
# 獲取小圖片的左上右下的位置
left = image.location['x']
top = image.location['y']
right = left + image.size['width']
buttom = top + image.size['height']
print(left, top, right, buttom)
# 調(diào)用open方法打開全屏圖片并賦值給image_obj對象
image_obj = Image.open('snap.png')
# 通過image_obj對象對小圖片進行截取
# box: The crop rectangle, as a (left, upper, right, lower)-tuple.
img = image_obj.crop((left, top, right, buttom))
# 打開截取后的小圖片
# img.show()
return img
# 獲取完整圖片
def get_image1(driver):
time.sleep(2)
# 修改document文檔樹,把完整圖片的display屬性修改為block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block";
'''
# 執(zhí)行js代碼
driver.execute_script(js_code)
# 截取圖片
image = cut_image(driver)
return image
# 獲取有缺口圖片
def get_image2(driver):
time.sleep(2)
# 修改document文檔樹,把完整圖片的display屬性修改為block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
'''
# 執(zhí)行js代碼
driver.execute_script(js_code)
# 截取圖片
image = cut_image(driver)
return image
# 獲取滑塊滑動距離
def get_distance(image1, image2):
# 小滑塊右側(cè)位置
start = 60
# 像素差
num = 60
print(image1.size)
for x in range(start, image1.size[0]):
for y in range(image1.size[1]):
# 獲取image1完整圖片每一個坐標的像素點
rgb1 = image1.load()[x, y]
# 獲取image2缺口圖片每一個坐標的像素點
rgb2 = image2.load()[x, y]
# (60, 86, 40) (60, 86, 40) rgb
print(rgb1, rgb2)
# abs獲取絕對值, 像素點比較的值
r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2])
# 如果條件成立,則找到缺口位置
if not (r < num and g < num and b < num):
# 有誤差 - 7像素
return x - 7
# 模擬人的滑動軌跡
def get_strck_move(distance):
distance += 20
'''
滑動行為軌跡
加速公式:
v = v0 + a * t
路程公式:
s = v0 * t + 0.5 * a * (t ** 2)
'''
# 初速度
v0 = 0
# 時間
t = 0.2
# 位置
s = 0
# 滑動軌跡列表 向前滑動列表
move_list = []
# 中間值,作為加減速度的位置
mid = distance / 5 * 3
# 加減速度列表
v_list = [1, 2, 3, 4]
# 循環(huán)位移
while s < distance:
if s < mid:
# 隨機獲取一個加速度
a = v_list[random.randint(0, len(v_list) - 1)]
else:
# 隨機獲取一個減速度
a = -v_list[random.randint(0, len(v_list) - 1)]
'''
勻加速\減速運行
v = v0 + a * t
位移:
s = v * t + 0.5 * a * (t**2)
'''
# 獲取初始速度
v = v0
# 路程公式:
s1 = v * t + 0.5 * a * (t ** 2)
s1 = round(s1) # 取整
# 加速公式:
# v = v0 + a * t
m_v = v + a * t
# 把當前加/減速度賦值給初始速度,以便下一次計算
v0 = m_v
# 把位移添加到滑動列表中
move_list.append(s1)
# 修改滑動初始距離
s += s1
# 后退列表, 自定義后退滑動軌跡,必須是負值
back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1]
return {'move_list': move_list, 'back_list': back_list}
def main():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F')
# 1、輸入用戶名與密碼,并點擊登錄
user_input = driver.find_element_by_id('LoginName')
user_input.send_keys('大蜘蛛007')
time.sleep(0.2)
pwd_input = driver.find_element_by_id('Password')
pwd_input.send_keys('@bb18861558365')
time.sleep(2)
login_submit = driver.find_element_by_id('submitBtn')
login_submit.click()
# 2、獲取完整的圖片
image1 = get_image1(driver)
# 3、獲取有缺口圖片
image2 = get_image2(driver)
# 4、比對兩張圖片,獲取滑動距離
distance = get_distance(image1, image2)
print(distance)
# 5、模擬人的滑動軌跡
move_dict = get_strck_move(distance)
# 獲取前進滑動軌跡
move_list = move_dict['move_list']
# 獲取后退滑動軌跡
back_list = move_dict['back_list']
# 6、開始滑動
move_tag = driver.find_element_by_class_name('geetest_slider_button')
# 點擊摁住滑動按鈕
ActionChains(driver).click_and_hold(move_tag).perform()
# 向前滑動
for move in move_list:
ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform()
time.sleep(0.1)
time.sleep(0.1)
# 向后滑動
for back in back_list:
ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform()
time.sleep(0.1)
# 制作微妙晃動
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()
time.sleep(0.1)
# 釋放滑動按鈕
ActionChains(driver).release().perform()
time.sleep(100)
if __name__ == '__main__':
main()
轉(zhuǎn)載于:https://www.cnblogs.com/7777qqq/p/11062449.html
總結(jié)
以上是生活随笔為你收集整理的python实训第七天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发人员需知的Web缓存知识(转)
- 下一篇: UVA - 673 (括号的匹配)