Test_dada 发表于 2020-3-24 10:33

用Python简单实现cookie登录网址

本帖最后由 Test_dada 于 2020-6-1 13:45 编辑

升级版!绕过验证码自动化登录网址,添加判断过期机制

https://www.52pojie.cn/thread-1184495-1-1.html(出处: 吾爱破解论坛)

在我平时的工作中,总会频繁地登录网站去进行一些操作
然后最让人头疼的就是,输入验证码{:1_926:}
所以今天给大家分享。如何绕过验证码
我们要做的就是拿到网站存储登录时的cookie,之后重新打开网页只要导入这个cookie就可以实现登录了

这里我用的是:python3.5+selenium+Chrome 版本 78.0.3904.108+对应Chrome驱动
需要分两个py文件,一个是存储cookie的,一个是导入自动登录的
话不多说,代码献上


# 第一个py文件,存储cookie,这里献上三种显性等待判断,判断页面是否成功进入,成功进入则退出网站
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC   
import json

#登录网址
login_url = "http://www.test1_url.com"    # 这里填目标网址

def get_cookie():
    driver = webdriver.Chrome()
    driver.get(login_url)
    driver.maximize_window()    # 当页面最大化时,手动填写账号密码验证码

    # 显性等待1,当页面某个元素消失时就执行下列的操作(一般填登录页面的登录按钮元素)
       WebDriverWait(driver, 30, 2).until_not(lambda x:x.find_element_by_xpath("//button[@id='btnLogin']"))
    print("登录成功")
    # 显性等待2,当页面出现某个元素时就执行下列的操作(这里填成功进入页面后才有的元素)
       WebDriverWait(driver,30,2).until(lambda x:x.find_element_by_xpath("//div[@class='c_title']"))
    print("进入主页验证1成功")
    # 显性等待3,EC.presence_of_element_located会抛出异常(这里填成功进入页面后才有的元素,不同上一个的是跳转失败会抛出异常)
       WebDriverWait(driver, 30, 2).until(EC.presence_of_element_located((By.XPATH,"//div[@class='c_title']")))
    print("进入主页验证2成功")

    with open('cookies.txt','w') as cookief:
      # 将cookies保存为json格式
      cookief.write(json.dumps(driver.get_cookies()))
    print("cookie保存成功")
    driver.close()
    print("浏览器退出")

if __name__ == "__main__":
    get_cookie()





这里是另外一个导入自动登录的py文件(====================================================================================================)
from selenium import webdriver
import json
from time import sleep

# 记得写完整的url 包括http和httpsurl = 'http://www.test2_url.com'   # 登录成功后的网址


driver = webdriver.Chrome()
driver.get(url)
#首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()

'''
说明一下,这里引号前面加一个字母 r 是为了确保在Windows系统中万无一失,故应该以原始字符串的方式指定路径,也就是在开头的引号前面加上r,
后面的r是只读的意思,还有rwa分别是:只能读不能覆盖,只能写会覆盖,只能写但是追加不会覆盖
'''
# with可以上下文管理上文进行设置部署,下文进行处理,然后把处理的结果赋值给变量(cookie)
with open(r'D:\python_file\python自动化用例\cookies.txt','r') as cookief:    #使用json读取cookies 注意读取的是文件 所以用load而不是loads
    cookieslist = json.load(cookief)

    # 方法1删除该字段
    for cookie in cookieslist:
      #该字段有问题所以删除就可以浏览器打开后记得刷新页面 有的网页注入cookie后仍需要刷新一下
      if 'expiry' in cookie:
            del cookie['expiry']
      driver.add_cookie(cookie)


'''
    # 方法2 将expiry类型变为int
    for cookie in cookieslist:
   
      # 并不是所有cookie都含有expiry 所以要用dict的get方法来获取
      # 字典.get('test1','test2') 若存在字典['test1']则返回字典['test1']的值。若不存在则返回值'test2'
      # 字典要是没有该键,不用get就会报错
      # 类型转换,type、isinstance(查看是否是某个类型,给出结果 True 或 False)
      # type(num)   isinstance(int_num,int)
      
      if isinstance(cookie.get('expiry'), float):       # 用isinstance判断键值是否为Flost
            cookie['expiry'] = int(cookie['expiry'])
      driver.add_cookie(cookie)

'''

driver.maximize_window()
# 要重新打开网站才会进入主页
driver.get(url)
# sleep(5)
# driver.quit()


本人也是python入门级别,大佬们见笑很多东西都会标注比较详细,有所冗余,见怪不怪

yagiza 发表于 2020-3-24 11:44

代码部分高亮的看不清,帮你重新录入下

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC   
import json

#登录网址
login_url = "http://www.test1_url.com"    # 这里填目标网址

def get_cookie():
    driver = webdriver.Chrome()
    driver.get(login_url)
    driver.maximize_window()    # 当页面最大化时,手动填写账号密码验证码

    # 显性等待1,当页面某个元素消失时就执行下列的操作(一般填登录页面的登录按钮元素)
       WebDriverWait(driver, 30, 2).until_not(lambda x:x.find_element_by_xpath("//button[@id='btnLogin']"))
    print("登录成功")
    # 显性等待2,当页面出现某个元素时就执行下列的操作(这里填成功进入页面后才有的元素)
       WebDriverWait(driver,30,2).until(lambda x:x.find_element_by_xpath("//div[@class='c_title']"))
    print("进入主页验证1成功")
    # 显性等待3,EC.presence_of_element_located会抛出异常(这里填成功进入页面后才有的元素,不同上一个的是跳转失败会抛出异常)
       WebDriverWait(driver, 30, 2).until(EC.presence_of_element_located((By.XPATH,"//div[@class='c_title']")))
    print("进入主页验证2成功")

    with open('cookies.txt','w') as cookief:
      # 将cookies保存为json格式
      cookief.write(json.dumps(driver.get_cookies()))
    print("cookie保存成功")
    driver.close()
    print("浏览器退出")

if __name__ == "__main__":
    get_cookie()





这里是另外一个导入自动登录的py文件(====================================================================================================)
from selenium import webdriver
import json
from time import sleep

# 记得写完整的url 包括http和httpsurl = 'http://www.test2_url.com'   # 登录成功后的网址


driver = webdriver.Chrome()
driver.get(url)
#首先清除由于浏览器打开已有的cookies
driver.delete_all_cookies()

'''
说明一下,这里引号前面加一个字母 r 是为了确保在Windows系统中万无一失,故应该以原始字符串的方式指定路径,也就是在开头的引号前面加上r,
后面的r是只读的意思,还有rwa分别是:只能读不能覆盖,只能写会覆盖,只能写但是追加不会覆盖
'''
# with可以上下文管理上文进行设置部署,下文进行处理,然后把处理的结果赋值给变量(cookie)
with open(r'D:\python_file\python自动化用例\cookies.txt','r') as cookief:    #使用json读取cookies 注意读取的是文件 所以用load而不是loads
    cookieslist = json.load(cookief)

    # 方法1删除该字段
    for cookie in cookieslist:
      #该字段有问题所以删除就可以浏览器打开后记得刷新页面 有的网页注入cookie后仍需要刷新一下
      if 'expiry' in cookie:
            del cookie['expiry']
      driver.add_cookie(cookie)


'''
    # 方法2 将expiry类型变为int
    for cookie in cookieslist:
   
      # 并不是所有cookie都含有expiry 所以要用dict的get方法来获取
      # 字典.get('test1','test2') 若存在字典['test1']则返回字典['test1']的值。若不存在则返回值'test2'
      # 字典要是没有该键,不用get就会报错
      # 类型转换,type、isinstance(查看是否是某个类型,给出结果 True 或 False)
      # type(num)   isinstance(int_num,int)
      
      if isinstance(cookie.get('expiry'), float):       # 用isinstance判断键值是否为Flost
            cookie['expiry'] = int(cookie['expiry'])
      driver.add_cookie(cookie)

'''

driver.maximize_window()
# 要重新打开网站才会进入主页
driver.get(url)
# sleep(5)
# driver.quit()

raykeyor 发表于 2020-3-24 10:52

感谢分享。。。。。

ienzoo 发表于 2020-3-24 12:47

感谢分享

Test_dada 发表于 2020-3-24 12:48

yagiza 发表于 2020-3-24 11:44
代码部分高亮的看不清,帮你重新录入下

from selenium import webdriver


:handshake第一次发帖,编辑的时候复制过来背景是正常的,发布后就这样了,想编辑又不太懂,谢谢啦

yagiza 发表于 2020-3-24 13:11

Test_dada 发表于 2020-3-24 12:48
第一次发帖,编辑的时候复制过来背景是正常的,发布后就这样了,想编辑又不太懂,谢谢啦

不客气啦~~互相学习,互相帮助~~{:1_918:}

tydzjing 发表于 2020-3-24 14:53

这个不错,可以借鉴一下

众生平等 发表于 2020-4-18 12:32

mark,技术贴!

kaif546 发表于 2020-4-21 15:52

本帖最后由 kaif546 于 2020-4-21 16:37 编辑

有没有那种能一眼看出有多少个cookie的文本编辑器
notepad++ 和记事本就只有一行 ,谢谢大佬

Test_dada 发表于 2020-4-21 16:56

本帖最后由 Test_dada 于 2020-4-21 17:05 编辑

kaif546 发表于 2020-4-21 15:52
有没有那种能一眼看出有多少个cookie的文本编辑器
notepad++ 和记事本就只有一行 ,谢谢大佬
要是这些cookie都有明显的分割字符的话,可以直接把该字符替换成换行,就可以看出有多少行cookie了,例如notepad++,替换换行符是\n,把目标字符替换成\n就可以了,记得选择正则表达式




页: [1] 2
查看完整版本: 用Python简单实现cookie登录网址