精华内容
下载资源
问答
  • 首先在极验官网下载好SDK,附上官网链接,点此可直接下载python版zip包。 模块安装 使用该SDK时发现它依赖两个模块,分别是geetest和requests。 pip install geetest pip install requests 使用 我这里是...

    准备

    SDK下载

    首先在极验官网下载好SDK,附上官网链接点此可直接下载python版zip包。

    模块安装

    使用该SDK时发现它依赖两个模块,分别是geetest和requests。

    pip install geetest
    pip install requests

    使用

    我这里是在Django环境下测试。

    登录页

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>登陆</title>
     6     <!-- 为使用方便,直接使用jquery.js库,如您代码中不需要,可以去掉 -->
     7     <script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>
     8     <!-- 引入封装了failback的接口--initGeetest -->
     9     <script src="http://static.geetest.com/static/tools/gt.js"></script>
    10 </head>
    11 <body>
    12 
    13 <div class="popup">
    14     <br>
    15     <p>
    16         <labe>用户名:</labe>
    17         <input id="username1" class="inp" type="text" value="admin">
    18     </p>
    19     <br>
    20     <p>
    21         <label>&nbsp;&nbsp;&nbsp;&nbsp;码:</label>
    22         <input id="password1" class="inp" type="password" value="123">
    23     </p>
    24 
    25     <br>
    26     <input class="btn" id="popup-submit" type="submit" value="提交">
    27 
    28     <div id="popup-captcha"></div>
    29 </div>
    30 
    31 <script>
    32     var handlerPopup = function (captchaObj) {
    33         // 成功的回调
    34         captchaObj.onSuccess(function () {
    35             var validate = captchaObj.getValidate();
    36             $.ajax({
    37                 url: "/login/", // 进行二次验证
    38                 type: "post",
    39                 dataType: "json",
    40                 data: {
    41                     username: $('#username1').val(),
    42                     password: $('#password1').val(),
    43                     geetest_challenge: validate.geetest_challenge,
    44                     geetest_validate: validate.geetest_validate,
    45                     geetest_seccode: validate.geetest_seccode
    46                 },
    47                 success: function (data) {
    48                     alert(data.msg)
    49                 }
    50             });
    51         });
    52         $("#popup-submit").click(function () {
    53             captchaObj.show();
    54         });
    55         // 将验证码加到id为captcha的元素里
    56         captchaObj.appendTo("#popup-captcha");
    57         // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
    58     };
    59     // 验证开始需要向网站主后台获取id,challenge,success(是否启用failback)
    60     $.ajax({
    61         url: "/getcaptcha?t=" + (new Date()).getTime(), // 加随机数防止缓存
    62         type: "get",
    63         dataType: "json",
    64         success: function (data) {
    65             // 使用initGeetest接口
    66             // 参数1:配置参数
    67             // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
    68             initGeetest({
    69                 gt: data.gt,
    70                 challenge: data.challenge,
    71                 product: "popup", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
    72                 offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
    73                 // 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config
    74             }, handlerPopup);
    75         }
    76     });
    77 </script>
    78 </body>
    79 </html>
    /templates/login.html

    注意:需要引入以下js:

    <script src="http://code.jquery.com/jquery-1.12.3.min.js"></script>
    <script src="http://static.geetest.com/static/tools/gt.js"></script>

    相应接口

     1 from django.shortcuts import render, HttpResponse
     2 from django.http import JsonResponse
     3 from geetest import GeetestLib
     4 
     5 pc_geetest_id = "b46d1900d0a894591916ea94ea91bd2c"
     6 pc_geetest_key = "36fc3fe98530eea08dfc6ce76e3d24c4"
     7 
     8 
     9 def getcaptcha(request):
    10     user_id = 'test'
    11     gt = GeetestLib(pc_geetest_id, pc_geetest_key)
    12     status = gt.pre_process(user_id)
    13     request.session[gt.GT_STATUS_SESSION_KEY] = status
    14     request.session["user_id"] = user_id
    15     response_str = gt.get_response_str()
    16     return HttpResponse(response_str)
    17 
    18 
    19 # Create your views here.
    20 def login(request):
    21     if request.method == "POST":
    22         gt = GeetestLib(pc_geetest_id, pc_geetest_key)
    23         challenge = request.POST.get(gt.FN_CHALLENGE, '')
    24         validate = request.POST.get(gt.FN_VALIDATE, '')
    25         seccode = request.POST.get(gt.FN_SECCODE, '')
    26         status = request.session[gt.GT_STATUS_SESSION_KEY]
    27         user_id = request.session["user_id"]
    28         if status:
    29             result = gt.success_validate(challenge, validate, seccode, user_id)
    30         else:
    31             result = gt.failback_validate(challenge, validate, seccode)
    32 
    33         username = request.POST.get('username')
    34         password = request.POST.get('password')
    35         if result:
    36             # 验证成功
    37             if username == 'admin' and password == '123':
    38                 result = {'status': 0, 'msg': "登录成功"}
    39             else:
    40                 result = {'status': 1, 'msg': "用户名或密码错误"}
    41         else:
    42             result = {'status': 2, 'msg': "验证失败"}
    43         return JsonResponse(result)
    44     return render(request, 'login.html')
    45 
    46 views.py
    views.py

    运行

    配置好路由,运行。访问localhost:8000/login/,点击提交。效果如下图:

    选字验证码

    在我测试C#版Demo的时候发现它的验证码是选字验证码,最后发现只要把C#版Demo中的id和key替换上述views.py中的5、6行的id和key,页面就是选字验证码。id和key如下:

    pc_geetest_id = "48a6ebac4ebc6642d68c217fca33eb4d"
    pc_geetest_key = "4f1c085290bec5afdc54df73535fc361"

    如下图:

    完整示例下载

    点此下载完整示例

    转载于:https://www.cnblogs.com/zze46/p/9817212.html

    展开全文
  • 极验文字分析

    2020-07-10 09:44:03
    关于极验的滑块分析可以看这里 大概的过程是: 1.请求获取gt,challenge 2.获取极验版本信息 3.验证鼠标点击过程,成功返回下一步验证(可能是滑块或者点文字) 4.返回图片的点选验证 从后面往前分析: 校验的轨迹...

    关于极验的滑块分析可以看这里
    在这里插入图片描述
    大概的过程是:

    1.请求获取gt,challenge
    2.获取极验版本信息
    3.验证鼠标点击过程,成功返回下一步验证(可能是滑块或者点选文字)
    4.返回图片的点选验证
    

    在这里插入图片描述
    从后面往前分析:

    在这里插入图片描述
    校验的轨迹还是在W参数中的,通过追踪到js可以发现这种代码:

    在这里插入图片描述
    现在不喜欢对这种代码进行硬刚,我们使用AST变换来对代码解混淆下,部分代码如下:

    在这里插入图片描述
    极验的混淆都是用一个加密函数来进行解混淆的,这种情况下,对于只有一个解密函数的混淆,在安全上是不够的,解混淆的成本很低.

    通过解混淆之后的代码:
    在这里插入图片描述
    可以看到,可读性强了一些

    找到w的生成地方:
    在这里插入图片描述
    o 获取鼠标在点击文字的时候的滑动轨迹信息,这个可以简单模拟下大概是这样的数据:
    在这里插入图片描述
    有"pointermove","pointerup"和"pointerdown"三个鼠标事件组成

    e 才是点击的坐标信息.点击的坐标不是单纯的clientX,clentY信息,是做了一下变换的:

      						 i = t["left"]
                          , o = t["top"]
                          , s = t["right"] - t["left"]
                          , a = t["bottom"] - t["top"]
                          , _ = (r - i) / s * 100
                          , c = (n - o) / a * 100;
    
                        if (100 < Math["abs"](_) || 100 < Math["abs"](c)) {
                            var u = e["$_IEu"]["$_BIDF"]();
                            _ = (r - (i = u["left"])) / s * 100,
                            c = (n - (o = u["top"])) / a * 100;
                        }
    
                        Math["round"](100 * _), Math["round"](100 * c)
    

    单纯的算法上比轨迹的加密要容易,但是是文字理解层面上比滑块要难.

    这里没有涉及到用深度学习的方式进行图片文字信息的识别.使用第三方打码的方式拿到点击的坐标信息.

    剩下的就是模拟发包:

    使用python + node执行js的方式,模拟发包:
    在这里插入图片描述
    舒服!

    交流联企鹅: 1790017954

    展开全文
  • 目前大多数网站使用的验证方式,极验验证码主要分为点按、滑动、选字、选图、识字组词等方式。如下图所示: 点按 滑动 选字 选图 识字组词 当然这只是几种比较常见的验证码方式,还有旋转图片、找出...

    极验

    目前大多数网站使用的验证方式,极验验证码主要分为点按、滑动、选字、选图、识字组词等方式。如下图所示:

    点按

    滑动

    选字

    选图

    识字组词

    当然这只是几种比较常见的验证码方式,还有旋转图片、找出一组图片中不是同一个人之类的,五花八门。。。

    在这里只是简单讲解一下如何使用selenium破解极验的滑动验证码。

    破解思路

    1. 找到验证码的图片
    2. 对比bg和fullbg两张图片,找到缺口位置
    3. 用selenium模拟人的行为拖动滑块
    4. 验证结果

    具体步骤

    在此之前先讲一下最新版极验出的验证方法是没有原始图片的。也就是多了一个修改页面css样式的属性操作,还够不到机器学习、OCR识别一些看起来比较高深的东西。再说了,貌似那个识别率也不是很高。

    a > 点击验证按钮

    获取按钮

     

    button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.gt_slider_knob.gt_show')))
    

    点按按钮(就是把鼠标放到按钮上,并非点击,否则后直接导致破解失败)

     

    ActionChains(self.browser).move_to_element(button).perform()
    

    ActionChains方法:
    move_to_element(to_element) - 鼠标移动到某个元素
    click_and_hold(on_element =None) - 点击鼠标左键,不松开
    move_by_offset(xoffset,yoffset) - 鼠标从当前位置移动到某个坐标
    release(on_element = None) - 在某个元素位置松开鼠标左键
    perform() - 执行操作,记住这个很重要,调用上面的方法后,一定要执行perform才能真正执行

    b >获取验证码截图(因为极验的那个图片是有很多个小图片组合到一起的,看网上有很多的组合方式。。。个人感觉直接截图之后定位要好一些,简单粗暴直接。PS:使用极验最新版的不通过点击获取验证码图片,而是通过修改页面css属性直接拿到验证码图片。当然,个人还是推荐截图,而非破解规律重组)

    1)获取整个页面的截图

     

    screenshot = browser.get_screenshot_as_png()
    screenshot = Image.open(BytesIO(screenshot))
    

    2)获取验证码坐标(基于整个页面的截图)

     

            img = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.gt_cut_fullbg.gt_show')))
            time.sleep(2)
            location = img.location
            size = img.size
            top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']
    

    3)获取验证码图片(根据坐标在整个页面截图上在截图)

     

            top, bottom, left, right = self.get_position()
            screenshot = self.get_screenshot()
            captcha = screenshot.crop((left, top, right, bottom))
    

    获取验证码图片

    c>获取带缺口的验证码图片

    1)获取滑块对象

     

    slider = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.gt_slider_knob.gt_show')))
    

    2)截取带缺口的验证码图片(点按滑块对象,唤出带缺口的验证码图片。使用截验证码图片的同样的方式在进行一次截取即可:截取整个页面 -- 获取坐标 -- 截取。)

     

    获取带缺口的验证码图片

    d>获取缺口位置

     

    gap = self.get_gap(image1, image2)
    

    e>减去缺口位移(BORDER是自己设置的常量,表示下图红色标识的部分的宽)

    BORDER

     

            gap -= BORDER
    

    f>模拟移动轨迹(应该算是极简模拟了,网上有人说要用神经网络我就。。。不过可以试一下线性回归,当然还有人说录制人滑的轨迹再回放什么的,也可以算是一种思路吧!最起码感觉比神经网络要简单)

    回归思路:
    回归算法的缺点大家都知道,是需要严格的假设的,做这个之前先抽取几组数据做 时间-位移的折图,发现速度轨迹其实是先快,接近目标点后开始慢的。之后博主取个巧把函数近似看成两个一元一次函数的组合,分别作回归。至于怎么分的函数,很简单,对每组数据点的 速度 做一个聚类。

     

    # 移动轨迹
            track = []
            # 当前位移
            current = 0
            # 减速阈值
            mid = distance * 4 / 5
            # 计算间隔
            t = 0.2
            # 初速度
            v = 0
            while current < distance:
                if current < mid:
                    # 加速度为正2
                    a = 2
                else:
                    # 加速度为负3
                    a = -3
                # 初速度v0
                v0 = v
                # 当前速度v = v0 + at
                v = v0 + a * t
                # 移动距离x = v0t + 1/2 * a * t^2
                move = v0 * t + 1 / 2 * a * t * t
                # 当前位移
                current += move
                # 加入轨迹
                track.append(round(move))
    

    g>拖动滑块

     

    ActionChains(self.browser).click_and_hold(slider).perform()
            for x in track:
                ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
            time.sleep(0.5)
            ActionChains(self.browser).release().perform()
    

    若无出错,此时就已经验证成功了。成功率还是比较低,问题主要还是出在模拟轨迹那一块上,需要改进该算法会提高验证率。

    极验的三种破解方式:

    还有可以识别极验验证码的api可以用 

    https://www.kancloud.cn/abcabc123/yiyunapi/1879968

    展开全文
  • 使用2captcha的服务解决登录时的极验验证码 爬虫在抓网站数据时,不可避免要和验证码做长久斗争。当然能绕过最好,但是总有绕不过的验证码,此时,对于简单的可以... 1、简书的验证技术采用的是极验提供的。 2、...

    使用2captcha的服务解决登录时的极验验证码

    爬虫在抓网站数据时,不可避免要和验证码做长久斗争。当然能绕过最好,但是总有绕不过的验证码,此时,对于简单的可以尝试绕过,有难度的对接打码平台。现在验证码多种多样,点选,滑动,英文字母组合等。所以要爬取一些网站的数据也越来越麻烦。

      本篇就针对简书的依次点击文字的验证码进行破解

        1、简书的验证技术采用的是极验提供的。 

        2、它的验证方式是:按顺序点击图中的文字来验证的。

        3、使用第三方平台2captcha的服务

    2captcha是收费的,这也是为了方便快速破掉验证码。卷积神经网络(CNN)已经学会了如何绕过最简单的验证码类型。当然也因此,验证码也早不断更新,变得更加复杂——事实上 ,这场验证码与机器学习的比赛永远不会结束。基于这个现状,目前有真实人类识别的在线反验证码服务还是要暂时领先于这些机器学习的解决方案...

    本文只是利用2captcha来破解的,2captcha就是专门做这类机器学习的,它们有强大的人力物力专门做各种验证码,并且识别率非常高,现在一般都是90%以上,价格也还行,3美元几百次吧。

    2captcha官网:https://2captcha.com/zh

    2captcha打码平台参数分析

      

    首先看一下2captcha的大概操作,打开官网

    因为是外国网站,所以看不懂的直接利用翻译就对了。

         右上角sign in登录账号

    登录完成后,会自动跳到主页

     

      主要关注圈到的地方,15$是指余额,可以用很多次了~ 上面API就是我们主要看的地方,

      下面圈起来的地方是后面请求2captcha接口需要的唯一key。

    然后就是看文档了,看看具体操作,点击进入api

    找到极验就行了,GeeTest

     

     点击GeeTest

    右键翻译下页面..

      看着还是挺简单的亚子,主要就5个步骤

      首先,找到目标网站的gt,challenge和api_server三个值,然后加上key、method和pageurl三个参数发送到 https://2captcha.com/in.php,会返回一个任务ID

      然后等个15秒左右以后,再向 https://2captcha.com/res.php 请求,带上任务ID加上一些其他参数,会返回三个值,返回的三个值+用户名密码等的向目标网站请求,就可以通过验证了

    文档已经写得很明白了,照着来就ok。

    开始试一下

      打开简书网站,点击登录到登录页面,f12开始寻找gt,challenge,api_server三个东西,

      点击Network,刷新网页,重新加载所有请求,crtl+f,搜索challenge,发现new这个接口返回的是这个

    不过2captcha文档 说了,通常可以在initGeetest发现他,我们尝试下 点击Elements,按ctrl+shift+f全局搜索一下,搜索 initGeetest

    还真有这个,我们打上断点,再次刷新,匹配一下是否和network里的一样

    知道了gt和challenge,接下来看看api_server

    随便输入账号密码点击登录一下,触发一下极验,在elements中,搜索api_server

     

     

    很容易就找到了api_server,api_server是固定参数,图中圈出来的就是

    参数找齐了然后就是根据参数请求 https://2captcha.com/in.php

     前面challenge搜索是在new接口找到的gt等,然后在Network中看Headers,发现完整请求是 https://www.jianshu.com/captchas/new?t=1578712478443-mba,我们就根据这个来获得gt,challenge

    Ok,我们来请求一下

    commbine_header = {
            "Accept": "application/json, text/plain, */*",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
            "Host": "www.jianshu.com",
            "Referer": "https://www.jianshu.com/sign_in",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
        }
    
        commbine_url = "https://www.jianshu.com/captchas/new?t=1578712478443-mba "
        response_commbine = requests.get(url=commbine_url, headers=commbine_header)
        print(response_commbine.text)
    

    输出结果是

    成功获取gt和challenge,然后再根据2captcha文档写的利用gt、challenge和其他参数来请求https://2captcha.com/in.php和https://2captcha.com/res.php。

    定义参数:

    注:challenge是动态的,其他的是静态的,API_KEY是2captcha平台的key。

    请求代码

    def getCaptchaResult(challenge):
        captcha_url = f"https://2captcha.com/in.php?key={API_KEY}&method={method}&gt={gt}&challenge={challenge}&pageurl={pageurl}&api_server={api_server}&json=1"
        r = requests.get(captcha_url)
        print(r.json())
        rid = r.json().get("request")
    
        # print(rid, type(rid))
    
        time.sleep(15)
    
        while True:
            re_cpatcha_url = f"https://2captcha.com/res.php?key={API_KEY}&action=get&id={int(rid)}&json=1"
            # print(re_cpatcha_url)
            r2 = requests.get(re_cpatcha_url)
            print(r2.json())
            if r2.json().get("status") == 1:
                geetest_challenge = r2.json().get("request").get("geetest_challenge")
                geetest_validate = r2.json().get("request").get("geetest_validate")
                geetest_seccode = r2.json().get("request").get("geetest_seccode")
    
                return geetest_challenge, geetest_validate, geetest_seccode

    运行成功拿到了请求2captcha返回的值

     

      参数都拿到了,只需要带着相关参数请求简书的登录接口了,在Network经过一番查找后,查到下面的这个接口。输入一个错误的密码,再输入正确的验证码就会请求下面的接口,但是密码不对登不进去。由此可断定,当验证码填写正确后应该是回调了这个方法

    https://www.jianshu.com/sessions,如下图,请求这个接口需要2captcha返回的三个值外加token,用户名密码。简书的密码并没有在前台进行加密,我们只需要带这些参数访问这个接口就行了。

     

    这种应该就是直接通过form表单提交的,然后我们看元素代码可以发现,确实就是这样的。

     所有参数都能拿到了,接着就是带着这参数访问下,试试:

    #请求方法
    def login_v2():
        #在浏览器中查找请求头相关参数
        login_v2_header = {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
            "Cookie": "__yadk_uid=vQPJojw7T; read_mode=day; default_font=font2; locale=zh-CN; web_login_version=MTU3ODcxOTQ5OA%3D%3D--5bde69ffd822460527464b558098457433cf2f17; _m7e_session_core=c83db74a121fbd0dc65f5700771914b0; signin_redirect=https%3A%2F%2Fwww.jianshu.com%2F; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216d377e679d9d-0b248d79d438a7-5373e62-2%24latest_utm_medium%22%3A%22search-input%22%7D%2C%22first_id%22%3A%22%22%7D",
            "Host": "www.jianshu.com",
            "Referer": "https://www.jianshu.com/sessions",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
        }
        login_v2_url = "https://www.jianshu.com/sessions"
        r1 = requests.post(login_v2_url, headers=login_v2_header, data=login_v2_dict)
    
    f __name__ == '__main__':
        username = "177*****72" #你的用户名
        password = "******" #你的密码
        
        #根据浏览器FormData参数获取所有请求的参数
        login_v2_dict = {
            "authenticity_token": "c3bzFTdK9fogAI8v=k9A9+WKK45iRh67CplbMqweXLvVHor4U=ShNIvNOOlShByTXkgcqfsIg==", 
            "session[email_or_mobile_number]": username, 
            "session[password]": password,
            "session[oversea]": False,
            "session[remember_me]": True,
    
            # 通过 2captcha 获取
            "captcha[validation][challenge]": "",
            "captcha[validation][gt]": gt,
            "captcha[validation][validate]": "",
            "captcha[validation][seccode]":""
        }
    
        v2_gt,challenge = getChallengeAndGt()
    	geetest_challenge,geetest_validate,geetest_seccode=getCaptchaResult(challenge)
    
        login_v2_dict["captcha[validation][challenge]"] = geetest_challenge
        login_v2_dict["captcha[validation][validate]"] = geetest_validate
        login_v2_dict["captcha[validation][seccode]"] = geetest_seccode
    
        print(login_v2_dict)
        login_v2()

     

    执行结果

      

     

     

      至于破掉验证码后要干嘛又能干嘛,那到底有哪些用处呢:首先当然是爬数据了,现在很多网站都是需要登录才行的;然后还有可以做自动登录啊,批量注册啊等等。。

    你们可以自己试一下看。

    完整代码

    from pprint import pprint
    import time
    import random
    import requests
    import base64
    import re
    from bs4 import BeautifulSoup
    
    API_KEY = "841545********741577a93e1d0b"
    method = "geetest"
    gt = "ec476419********681a247db3c92e"
    # challenge = "4ad9c6d********d8584f9b35769b0e"
    pageurl = "https://www.jianshu.com/sign_in"
    api_server = "api.geetest.com"
    
    def getCsrfToken():
    	headers = {
    	    'accept': 'text/html,application/xhtml+xml,application/xml',
    	    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    	}
    	id_name = "authenticity_token"
    	response = requests.get(pageurl, headers=headers, verify=False)
    	patt_id_tag = """<[^>]*name=['"]?""" + id_name + """['" ][^>]*>"""
    	id_tag = re.findall(patt_id_tag, response.text, re.DOTALL|re.IGNORECASE)
    	if id_tag:
    	  	id_tag = id_tag[0]
    	one=id_tag.split("value=")[1].split("\"")
    	return one[1]
    
    	#创建 Beautiful Soup 对象
    
    	# soup = BeautifulSoup(response.text,"html.parser")
    	# #print(soup.prettify())
    	# idVal = soup.prettify().find_all(name="authenticity_token")[0]['value']
    	#print(idValue)
    
    
    def getChallengeAndGt():
        commbine_header = {
            "Accept": "application/json, text/plain, */*",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
            "Host": "www.jianshu.com",
            "Referer": "https://www.jianshu.com/sign_in",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
        }
    
        commbine_url = "https://www.jianshu.com/captchas/new?t=1578712478443-mba "
        response_commbine = requests.get(url=commbine_url, headers=commbine_header)
        print(response_commbine.text)
    
        #print(response_commbine.json())
        gt = response_commbine.json().get("gt")
        challenge = response_commbine.json().get("challenge")
        return gt, challenge
    
    def getCaptchaResult(challenge):
        captcha_url = f"https://2captcha.com/in.php?key={API_KEY}&method={method}&gt={gt}&challenge={challenge}&pageurl={pageurl}&api_server={api_server}&json=1"
        r = requests.get(captcha_url)
        #print(r.json())
        rid = r.json().get("request")
    
        # print(rid, type(rid))
    
        time.sleep(15)
    
        while True:
            re_cpatcha_url = f"https://2captcha.com/res.php?key={API_KEY}&action=get&id={int(rid)}&json=1"
            # print(re_cpatcha_url)
            r2 = requests.get(re_cpatcha_url)
            print(r2.json())
            if r2.json().get("status") == 1:
                geetest_challenge = r2.json().get("request").get("geetest_challenge")
                geetest_validate = r2.json().get("request").get("geetest_validate")
                geetest_seccode = r2.json().get("request").get("geetest_seccode")
    
                return geetest_challenge, geetest_validate, geetest_seccode
    def login_v2():
        login_v2_header = {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Connection": "keep-alive",
    
            "Host": "www.jianshu.com",
            "Referer": "https://www.jianshu.com/sessions",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "same-origin",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
        }
        login_v2_url = "https://www.jianshu.com/sessions"
        rust=requests.post(login_v2_url, headers=login_v2_header, data=login_v2_dict)
        print(rust)
        print(rust.headers)
        print(rust.cookies.get_dict())
       # print(rust.text)
    
    if __name__ == '__main__':
    	
        username = "177******72"
        password = "z2********9"
    
        login_v2_dict = {
        	"utf8":"✓",
            "authenticity_token": "", 
            "session[email_or_mobile_number]": username, 
            "session[password]": password,
            "session[oversea]": False,
            
    
            # 通过 2captcha 获取
            "captcha[validation][challenge]": "",
            "captcha[validation][gt]": gt,
            "captcha[validation][validate]": "",
            "captcha[validation][seccode]":"",
            "session[remember_me]": True
        }
    
        v2_gt,challenge = getChallengeAndGt()
        geetest_challenge,geetest_validate,geetest_seccode=getCaptchaResult(challenge)
        token = getCsrfToken()
        
        login_v2_dict["authenticity_token"] = token
        login_v2_dict["captcha[validation][challenge]"] = geetest_challenge
        login_v2_dict["captcha[validation][validate]"] = geetest_validate
        login_v2_dict["captcha[validation][seccode]"] = geetest_seccode
    
        print(login_v2_dict)
        login_v2()

     

    展开全文
  • 4、易扩展。 主要功能有: PISX通用表单验证具有以下一些功能: 1、验证不允许为空的录入字段。 2、验证录入字段的有效长度,不允许小于最短字节数,也不允许超过最长字节数。 3、根据不同数据类型进行验证验证...
  • 代码可以对换哦,拿别的极验交换就可【比如文字点,语序点,图片转正】 测试一: 1.滑块 2.模板3.结果: 测试二: 1.滑块2.模板3.结果: 测试三: 1.滑块2.模板3.结果: 测试四: 1.滑块2.模板3.结果: ...
  • 滑块验证位移识别/识别率95%+

    千次阅读 2020-09-02 11:13:47
    另外给大家普及一下通用验证码识别和滑块缺口检测的解决方案【网易、极验、腾讯滑块】返回坐标:点击进入无限打码OCR网站,如果调用量比较大,建议购买本地验证码识别DLL。 识别通用验证码 如果需要识别滑块,请...
  • 另外给大家普及一下通用验证码识别和滑块缺口检测的解决方案【网易、极验、腾讯滑块】返回坐标:点击进入无限打码OCR网站 识别通用验证码 如果需要识别滑块,请参考官网OCR的开发文档 其它:本地DLL验证码识别如 ...
  • 本公司双色球项目开发小组根据组里多名长年研究彩票双色球的专家的成果,经过反复的概率验证,精心设计了算法,其中大部分属于本公司原创独有。程序运行时随着期数的增加,出号趋势会愈发明显,算法也会愈发准确,...
  •  本公司双色球项目开发小组根据组里多名长年研究彩票双色球的专家的成果,经过反复的概率验证,精心设计了算法,其中大部分属于本公司原创独有。程序运行时随着期数的增加,出号趋势会愈发明显,算法也会愈发准确,...
  • 该编辑器对中文的支持良好,可以快的速度加载 XML 文档,并生成可自定义的树视图以显示 XML 文档的数据结构(非常有特色,为其他 XML 编辑器所无),可以调用 MSXML 分析引擎验证 XML 文档的正确性和有效性。...
  • 该编辑器对中文的支持良好,可以快的速度加载 XML 文档,并生成可自定义的树视图以显示 XML 文档的数据结构(非常有特色,为其他 XML 编辑器所无),可以调用 MSXML 分析引擎验证 XML 文档的正确性和有效性。...
  • 未经定制,涵盖以下类型的表单字段:文本,单个复框,数字,货币,日期,日期时间,电子邮件,密码,隐藏,文本区域,选择,多按钮,多复框,单选按钮,单选复框,文件上传 完整的分层子窗体和字段数组或子...
  • 抛弃了传统字符型验证码展示-填写字符-比对答案的流程,采用验证码展示-采集用户行为-分析用户行为流程,用户只需要产生指定的行为轨迹,不需要键盘手动输入,大优化了传统验证码用户体验不佳的问题;同时,快速、...
  • DokuWiki 2011-05-08 rc

    2021-04-30 20:03:21
    DokuWiki是一个符合标准、简单易用的Wiki,主要用于创建任何类型的文件。它适用于开发团体、工作小组和小型企业。...为与 LDAP、MySQL、Postgres 以及其他进行整合的验证后端 开源并且良好注释的源代码……
  • [Validation Path] 可以不,如若不,系统将根据 [Validation Set Num] 配置的参数自动分配该数量的验证集, 注意:手动配置训练集的时候请保证验证集的随机性以及特征覆盖率,如若不明笔者所语,请勿手动配置 ...
  • ASP.NET精品课程+源代码

    千次下载 热门讨论 2009-01-05 20:15:51
    我们的实践案例与课堂教学中的案例密切相关,学生感到熟悉,易于与课堂教学中的案例知识联系起来,便于理解巩固所学知识,形成知识理论实践一体化。根据实践案例,教师充当学生的组织者、指挥者、帮助者和促进者。...
  • 3、精确的设备匹配与可安装:熟练用户可以根据需要在驱动列表中安装或不安装某版本或某设备的驱动。 4、设备安装的精确性:由于根据设备来使用驱动包及安装文件,所以在保证准确的同时也加快了设备的安装速度。 5...
  • vcg(验证码控件)

    2007-06-27 10:50:04
    提供简单易用的设计时所见即所得的可视化设置方式,并且支持设计时验证码图像效果与特效属性设置的实时联动体现,大地提高程序员的工作效率; 2. 对验证码图像的包括残影、打散、风化、旋转、斜变等多种图形...
  • DokuWiki v20101107a.rar

    2019-07-10 03:05:34
    600 个) 如果您需要帮助,有来自社区的好的支持 轻松整合: 不需要数据库,使用纯文本文件 将最近更改作为 RSS 或者 ATOM feed 同步 为与 LDAP、MySQL、Postgres 以及其他进行整合的验证后端 开源并且良好注释的源...
  • 普通的从业者、研究人员或学生,并没有一个比较好的渠道获得大量的中文语料。笔者想要训练一个中文的词向量, 在百度和github上上搜索了好久,收获却很少:要么语料的量级太小,要么数据过于成旧,或需要的处理太...
  • CC3220数据手册.pdf

    2020-03-12 22:43:05
    最新版CC3220数据手册1.1 特性 ...64 引脚 9mm × 9mm 薄四方扁平无引线 (VQFN) 封装,0.5mm 间距 工作温度 环境温度范围:–40°C 至 +85°C 器件支持 SimpleLink™ MCU 平台开发人员生态系统
  • PGP采用的解决方案是给每个公钥分配一个密钥标识(KeyID),并以大的概率与用户标识(UserID)一一对应,即UserID和KeyID标识一个密钥。密钥标识至少为64位,因而密钥标识重复的可能性非常小。 PGP提供一种系统化...
  • 论坛登陆生成器v1.41

    2015-07-12 23:04:26
    4、本程序使用的用户必须关闭用户验证信息。 5、后台管理在使用时,如果有其他非管理用户已登陆则会产生登陆失败,请注意。 使用方法: 1、下载 先从:http://dp168.com/thread-32291-1-1.html 下载程序“_东坡...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    最初是Windows NT版本的可包,随后内置在Windows 2000、Windows XP Professional和Windows Server 2003一起发行,但在普遍使用的Windows XP Home版本上并没有IIS。 添加和运行准备  一、IIS的添加 请进入“控制...
  • 修正一处可能出现的上传文件权限验证问题 修正admin文件夹改名后浏览服务器图片失效的问题 增加应用中心会员注册后自动登录插件 优化应用中心老Y文章系统数据无缝迁移至天人工具 优化应用中心会员注册码自动跳转...
  • pyftpdlib:一个速度快和可扩展的 Python FTP 服务库。 howdoi:通过命令行获取即时的编程问题解答。 PathPicker:从 bash 输出中选出文件。 percol:向 UNIX shell 传统管道概念中加入交互式选择功能。 the...
  • 如今我们恰逢时机,可以利用丰富的表现手段,为大量强大的设备(如智能手机、平板电脑)创建新颖和具吸引力的用户界面。UX涵盖了多种学科,包括认知心理学、用户研究、视觉设计等,而所有这些便形成了原型,即一种...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

极验验证选字