python滑动验证码_python编程是啥

python滑动验证码_python编程是啥程序功能:程序模仿登入京东主页,自动输入帐号和密码,完成滑块验证,最后领取每日签京豆关键难点:80%的难点在于滑块验证importtimeimportcv2importrandomimportopenpyxlfromurllibimportrequestfromseleniumimportwebdriverimportnumpyasnpfromselenium.webdriver.common.action_chainsimportActionChai

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

程序功能:程序模仿登入京东主页,自动输入帐号和密码,完成滑块验证,最后领取每日签京豆

关键难点:80%的难点在于滑块验证

import time
import cv2
import random
import openpyxl
from urllib import request
from selenium import webdriver
import numpy as np
from selenium.webdriver.common.action_chains import ActionChains

#chromdriver下载地址http://npm.taobao.org/mirrors/chromedriver/
#下载好了需要设置好PATH
browser=webdriver.Chrome(executable_path="chromedriver.exe")

def login_myhome():
    handle1=browser.current_window_handle
    _xpath=r"//a[contains(@href,'home')]"
    browser.find_element_by_xpath(_xpath).click()
    time.sleep(2)

    handles=browser.window_handles
    print(handles)
    for newhandle in handles:
        if newhandle != handle1:
            browser.switch_to.window(newhandle)
    print(browser.current_window_handle)

    #TODO:login my jingbean home
    _xpath=r"//a[contains(@href,'myJingBean')]"
    browser.find_element_by_xpath(_xpath).click()
    time.sleep(2)
    handle2=browser.current_window_handle
    #TODO:login jd vip home
    _xpath=r"//li[@class='li-item2']/div/a[contains(@class,'c-btn')]"
    browser.find_element_by_xpath(_xpath).click()
    time.sleep(2)
    #TODO:switch handles
    handles=browser.window_handles
    print(handles)
    for newhandle in handles:
        if newhandle != handle1 and newhandle!=handle2:
            browser.switch_to.window(newhandle)
    print(browser.current_window_handle)
    #TODO: get bean
    _xpath=r"//span[@class='icon-sign']"
    browser.find_element_by_xpath(_xpath).click()
    time.sleep(2)

    browser.quit()


def move(btn,x,y):
    distance=y
    has_gone_dist=0
    remaining_dist=y
    print('btn:')
    print(btn)
    #获取滑块
    element=browser.find_element_by_xpath(btn)
    ActionChains(browser).click_and_hold(on_element=element).perform()
    time.sleep(0.5)

    while remaining_dist>0:
        ratio=remaining_dist / distance
        if ratio<0.1:
            #结束阶段移动较慢
            span=random.randint(3,5)
        elif ratio>0.9:
            #开始阶段移动较慢
            span = random.randint(5,8)
        else:
            #中间部分移动较快
            span = random.randint(15, 20)
        #由于京东验证机制比较严格,模仿手动移动,每次移动上下有5像素的偏差
        ActionChains(browser).move_by_offset(span,random.randint(-5,5)).perform()
        remaining_dist-=span
        has_gone_dist+=span
        time.sleep(random.randint(5,20)/100)

    print(remaining_dist)
    #回移一下
    ActionChains(browser).move_by_offset(remaining_dist,random.randint(-5,5)).perform()
    #松下按键
    ActionChains(browser).release(on_element=element).perform()
    time.sleep(2)

def getPic():
    #取登录图片的大图
    img1=r'//div/div[@class="JDJRV-bigimg"]/img'
    #取登录图片的小图
    img2=r'//div/div[@class="JDJRV-smallimg"]/img'
    bigimg=browser.find_element_by_xpath(img1).get_attribute("src")
    smallimg = browser.find_element_by_xpath(img2).get_attribute("src")

    #下载两个图片到本地,是两张彩色的原图
    request.urlretrieve(bigimg,'backimg')
    request.urlretrieve(smallimg,'slideimg')
    #获取图片并做灰化
    template=cv2.imread('backimg',0)
    block=cv2.imread('slideimg',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_BGR2GRAY)
    block=abs(255-block)
    cv2.imwrite(blockName,block)
    #将进终灰化过的图片读出来
    block=cv2.imread(blockName)
    template=cv2.imread(templateName)

    #获取偏移量
    #result返回block在template的位置,返回一个数组
    result=cv2.matchTemplate(block,template,cv2.TM_CCOEFF_NORMED)
    #print(result)
    x,y=np.unravel_index(result.argmax(),result.shape)

    print("x is {} y is {}".format(x,y))

    btn='//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]'
    move(btn,x,int(y / 1.3))

def getpersoninfo(channel):
    #读取本地存放url,帐号,密码和文件。
    wb=openpyxl.load_workbook('personinfo.xlsx')
    sheet=wb[channel]
    url=sheet['A2'].value
    username=sheet['B2'].value
    pwd=sheet['C2'].value
    return url,username,pwd

def login():
    channel='jd'
    info=getpersoninfo(channel)
    url=info[0]
    username=info[1]
    password=info[2]
    browser.get(url)
    browser.maximize_window()
    link_loin=browser.find_element_by_link_text('你好,请登录')
    link_loin.click()
    time.sleep(1)
    account_login=browser.find_element_by_link_text('账户登录')
    account_login.click()
    time.sleep(1)
    user=browser.find_element_by_id('loginname')
    user.clear()
    pwd=browser.find_element_by_id('nloginpwd')
    pwd.clear()
    user.send_keys(username)
    pwd.send_keys(password)
    time.sleep(1)
    submit=browser.find_element_by_id('loginsubmit')
    submit.click()
    time.sleep(2)

def main():
    #TODO: login url
    login()
    #TODO: getPic and slider identify
    while True:
        try:
            getPic()
            #每次滑块验证等待5秒
            time.sleep(5)
        except:
            print("登入成功")
            break
    time.sleep(2)

    login_myhome()


if __name__=='__main__':
    main()

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192401.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设计模式之建造者模式

    设计模式之建造者模式

    2021年12月16日
    36
  • 效率倍增,推荐6个好用到爆的Pycharm插件

    效率倍增,推荐6个好用到爆的Pycharm插件相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的。今天我来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。喜欢本文点赞、收藏、关注。部分插件技术群朋友分享,在此表示感谢。【文末】提供技术交流群安装方法插件的安装方法一点都不难打开file—settings—plugins,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件找到我们所需要的对应插件之后,点击install即可完成下载,然后重

    2022年8月29日
    0
  • 软件测试流程及主要用例设计方法[通俗易懂]

    软件测试流程及主要用例设计方法[通俗易懂]软件测试流程及主要用例设计方法测试新手人门,首先要掌握测试的流程和实际运作项目流程和基础的用例设计方法。掌握测试和项目流程是了解研发过程中测试的主要工作;掌握最主要的用例设计方法就是掌握测试岗位最基本最核心的技能—如何测试。1.软件测试流程1.1测试流程测试流程:需求分析和讨论>编写测试计划>测试设计>测试执行>缺陷管理>测试报告。1)需求分析和讨论:分析…

    2022年5月15日
    36
  • rpm 完全卸载mysql

    rpm 完全卸载mysql一、查看当前mysql安装情况:rpm-qa|grep-imysql二、删除之前安装的mysqlrpm-evmysql-community-libs-8.0.11-1.el7.x86_64如果报依赖错误,就使用下面的命令rpm-evmysql-community-libs-compat-8.0.11-1.el7.x86_64–nodeps三、查找之前mysql的目录,都删掉fin…

    2022年9月22日
    0
  • 如何用51单片机控制步进电机运动「建议收藏」

    如何用51单片机控制步进电机运动「建议收藏」本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。12年年初的时候购买了一套普中科技的“单片机开发试验仪”,好多次想好好学学,结果每一次都半途而废,主要原因还是周围的人都不会用,有问题都不知道找谁问,结果锁到箱子里一直到现在。

    2022年6月1日
    25
  • Latex数学公式-对齐方法[通俗易懂]

    Latex数学公式-对齐方法[通俗易懂]方法1使用begin{aligned}和end{aligned}将所需对齐的数学公式代码块包起来。其中&amp;amp;amp;表示的是对齐的位置,\\表示换行举例如下$$\begin{aligned}5&amp;amp;amp;=a+b\\7&amp;amp;amp;=2a+b\end{aligned}$$显示的结果为:5=a+b7=2a+b\begin{aligned}5&amp;amp;amp;amp;=a+b…

    2022年6月19日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号