python 关于某网站的模拟登陆,破解滑块登陆!!!!

利用python 实现模拟登陆网站,并破解滑块登陆

缘由

起因是一次需求。我想对某个视频网站模拟登陆!!!
本文使用senenium +python+相应的模块
可能你需要安装cv2,可以直接调用下面语句:

pip install opencv-python

模拟登陆的是头条:

代码如下

from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time, requests
import cv2
from PIL import Image,ImageEnhance
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from io import BytesIO
import numpy as np
#首先定义一个破解滑块的类,这个是重点请仔细看
class Crackslide( ):
    """
        通过浏览器截图,识别验证码中缺口位置,获取需要滑动距离,并模仿人类行为破解滑动验证码
    """
    def __init__(self):
        super(Crackslide,self).__init__()
        self.url = 'https://sso.toutiao.com/login/?service=https://mp.toutiao.com/sso_confirm/?redirect_url=JTJGcHJvZmlsZV92MyUyRnhpZ3VhJTJGdXBsb2FkLXZpZGVv'#这就是你想登陆的网站,要自己输入
        self.driver = webdriver.Chrome
        self.wait = WebDriverWait(self.driver,20)
        self.zoom=2

    def open(self):
        self.driver.get(self.url)
#定义一个获得目标图片和滑动模块的图片的获得
    def get_pic(self):
        time.sleep(2)
        target = browser.find_element_by_id("validate-big")
        template = browser.find_element_by_class_name("validate-block")
        target_link = target.get_attribute('src')
        template_link = template.get_attribute('src')
        target_img = Image.open(BytesIO(requests.get(target_link).content))
        template_img = Image.open(BytesIO(requests.get(template_link).content))
        target_img.save('target.jpg')
        template_img.save('template.png')
        size_orign = target.size
        local_img = Image.open('target.jpg')
        size_loc = local_img.size
        self.zoom=320 / int(size_loc[0])
#定义等下行走的路径,用于模拟人类拖动滑块的行为
    def get_tracks(self,distance):
        print(distance)
        distance+=20
        v=0
        t=0.2
        forward_tracks = []
        current = 0
        mid = distance *3/5
        while current < distance:
            if current<mid:
                a = 2
            else:
                a = -3
            s = v * t +0.5 * a *(t**2)
            v = v + a * t
            current+=s
            forward_tracks.append(round(s))
        back_track = [-3,-3,-2,-2,-2,-2,-2,-1,-1,-1]
        return {'forward_tracks':forward_tracks,'back_tracks':back_track}
#把图片转化成矩阵,为上一个模拟路径提供相应的参数
    def match(self, target, template):
        img_rgb = cv2.imread(target)
        img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
        template = cv2.imread(template, 0)
        run = 1
        w, h = template.shape[::-1]
        print(w, h)
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

        # 使用二分法查找阈值的精确值
        L = 0
        R = 1
        while run < 20:
            run += 1
            threshold = (R + L) / 2
            if threshold < 0:
                print('Error')
                return None
            loc = np.where(res >= threshold)
            # print(len(loc[1]))
            if len(loc[1]) > 1:
                L += (R - L) / 2
            elif len(loc[1]) == 1:
                print('目标区域起点x坐标为:%d' % loc[1][0])
                break
            elif len(loc[1]) < 1:
                R -= (R - L) / 2

        return loc[1][0]
#开始模拟匹配
    def crack_slider(self, browser):
        # self.open()
        target = 'target.jpg'
        template = 'template.png'
        self.get_pic()
        distance = self.match(target, template)
        zoo = 1  # 缩放系数,需要自己调整大小
        tracks = self.get_tracks((distance + 4) * zoo)  # 对位移的缩放计算
        # print(tracks)
        slider = browser.find_element_by_class_name("drag-button")
        ActionChains(browser).click_and_hold(slider).perform()

        for track in tracks['forward_tracks']:
            ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()

        time.sleep(0.5)
        for back_tracks in tracks['back_tracks']:
            ActionChains(browser).move_by_offset(xoffset=back_tracks, yoffset=0).perform()

        ActionChains(browser).move_by_offset(xoffset=-3, yoffset=0).perform()
        ActionChains(browser).move_by_offset(xoffset=3, yoffset=0).perform()
        time.sleep(0.5)
        ActionChains(browser).release().perform()
        try:
            failure = WebDriverWait(browser, 5).until(
                EC.text_to_be_present_in_element((By.ID, 'validate-prompt'), '按住左边按钮拖动完成上方拼图'))
            print(failure)
        except:
            print('验证成功')
            return None

        if failure:
            self.crack_slider(browser)

browser = webdriver.Chrome()
#下面的url以及相应的id,class要从你选区的网站你自己去找!!
url='https://sso.toutiao.com/login/?service=https://mp.toutiao.com/sso_confirm/?redirect_url=JTJGcHJvZmlsZV92MyUyRnhpZ3VhJTJGdXBsb2FkLXZpZGVv'#你想要登陆的网址
browser.get(url)
browser.find_element_by_class_name('login-type-icon').click()
browser.find_element_by_id("user-name").send_keys("你的账号")
time.sleep(1)
browser.find_element_by_id("password").send_keys("你的密码")
browser.find_element_by_id("bytedance-login-submit").click()
c=Crackslide()
c.crack_slider(browser)

重点

要注意关于上方zoo的调解,才能到达想要的匹配结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要实现登陆京东网站自动化并通过滑块验证,需要使用Python的selenium库和webdriver驱动。 以下是实现的步骤: 1. 安装selenium库和webdriver驱动。可以使用pip安装selenium库,webdriver驱动需要根据使用的浏览器选择相应的驱动下载。 2. 导入selenium库和webdriver驱动。 ```python from selenium import webdriver ``` 3. 创建webdriver对象,并打开京东网站。 ```python driver = webdriver.Chrome() # 使用Chrome浏览器打开 driver.get('https://www.jd.com/') ``` 4. 定位到登录按钮,并点击进入登录页面。 ```python login_button = driver.find_element_by_link_text('你好,请登录') # 定位到登录按钮 login_button.click() # 点击登录按钮 ``` 5. 定位到账户登录按钮,并点击进入账户登录界面。 ```python account_login_button = driver.find_element_by_class_name('login-tab-r') # 定位到账户登录按钮 account_login_button.click() # 点击账户登录按钮 ``` 6. 输入账号和密码,并点击登录。 ```python username_input = driver.find_element_by_id('loginname') # 定位到账号输入框 password_input = driver.find_element_by_id('nloginpwd') # 定位到密码输入框 username_input.send_keys('your_username') # 输入账号 password_input.send_keys('your_password') # 输入密码 login_submit_button = driver.find_element_by_id('loginsubmit') # 定位到登录按钮 login_submit_button.click() # 点击登录按钮 ``` 7. 进入滑块验证界面,定位到滑块模拟拖动。 ```python import time time.sleep(5) # 等待页面加载完成 slider = driver.find_element_by_class_name('JDJRV-slide-btn') # 定位到滑块 webdriver.ActionChains(driver).click_and_hold(slider).perform() # 模拟鼠标按下 webdriver.ActionChains(driver).move_by_offset(200, 0).perform() # 模拟鼠标拖动 webdriver.ActionChains(driver).release().perform() # 模拟鼠标释放 ``` 完成以上步骤后,就可以自动化登陆京东网站并通过滑块验证了。需要注意的是,验证码的类型不同,需要根据具体情况进行相应的处理。 ### 回答2: Python编程可以使用Selenium和WebDriver来实现自动登录京东网站并通过滑块验证。 首先,需要安装Selenium库。使用pip命令行输入以下命令:pip install selenium 接下来,需要选择一个浏览器驱动程序,比如ChromeDriver。在下载好的ChromeDriver的目录中,可以使用以下代码进行初始化: ``` from selenium import webdriver # path为ChromeDriver的路径 driver = webdriver.Chrome(path) ``` 然后,使用WebDriver对象打开京东网站的登录页面,并输入用户名和密码: ``` # 打开京东登录页面 driver.get("https://passport.jd.com/new/login.aspx") # 输入用户名和密码 username_input = driver.find_element_by_id("loginname") password_input = driver.find_element_by_id("nloginpwd") username_input.send_keys("your_username") password_input.send_keys("your_password") ``` 接下来是通过滑块验证部分。由于具体验证方式会不断变化,这里以通用的方法进行说明。首先,需要点击滑块,触发滑块验证的显示: ``` # 点击滑块 slider = driver.find_element_by_class_name("JDJRV-slide-btn") slider.click() ``` 然后,使用WebDriverWait等待验证码框出现,并通过selenium的ActionChains模拟滑动动作: ``` from selenium.webdriver.common.action_chains 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 # 等待滑块验证框出现 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "JDJRV-smallbox"))) # 模拟滑动动作 slider = driver.find_element_by_class_name("JDJRV-slide-btn") ActionChains(driver).drag_and_drop_by_offset(slider, 300, 0).perform() ``` 最后,可以通过点击登录按钮,完成登录过程: ``` # 点击登录按钮 login_button = driver.find_element_by_id("loginsubmit") login_button.click() ``` 以上代码可以帮助实现Python编程登陆京东网站自动化并通过滑块验证的功能。注意,滑块验证的具体实现会随着京东网站的更新而变化,可能需要针对具体情况进行调整。 ### 回答3: 要实现登陆京东网站自动化并通过滑块验证,我们可以使用Python编程语言结合相关的库和工具来实现。 首先,我们可以使用Selenium库来模拟浏览器行为,并实现自动填写用户名和密码。通过Selenium,我们可以启动无头浏览器,比如Chrome或Firefox,然后使用find_element_by_xpath或find_element_by_id来定位并填写用户名和密码的输入框。 接下来,我们需要处理滑块验证码。京东网站滑块验证码通常有两个部分:滑块拼图和验证结果。我们需要通过Selenium来获取滑块拼图的位置信息,并通过图像处理库,如PIL或OpenCV,来解析滑块拼图的信息。可以使用find_element_by_xpath或find_element_by_id来获取滑块拼图的位置信息,并使用Selenium的ActionChains类来模拟人工滑动滑块。 首先,在不校验滑块验证的情况下,我们可以通过屏幕截图获取整个网页的图片,并获取滑块拼图和滑块背景图的位置信息。然后,通过图像处理库来识别滑块拼图的位置和大小。接下来,我们可以使用Selenium的ActionChains类来模拟滑动滑块,并通过判断验证结果的元素是否显示来判断是否通过验证。 通过以上步骤和Selenium库,我们就可以实现自动登陆京东网站并通过滑块验证。最后,记得添加适当的异常处理和延时操作来提高自动化脚本的稳定性和可靠性。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值