小恋莫小哀 发表于 2019-2-23 16:58

Python实现京东自动登录(自动完成滑块验证)

本帖最后由 wushaominkk 于 2019-2-27 11:43 编辑

关注吾爱好久好久了,学了很多东西,第一次想把自己学的分享给大家,望各位大佬多多指教。
前提要配置好webdriver,不会的可以百度一下,我用的是Chrome的。
Python自动登录京东,这里需要填写自己的账号和密码
id = "*********" # 用户账号
passwd = "******" # 用户密码
loadpage(id, passwd)
直接付源码
import cv2
import time
import numpy as np
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains
brower = webdriver.Chrome()
def loadpage(userid, password):
    url = "https://passport.jd.com/new/login.aspx?"
    brower.get(url)
    time.sleep(3)
    s1 = r'//div/div[@class="login-tab login-tab-r"]/a'
    userlogin = brower.find_element_by_xpath(s1)
    userlogin.click()
    # time.sleep(5)
    username = brower.find_element_by_id("loginname")
    username.send_keys(userid)
    userpswd = brower.find_element_by_id("nloginpwd")
    userpswd.send_keys(password)
    # time.sleep(5)
    brower.find_element_by_id("loginsubmit").click()
    time.sleep(3)
    while True:
      try:
            getPic()
      except:
            print("登陆成功----")
            break
    time.sleep(5)
def getPic():
    # 用于找到登录图片的大图
    s2 = r'//div/div[@class="JDJRV-bigimg"]/img'
    # 用来找到登录图片的小滑块
    s3 = r'//div/div[@class="JDJRV-smallimg"]/img'
    bigimg = brower.find_element_by_xpath(s2).get_attribute("src")
    smallimg = brower.find_element_by_xpath(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("x方向的偏移", int(y * 0.4 + 18), 'x:', x, 'y:', y)
    # 获取滑块
    element = brower.find_element_by_xpath(s3)
    ActionChains(brower).click_and_hold(on_element=element).perform()
    ActionChains(brower).move_to_element_with_offset(to_element=element, xoffset=y, yoffset=0).perform()
    ActionChains(brower).release(on_element=element).perform()
    time.sleep(3)


if __name__ == '__main__':
    id = "*********" # 用户账号
    passwd = "******" # 用户密码
    loadpage(id, passwd)

小恋莫小哀 发表于 2019-2-23 21:32

Zbuter 发表于 2019-2-23 17:17
不说别的把登陆成功放到except中是不是不太好。

说得对,但是这个是获取不到登录验证图片的时候就算登录成功了

Zbuter 发表于 2019-2-24 12:34

小恋莫小哀 发表于 2019-2-23 21:32
说得对,但是这个是获取不到登录验证图片的时候就算登录成功了

可以在getpic内加try except然后返回一个bool值,根据返回的True和False来判断是否登录成功。

Zbuter 发表于 2019-2-23 17:17

不说别的把登陆成功放到except中是不是不太好。

duanjia0912 发表于 2019-3-1 16:49

谢谢,,收藏一下,,

huangst 发表于 2019-3-15 11:07

测试了,貌似成功概率很低

sdtfll 发表于 2019-3-15 19:24

收藏,,,,

runfog 发表于 2019-3-17 01:15

要配置好webdriver

jik666 发表于 2019-3-26 11:56

刚好正在学这方面的使用,Zbuter的建议都很好,一并学习了!:lol

xiaoyao008 发表于 2019-3-26 12:00

感谢楼主分享,支持一下!
页: [1] 2 3 4 5
查看完整版本: Python实现京东自动登录(自动完成滑块验证)