0


京东 京麦,京东商家后台自动登录,滑块验证selenium进入到from表单

首先声明不是远程,我是拿了这位大哥的代码(找不到了QAQ:找到补上)修改,然后遇到问题,给解决了

因为公司业务,需要使用python模拟人为操作自动登录京东,python首选selenium,先看这位前辈写的 ,可以直接破解原代码https://blog.csdn.net/wawawawawawaa/article/details/115261440?ops_request_misc=&request_id=&biz_id=102&utm_term=PYTHON%20%E4%BA%AC%E4%B8%9C%E6%8B%BC%E5%9B%BE&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-7-115261440.142^v14^pc_search_result_control_group,157^v14^control&spm=1018.2226.3001.4187

但是他不是用的 selenium,有喜欢的朋友可以研究一下,因为业务需求我有必须用selenium解决,所以只能另寻它法,然后遇到第一个问题 就是元素标签定位不到,试用了好多 ,ID,类名什么的

    browser.find_element_by_class_name("login-tab.login-tab-r").click()  # 点击账号密码登录
    browser.find_element_by_id("loginname").send_keys(username)  # u
    browser.find_element_by_id("nloginpwd").send_keys(password)  # p
    browser.find_element_by_id("loginsubmit").click()  # 点击登录

全部定位不到,后来我发现了 from ,我就想是不是因为表单的问题,需要解决先进入表单,是不是就能找到这些元素标签了,然后我找到这篇文章https://blog.csdn.net/weixin_42262081/article/details/107401600?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165578011416781432993790%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165578011416781432993790&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107401600-null-null.142^v19^pc_rank_34,157^v15^new_3&utm_term=selenium%E8%BF%9B%E5%85%A5%E5%88%B0from&spm=1018.2226.3001.4187

这里面用的163做的,而我们是用京东,需要找到相同之处

我就发现了 都是iframe标签,F12检查显示,搜索,代码修改

    browser.find_element(by=By.XPATH, value="//html/body/div/div/div/div[1]/div[2]").click()  # 点击账号密码登录
    # 在from表单进不去,所以需要切换进去表单
    #获取表单ifrom  id="loginFrame"
    xpath=browser.find_element(by=By.XPATH, value='//*[@id="loginFrame"]')
    # 进入表单
    browser.switch_to.frame(xpath)
    wait.until(EC.presence_of_element_located(('id', 'loginname'))).send_keys(username)
    wait.until(EC.presence_of_element_located(('id', 'nloginpwd'))).send_keys(password)
    wait.until(EC.presence_of_element_located(('id', 'paipaiLoginSubmit'))).click()

搞定OK.

接下来是完整代码,不过滑块问题依然没有解决,因为计算偏量的问题我还要修改,修改好了 我也会修改这篇文章

import cv2
import time,os,sys
import numpy as np
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains
#补判断模块(在大神基础上补充了下面模块)
from selenium.webdriver.support import expected_conditions as EC     #判断元
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
def loadpage(browser,username, password):
    browser.get('https://passport.shop.jd.com/login/index.action')  # 打开京东网址
    browser.find_element(by=By.XPATH, value="//html/body/div/div/div/div[1]/div[2]").click()  # 点击账号密码登录
    # 在from表单进不去,所以需要切换进去表单
    #获取表单ifrom  id="loginFrame"
    xpath=browser.find_element(by=By.XPATH, value='//*[@id="loginFrame"]')
    # 进入表单
    browser.switch_to.frame(xpath)
    wait.until(EC.presence_of_element_located(('id', 'loginname'))).send_keys(username)
    wait.until(EC.presence_of_element_located(('id', 'nloginpwd'))).send_keys(password)
    wait.until(EC.presence_of_element_located(('id', 'paipaiLoginSubmit'))).click()
    time.sleep(2)
    getPic(browser)
    while True:
        try:
            failure = WebDriverWait(browser, 10, 2).until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'JDJRV-slide-center'), '向右滑动完成拼图'))
            print('failure')
        except:
            print('验证成功')
            return  None
        if failure:
            getPic(browser)

def getPic(browser):
    # 用于找到登录图片的大图
    s2 = r'//div/div[@class="JDJRV-bigimg"]/img'
    # 用来找到登录图片的小滑块
    s3 = r'//div/div[@class="JDJRV-smallimg"]/img'
    bigimg = browser.find_element(by=By.XPATH, value=s2).get_attribute("src")
    smallimg = browser.find_element(by=By.XPATH, value=s3).get_attribute("src")
    # print(smallimg + '\n')
    # print(bigimg)
    # 背景大图命名
    backimg = "backimg.png"
    # 滑块命名
    slideimg = "slideimg.png"
    # 下载背景大图保存到本地
    request.urlretrieve(bigimg, backimg)
    # 下载滑块保存到本地
    request.urlretrieve(smallimg, slideimg)
    # 获取图片并灰度化
    block = cv2.imread(slideimg, 0)
    template = cv2.imread(backimg, 0)
    # 二值化后的图片名称     #灰度化后的图片识别率高
    blockName = "block.jpg"
    templateName = "template.jpg"
    # 将二值化后的图片进行保存
    cv2.imwrite(blockName, block)
    cv2.imwrite(templateName, template)
    block = cv2.imread(blockName)
    block = cv2.cvtColor(block, cv2.COLOR_RGB2GRAY)
    block = abs(255 - block)
    cv2.imwrite(blockName, block)
    block = cv2.imread(blockName)
    template = cv2.imread(templateName)
    # 获取偏移量
    result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED)  # 查找block在template中的位置,返回result是一个矩阵,是每个点的匹配结果
    x, y = np.unravel_index(result.argmax(), result.shape)
    print('此前代码可正常运行')
    # 获取滑块
    element = browser.find_element(by=By.XPATH, value=s3)
    ActionChains(browser).click_and_hold(on_element=element).perform()
    #time.sleep()    #这行不能加time.sleep,因为在这停顿了,京东基本就认定你是机器人了
    ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=y*4/5, yoffset=0).perform()    #本人在大神基础上将y改为了y*4/5
    time.sleep(0.2)     #本人加的第一行
    ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=y -y*7/10, yoffset=0).perform()     #本人加的第二行,为了模拟人的行为
    ActionChains(browser).release(on_element=element).perform()
    time.sleep(3)
#打开网页,输入账号密码
browser = webdriver.Chrome()
browser.maximize_window()
wait=WebDriverWait(browser, 10)

loadpage(browser, "123456", "123456")    #第二个空输入京东账号,第三个空输入京东密码

本文转载自: https://blog.csdn.net/xukris/article/details/125389560
版权归原作者 许亦凡 所有, 如有侵权,请联系我们删除。

“京东 京麦,京东商家后台自动登录,滑块验证selenium进入到from表单”的评论:

还没有评论