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,第二次打开的网页,仍然是登录页,即使写了登录后的网址。(我还见过更厉害的,登录之前和登录之后网址都不变)

posted @ 2021-01-08 16:27  hanfe1  阅读(2579)  评论(0编辑  收藏  举报