import time
import requests
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import re
from io import BytesIO
driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')
WAIT = WebDriverWait(driver, 10)
url = 'https://passport.bilibili.com/login'
def mergy_Image(image_file, location_list):
"""
將原始圖片進(jìn)行合成
:param image_file: 圖片文件
:param location_list: 圖片位置
:return: 合成新的圖片
"""
# 存放上下部分的各個(gè)小塊
upper_half_list = []
down_half_list = []
image = Image.open(image_file)
# 通過(guò) y 的位置來(lái)判斷是上半部分還是下半部分,然后切割
for location in location_list:
if location['y'] == -58:
# 間距為10即纲,y:58-116
im = image.crop((abs(location['x']), 58, abs(location['x'])+10, 116))
upper_half_list.append(im)
if location['y'] == 0:
# 間距為10识啦,y:0-58
im = image.crop((abs(location['x']), 0, abs(location['x']) + 10, 58))
down_half_list.append(im)
# 創(chuàng)建一張大小一樣的圖片
new_image = Image.new('RGB', (260, 116))
# 粘貼好上半部分 y坐標(biāo)是從上到下(0-116)
offset = 0
for im in upper_half_list:
new_image.paste(im, (offset, 0))
offset += 10
# 粘貼好下半部分
offset = 0
for im in down_half_list:
new_image.paste(im, (offset, 58))
offset += 10
return new_image
def get_distance(bg_Image, fullbg_Image):
# 閾值
threshold = 200
print(bg_Image.size[0])
print(bg_Image.size[1])
for i in range(60, bg_Image.size[0]):
for j in range(bg_Image.size[1]):
bg_pix = bg_Image.getpixel((i, j))
fullbg_pix = fullbg_Image.getpixel((i, j))
r = abs(bg_pix[0] - fullbg_pix[0])
g = abs(bg_pix[1] - fullbg_pix[1])
b = abs(bg_pix[2] - fullbg_pix[2])
if r + g + b > threshold:
return i
def get_path(distance):
result = []
current = 0
mid = distance * 4 / 5
t = 0.2
v = 0
while current < (distance - 10):
if current < mid:
a = 2
else:
a = -3
v0 = v
v = v0 + a * t
s = v0 * t + 0.5 * a * t * t
current += s
result.append(round(s))
return result
def start_drag(driver, distance):
# 被妖怪吃掉了
# knob = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show")))
# ActionChains(driver).click_and_hold(knob).perform()
# ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0.1).perform()
# time.sleep(0.5)
# ActionChains(driver).release(knob).perform()
# 被妖怪吃掉了
# ActionChains(driver).drag_and_drop_by_offset(knob, distance-10, 0).perform()
knob = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show")))
result = get_path(distance)
ActionChains(driver).click_and_hold(knob).perform()
for x in result:
ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(driver).release(knob).perform()
def recognize_code(driver):
"""
識(shí)別滑動(dòng)驗(yàn)證碼
:param driver: selenium驅(qū)動(dòng)
:return:
"""
bs = BeautifulSoup(driver.page_source,'lxml')
# 找到背景圖片和缺口圖片的div
bg_div = bs.find_all(class_='gt_cut_bg_slice')
fullbg_div = bs.find_all(class_='gt_cut_fullbg_slice')
# 獲取缺口背景圖片url
bg_url = re.findall('background-image:\surl\("(.*?)"\)',bg_div[0].get('style'))
# 獲取背景圖片url
fullbg_url = re.findall('background-image:\surl\("(.*?)"\)',fullbg_div[0].get('style'))
# 存放每個(gè)合成缺口背景圖片的位置
bg_location_list = []
# 存放每個(gè)合成背景圖片的位置
fullbg_location_list = []
for bg in bg_div:
location = {}
location['x'] = int(re.findall('background-position:\s(.*?)px\s(.*?)px;', bg.get('style'))[0][0])
location['y'] = int(re.findall('background-position:\s(.*?)px\s(.*?)px;', bg.get('style'))[0][1])
bg_location_list.append(location)
for fullbg in fullbg_div:
location = {}
location['x'] = int(re.findall('background-position:\s(.*?)px\s(.*?)px;', fullbg.get('style'))[0][0])
location['y'] = int(re.findall('background-position:\s(.*?)px\s(.*?)px;', fullbg.get('style'))[0][1])
fullbg_location_list.append(location)
print(bg_location_list)
print(fullbg_location_list)
# 將圖片格式存為 jpg 格式
bg_url = bg_url[0].replace('webp', 'jpg')
fullbg_url = fullbg_url[0].replace('webp', 'jpg')
# print(bg_url)
# print(fullbg_url)
# 下載圖片
bg_image = requests.get(bg_url).content
fullbg_image = requests.get(fullbg_url).content
print('完成圖片下載')
# 寫入圖片
bg_image_file = BytesIO(bg_image)
fullbg_image_file = BytesIO(fullbg_image)
# 合成圖片
bg_Image = mergy_Image(bg_image_file, bg_location_list)
fullbg_Image = mergy_Image(fullbg_image_file, fullbg_location_list)
# bg_Image.show()
# fullbg_Image.show()
# 計(jì)算缺口偏移距離
distance = get_distance(bg_Image, fullbg_Image)
print('得到距離:%s' % str(distance))
start_drag(driver, distance)
if __name__ == '__main__':
# 獲取滑塊按鈕
driver.get(url)
slider = WAIT.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, "#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show")))
recognize_code(driver)
# driver.close()
滑動(dòng)驗(yàn)證碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翅阵,“玉大人歪玲,你說(shuō)我怎么就攤上這事≡豕耍” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵漱贱,是天一觀的道長(zhǎng)槐雾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幅狮,這世上最難降的妖魔是什么募强? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮崇摄,結(jié)果婚禮上擎值,老公的妹妹穿的比我還像新娘。我一直安慰自己逐抑,他們只是感情好鸠儿,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厕氨,像睡著了一般进每。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命斧,一...
- 那天田晚,我揣著相機(jī)與錄音,去河邊找鬼国葬。 笑死贤徒,一個(gè)胖子當(dāng)著我的面吹牛芹壕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播接奈,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼踢涌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鲫趁?” 一聲冷哼從身側(cè)響起斯嚎,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挨厚,沒(méi)想到半個(gè)月后堡僻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡疫剃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年钉疫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巢价。...
- 正文 年R本政府宣布碉克,位于F島的核電站凌唬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漏麦。R本人自食惡果不足惜客税,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撕贞。 院中可真熱鬧更耻,春花似錦、人聲如沸捏膨。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)号涯。三九已至熬北,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诚隙,已是汗流浹背讶隐。 一陣腳步聲響...
- 正文 我出身青樓效五,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親炉峰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畏妖,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 一、下載框架文件疼阔,放到項(xiàng)目素材(js戒劫、css、img)目錄 jQuery驗(yàn)證碼插件 二婆廊、新建頁(yè)面迅细,按格式調(diào)用驗(yàn)證碼...
- RxTools 工欲善其事必先利其器! Android開(kāi)發(fā)過(guò)程經(jīng)常需要用到各式各樣的工具類淘邻,雖然大部分只需谷歌/百...
- 一茵典、介紹 (1)概念:通過(guò)用戶鼠標(biāo)移動(dòng)滑塊來(lái)填補(bǔ)有缺口圖片的驗(yàn)證碼,我們叫做滑動(dòng)驗(yàn)證碼宾舅。(2)原理:首先生成一張圖...
- 知識(shí)的利息有正負(fù),既然有利息蔬蕊,那知識(shí)也是有利率的结澄;不同于金錢的利率是由銀行確定,知識(shí)的利率大小取決于你自己袁串。 確認(rèn)...
- 1要服從命令:理念不合就容易有矛盾概而,要試著去了解呼巷,不行就去包容囱修。 2抬轎子:上下級(jí)之間正常關(guān)系應(yīng)該是尊重和幫襯。 ...