python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python绕过验证码登录

python使用Selenium和cookie绕过验证码实现登录示例代码

作者:anxiaolili

文章介绍了如何使用Selenium获取登录过程中的cookie信息,并通过抓包工具获取cookie,通过示例展示了如何在Dsmall和CRM系统中实现免登陆操作,总结了两种方法:一种是在获取到cookie后直接添加到当前会话中,另一种是将cookie存储到本地文件并在后续请求中使用

利用selenium中获取登陆过程所涉及的cookie信息:

方法

难易程度

通过抓包工具分析出cookie来,然后将cookie添加到对应的页面中去

有技术要求,简单

先运行一次通过驱动器对象中的get_cookies方法获取当前项目的所有cookie

麻,准确性高

下面的实例主要以dsmall和crm系统为例。

第一种方式

http://192.168.141.100/index.php/home/login/login.html

首先抓取dsmall登陆的相关数据信息进行分析,下面是dsmall的首页需要输入验证码才能够登陆成功

python接口测试:1.5 使用cookie完成验证码跳过登陆操作_php

使用fiddler进行抓取dsmall的登陆请求响应数据,具体分析得到下面结果:

python接口测试:1.5 使用cookie完成验证码跳过登陆操作_php_02

并且具体还可以得知该cookie是基于session的状态上存在的,也就是只要建立好会话,后期实际只要把cookie信息添加进入,即可获取到会话状态了,所以具体实现代码如下:

# cookieTest.py
# 使用cookie完成免登陆的操作

from selenium import webdriver


class DsmallCookie(object):
    def __init__(self):
        self.driver = webdriver.Chrome()

        #与服务器建立连接
        self.driver.get("http://192.168.141.100/index.php/home/member/index.html")

        # 将cookie所对应的值通过add_cookie()进行添加
        self.driver.add_cookie({"name": "PHPSESSID", "value": "ejgbevl453upavmjd42nr8bq9v"})

        # 刷新页面或重新发送一次请求都可以完成登陆操作
        # 刷新页面
        self.driver.refresh()

        # 重新发送一次请求
        self.driver.get("http://192.168.141.100/index.php/home/member/index.html")


if __name__ == '__main__':
    dsmall = DsmallCookie()

注意:add_cookie中传入的参数必须是字典对象,可以通过分析源代码得知具体传入的类型。

第二种方式

 可以先使用selenium完成一次登陆操作,然后通过驱动器调用get_cookies方法将获取的cookie信息存储到对应的本地文件中,最后后续调用cookie信息即可。以CRM项目为实例。

# Get_Cookie.py

from selenium import webdriver
import json
class GetCookie(object):
    def __init__(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://192.168.141.100/index.php/login")


    def login(self):
        self.driver.find_element_by_name("username").send_keys("admin")
        self.driver.find_element_by_name("userpwd").send_keys("admin888")
        self.driver.find_element_by_class_name("logindo").click()

    def get_cookie(self):
        with open("cookie.json",mode="w") as fp:
            for value in self.driver.get_cookies():
                json.dump(value,fp)

if __name__ == '__main__':
    get=GetCookie()
    #get.login()
    #get.get_cookie()

将登陆获取到的cookie信息存储到json格式文件中。

然后不用输入用户名、密码即可获取登录态,

# Crm_NoLogin.py

#通过cookie完成登陆操作,直接调用已经保存好的cookie文件中的cookie内容
from selenium import webdriver
import json
class CrmNoLogin(object):
    def __init__(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://123.57.71.195:7878/")
        #将之前保存的cookie进行添加到当前的会话中
        self.driver.add_cookie(self.read_cookie())
        #添加完后,则再次访问获取此url地址的话则可以直接处于登陆状态,此处注意,访问的url必须是登陆成功后的url地址
        self.driver.get("http://123.57.71.195:7878/")
    
    #声明读cookie的方法
    def  read_cookie(self):
        with open("cookie.json") as fp:
            return json.load(fp)


if __name__ == '__main__':
    crm=CrmNoLogin()

注意:此处的crm项目并不是基于session会话链接的,所以第二次发送请求时不能够刷新操作,否则无法处于登陆态,必须重新发送一次登陆成功后的请求才能够处于登陆状态。这里就需要大家注意:刷新和重新发送请求的区别了。

总结

实践:大家可以通过以上方法完成OA项目的免登陆操作哦,OA项目的访问地址:http://123.57.71.195:9999/login.html,这是我给大家部署在阿里云上的项目,可以练习练习下哦~~

说明:

1.如果第一次访问获取的cookie存在多个字典的形式的话,则每个字典都需要保存到cookie文件中,然后进行读取的时候需要遍历每个字典,并使用add_cookie将每个字典进行添加对应的cookie信息   

2.refresh和重新发送请求的区别:刷新就是基于现有的页面基础上进行检查当前页面是否存更新的内容;地址栏中的回车又分两种情况:一种就是请求的url在浏览器中的缓存未过期;另一种就是已过期;建议后期如果是使用cookie完成免登陆状态的话,大家如果不懂什么时候使用refresh的话,则全部实用重新发送请求;

到此这篇关于python使用cookie绕过验证码实现登录示例代码的文章就介绍到这了,更多相关内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文