破解b站登陆的极验滑块验证码
对这个一天消费我四五个小时的破站不搞一搞说得过去吗?
-
编程这个东西,即使你拿着别人现成的code去写一遍也不代表你的就能跑起来,但是你遇到问题才能学习到,如果没问题反而是最差的结果。
-
这个代码我参考了崔庆才的网络开发爬虫实战(但说实话里面实用的有点少。我第一本花钱买的实体书就这样的。。。)但还是感谢大佬给出了标准答案
源码在最下面,可以直接拿走
import 的库
对于希望分享给大家的code里面不告诉你import的库真的让小白很头疼哈哈
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from PIL import Image
from io import BytesIO
import base64
ACCOUNT = 'b站账号'
PASSWORD = 'b站密码'
有的没的,学selenium里面碰见的,你也顺便看看呗?
chrome_options = Options()
# chrome_options.add_argument('--headless') # 无头
# chrome_options.add_argument('--disable-gpu') # 不加载gpu,规避bug
# chrome_options.add_argument('proxy-server=http://111.11.11.11:1234') # proxy
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
# chrome_options.add_argument('window-size=1920x3000') # 指定浏览器分辨率
# chrome_options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
代码部分
初始函数
self.browser = webdriver.Chrome()
self.wait = WebDriverWait(self.browser, 10)
self.ACCOUNT = ACCOUNT
self.PASSWORD = PASSWORD
得到完整的和残缺的图片, 这里面的结构很让我费解啊哈哈,为什么这个图片能藏在标签里面但是不显示出来(用xpath helper 你就能发现真的在标签里)然后了解到可以通过excute js的方法得到这个,之后的获得图片的我都是用这样的方式,这个return 也是精髓,网上找的好多答案都没有return 而且直接输入在console里还可以返回到正确的内容
time.sleep(1)
brokeimg = self.browser.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_abso'
'lute")[0].toDataURL("image/png")')[22:]
fullimg = self.browser.execute_script('return document.getElementsByClassName("geetest_canvas_fullbg geetest_f'
'ade geetest_absolute")[0].toDataURL("image/png")')[22:]
return brokeimg, fullimg
base64解码加密的图片
image = base64.decodebytes(image.encode())
new_image = Image.open(BytesIO(image))
return new_image
检查像素是否相同,就是判断缺口图片的位置在完整图片的哪里,看过我那个OCR识别验证码的肯定熟悉
pixel1 = image1.load()[x, y]
pixel2 = image2.load()[x, y]
threshold = 60
if abs(pixel1[0]-pixel2[0