zoukankan      html  css  js  c++  java
  • cookie绕过验证码登录操作

    Requests方法 -- cookie绕过验证码登录操作

    前言
    有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接)。
    获取不到也没关系,可以通过添加 cookie 的方式绕过验证码。

    1、这里以登录博客园为例。

    a、抓取登录的cookie,登录后会生成一个已登录状态的cookie,那么只需要把这个值直接添加到cookies里面就可以

    b、这里用Fiddler抓包工具进行,先手动登录一次,然后抓取cookie

    c、打开 fiddler 抓包工具,刷新下登录首页,就是登录前的 cookie 了

    img

    d、登录成功后,再查看 cookie 变化,发现多了两组参数,多的这两组参数就是我们想要的,copy 出来,一会有用

    img

    2、cookie结构

    .用抓包工具 fidller 只能看到 cookie 的 name 和 value 两个参数,实际上 cookie 还有其它参数的。

    3、添加cookie

    a、往 session 里面添加 cookie 可以用以下方式
    b、set 里面参数按括号里面的参数格式
    
    coo = requests.cookies.RequestsCookieJar()
    coo.set('cookie-name', 'cookie-value', path='/', domain='.xxx.com')
    s.cookies.update(c)
    c、于是添加登录的 cookie,把第一步 fiddler 抓到的内容填进去就可以了
    c = requests.cookies.RequestsCookieJar()
    c.set('.CNBlogsCookie', 'xxx')
    c.set('.Cnblogs.AspNetCore.Cookies','xxx')
    s.cookies.update(c)
    print(s.cookies)
    

    img

    4、参考代码

    import requests
    #禁用安全请求警告
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    """
    1.由于登录时候是多加 2 个 cookie,我们可以先用 get 方法打开登录首页,获取部分 cookie
    2.再把登录需要的 cookie 添加到 session 里
    3.添加成功后,随便编辑正文和标题保存到草稿箱
    """
    
    # 先打开登录首页,获取部分 cookie
    url = "https://account.cnblogs.com/signin?returnurl=https%3A%2F%2Fwww.cnblogs.com%2F"
    
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
    }
    
    s = requests.Session()
    r = s.get(url,headers=header)
    print(r.cookies)
    
    # 添加登录需要的两个 cookie
    c = requests.cookies.RequestsCookieJar()
    c.set(".Cnblogs.AspNetCore.Cookies","添加图二的cookie")
    c.set(".CNBlogsCookie","添加图二的cookie")
    # c.set('AlwaysCreateItemsAsActive',"True")
    # c.set('AdminCookieAlwaysExpandAdvanced',"True")
    s.cookies.update(c)
    print(s.cookies)
    
    # 登录成功后保存编辑内容
    r1 = s.get("https://i.cnblogs.com/EditPosts.aspx?opt=1", headers=header,verify=False)
    print(r1.text)
    
    # 保存草稿箱
    url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1"
    body = {
        "__VIEWSTATE":"",
        "__VIEWSTATEGENERATOR":"FE27D343",
        "Editor$Edit$txbTitle":"Hi,你好",
        "Editor$Edit$EditorBody":"<p>你们好吗 ?</p><p>Are you ok ?</p>",
        "Editor$Edit$Advanced$ckbPublished":"on",
        "Editor$Edit$Advanced$chkDisplayHomePage":"on",
        "Editor$Edit$Advanced$chkComments":"on",
        "Editor$Edit$Advanced$chkMainSyndication":"on",
        "Editor$Edit$Advanced$txbEntryName":"",
        "Editor$Edit$Advanced$txbExcerpt":"",
        "Editor$Edit$Advanced$txbTag":"",
        "Editor$Edit$Advanced$tbEnryPassword":"",
        "Editor$Edit$lkbDraft":"存为草稿",
    }
    
    r2 = s.post(url2,data=body,verify=False)
    print(r.content.decode("utf-8"))
    

    5、执行后,刷新下草稿箱页面,查看我的草稿箱是否有新增。

    img

    selenium-跳过登录验证码

    selenium最常见的就是登录,但是登录有个坑,就是验证码的问题,关于验证码一共四个办法:

    1.让开发注释掉验证码。

    2.让开发设置一个万能验证码,只要输入这个验证码,就通过。

    3.跳过验证码直接登录成功。

    4.验证码识别技术。

    第三条写的很模糊,不过下面就介绍一下第三条的实现方法。

    先说一下实现思路:

    1.打开要测试的网页,获取登录前的cookie(可以抓包获取,可以代码实现,下面会附上代码)。

    2.手动登录,再获取登录后的cookie。

    3.对比两次获取的cookie,找出登录后多出来的cookie,只要多出来的name和value就行(一般name就是token)。

    4.在代码里加上写入cookie,把找出来的name和value写入。然后再写一遍打开网页的代码。

    下面放上代码(不要着急复制代码为自己所用,代码后面会写限制,有些登录用这代码也跳不过去,哈哈)。

    #coding=utf-8
    from selenium import webdriver
    import time
    #下面四行这么写是去掉谷歌浏览器上面提示的,第二行和第三行分别对应不同的提示
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
    # options.add_argument('disable-infobars')
    browser = webdriver.Chrome(chrome_options=options)
    #
    browser.maximize_window()
    #打开火狐浏览器
    # browser=webdriver.Firefox()
    #输入网址
    browser.get("https://m.flycua.com/h5/#/")
    #点击登录,用下面注释的代码获取cookie,实现跳过登录,执行脚本的时候就不用这部分了
    # browser.find_element_by_id("su").click()
    # cookie1= browser.get_cookies()
    #打印登录前的cookie
    # print (cookie1)
    #等待30秒,用这30秒时间完成登录操作
    # time.sleep(30)
    #获取登录后的cookie
    # cookie2= browser.get_cookies()
    #打印登录后的cookie
    # print (cookie2)
    #
    #加入要获取的cookie,写进去
    browser.add_cookie({'name':'tokenId', 'value':'8BB8FDD4FBB31F92424A7E0EBE872E01A4AF77654043DAD638E9F93B378F94E19A882A6C7E78999C9A5482985FDA333C3D1E5236C6BDA7935A89178F053FB490'})
    #再次输入网址
    browser.get("https://m.flycua.com")
    
    

    上面代码包含了获取cookie和实现跳过登录的所有代码,注释部分一定要看清楚。(最早写的是用的python2,后来又拿到python3的环境上执行,根据自己python版本,对脚本略作修改,应该只有print要修改)

    然后我再说一下这代码的局限性。

    1.可以看出cookie里有tokenId,这个tokenId可以使用比较长的一段时间,前提是只执行这自动化脚本,不能再手动登录。因为手动登录又会产生一个新的tokenId,代码需要更新。

    2.如果某些网站打开直接就是登录页,那恐怕就跳不过登录了,即使写入cookie,第二次打开的网页,仍然是登录页,即使写了登录后的网址。(我还见过更厉害的,登录之前和登录之后网址都不变)

  • 相关阅读:
    [TimLinux] CSS 纯CSS实现动画展开/收起功能
    [TimLinux] CSS pre超长自动换行
    j2ee之struts2表单细节处理
    j2ee之struts2的国际化数据方式
    j2ee之struts2拦截器()
    j2ee之struts2文件下载
    j2ee之struts2文件上传
    j2ee国际化数据方式
    j2ee监听器的实现及配置方法
    j2ee过滤器实现的主要代码
  • 原文地址:https://www.cnblogs.com/hanfe1/p/14252083.html
Copyright © 2011-2022 走看看