吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7380|回复: 57
上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
Test_dada 发表于 2020-5-22 15:05 回帖奖励
本帖最后由 Test_dada 于 2020-7-30 10:51 编辑

又到新一期的发帖时间
最近开发小哥在登录页面加上了过期机制,一段时间就会登录失效
but,,这并不能阻挡我解放双手的脚步,额... ...手步?
之前发过一期自动化登录,虽然绕过了验证码,但是缺点是每过一段时间cookie就会失效,导致代码阻塞
这次加入过期机制,优化:参数脚本分离;提高代码维护性

2.0升级版入口:https://www.52pojie.cn/thread-1233956-1-1.html

话不多说,发!代!码!,觉得有用麻烦点个赞哟


[Python] 纯文本查看 复制代码
# ******************
# 通过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
from time import sleep
from datetime import datetime
import os

class Test_loggin(object):

    def __init__(self, log_url, home_url, cookie_path, cookie_name = 'cookie.txt', expiration_time = 30):
        '''
        :param log_url: 登录网址
        :param home_url: 首页网址
        :param cookie_path: cookie文件存放路径
        :param cookie_path: 文件命名
        :param expiration_time: cookie过期时间,默认30分钟
        '''
        self.log_url = log_url
        self.home_url = home_url
        self.cookie_path = cookie_path
        self.cookie_name = cookie_name
        self.expiration_time = expiration_time

    def get_cookie(self):
        '''手动登录获取cookie'''
        driver = webdriver.Chrome()
        driver.get(self.log_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(os.path.join(self.cookie_path, self.cookie_name), 'w') as cookief:    # 创建文本覆盖保存cookie
            # 将cookies保存为json格式
            cookief.write(json.dumps(driver.get_cookies()))
        print("cookie保存成功")
        driver.close()
        print("浏览器退出")

    def pd_Cookie(self):
        '''获取最新的cookie文件,判断是否过期'''
        cookie_list = os.listdir(self.cookie_path)  # 获取目录下所有文件
        if not cookie_list:  # 判断文件为空时,直接执行手动登录
            self.get_cookie()
        else:
            cookie_list2 = sorted(cookie_list)  # 升序排序文件,返回新列表;sort是对原列表进行排列
            new_cookie = os.path.join(cookie_path, cookie_list2[-1])    # 获取最新cookie文件的全路径

            file_time = os.path.getmtime(new_cookie)  # 获取最新文件的修改时间,返回为时间戳1590113596.768411
            t = datetime.fromtimestamp(file_time)  # 时间戳转化为字符串日期时间
            print('当前时间:', datetime.now().strftime("%H:%M:%S"))
            print('最新cookie文件修改时间:', t.strftime("%H:%M:%S"))
            date = (datetime.now() - t).seconds // 60  # 时间之差,seconds返回相距秒数//60,返回分数
            print('相距分钟:{0}分钟'.format(date))
            if date > self.expiration_time:  # 默认判断大于30分钟,即重新手动登录获取cookie
                print("cookie已经过期,请重新手动登录获取")
                return self.get_cookie()
            else:
                print("cookie未过期")

    def cookie_loggin(self):
        '''自动登录操作'''
        self.pd_Cookie()  # 首先判断cookie是否已获取,是否过期
        driver = webdriver.Chrome()
        driver.get(self.log_url)
        driver.delete_all_cookies()     # 清除旧cookies

        # with可以上下文管理上文进行设置部署,下文进行处理,然后把处理的结果赋值给变量(cookie)
        with open(os.path.join(self.cookie_path, self.cookie_name),'r') as cookief:
            #使用json读取cookies 注意读取的是文件 所以用load而不是loads
            cookieslist = json.load(cookief)

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

            driver.maximize_window()
            driver.get(self.home_url)
            sleep(4)
            driver.close()


if __name__ == "__main__":
    # 注意:网址要改为自己的网址哟,不然运行不了的
    log_url = 'http://www.test/Login.html'      # 登录页面url
    home_url = 'http://www.test/UserInfo'      # 首页url
    cookie_path = 'D:\python_file\python自动化用例\cookies'     # 存放cookie的路径

    test_loggin = Test_loggin(log_url, home_url, cookie_path)
    test_loggin.cookie_loggin()

免费评分

参与人数 5吾爱币 +5 热心值 +4 收起 理由
2513002960 + 1 + 1 我很赞同!
玩的天性 + 1 + 1 谢谢@Thanks!
不写书怎周树人 + 1 我很赞同!
aixiaodemj + 1 + 1 我很赞同!
hj170520 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 12#
 楼主| Test_dada 发表于 2020-5-22 15:51 |楼主
显性等待的元素,要改,才能判断登录是否成功

d3774d35e8106397b090a1d0b7bc4af.png (44.6 KB, 下载次数: 6)

d3774d35e8106397b090a1d0b7bc4af.png
来自 13#
 楼主| Test_dada 发表于 2020-5-22 15:54 |楼主
要是手动登录操作慢导致获取cookie失败的话,把显性等待那个30,改大一点,单位是秒

b308378679297f8235a2b1c0ae6efb6.png (43.94 KB, 下载次数: 2)

b308378679297f8235a2b1c0ae6efb6.png
推荐
 楼主| Test_dada 发表于 2020-9-21 09:05 |楼主
2513002960 发表于 2020-9-18 16:21
我需要获取token,想写个慕课的

[Python] 纯文本查看 复制代码
if __name__ == "__main__":
    log_url = 'https://www.imooc.com/course/list'         # 登录页面
    home_url = 'https://www.imooc.com/course/list'     # 主页
    cookie_path = 'D:\python_file\cookies'                     # cookies保存绝对路径
    yuanshu = "//a[@id='header-avator']//img"            # 登录后元素验证

    test_loggin = Test_loggin(log_url, home_url, cookie_path, yuanshu)
    test_loggin.cookie_loggin()


框架里面的不用改,就是参数改下就可以自动登录了
推荐
 楼主| Test_dada 发表于 2020-7-29 10:14 |楼主
本帖最后由 Test_dada 于 2020-7-29 10:15 编辑
玩的天性 发表于 2020-7-28 21:19
求教
http://4a.chinatowercom.cn/uac_oa  这个登录要双重验证,账号密码登录后需要接收验证码 ...

安装pymssql包
pip install pymssql

[Python] 纯文本查看 复制代码
import pymssql

def sql_send(phone):
    # 连接数据库
    con = pymssql.connect(server='数据库ip地址', user='用户名', password='密码', database='库名')
    # 实例化
    cor = con.cursor()
    # 查询语句
    cor.execute("sql查询语句",phone)
    # 返回查询结果(元组)
    return cor.fetchone()
    # # 返回所有元组,为一个list
    # return cor.fetchall()

print(sql_send('号码'))

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
玩的天性 + 1 + 1 热心回复!

查看全部评分

沙发
xz1997 发表于 2020-5-22 15:22
谢谢楼主分享
3#
大兵马元帅 发表于 2020-5-22 15:24
你为什么这么优秀
4#
hj170520 发表于 2020-5-22 15:26
这个代码具有普适性吗?
5#
 楼主| Test_dada 发表于 2020-5-22 15:28 |楼主
hj170520 发表于 2020-5-22 15:26
这个代码具有普适性吗?

之前试过华为官网,淘宝都是可以的,只要改下参数地址就可以测试了
6#
极地企鹅 发表于 2020-5-22 15:32
cookie期限太短
7#
hj170520 发表于 2020-5-22 15:33
Test_dada 发表于 2020-5-22 15:28
之前试过华为官网,淘宝都是可以的,只要改下参数地址就可以测试了

还有一个问题,就是我之前写代码用过selenium包,这个论坛的大佬推荐我用request 以及lxml,这个也应该可以用requests爬吗?
我发现很多人看得到selenium 以及webdriver() 就没人看帖子了(估计门槛高一些,哈哈
8#
 楼主| Test_dada 发表于 2020-5-22 15:33 |楼主
对了。输入新网址,记得把cookie删掉哦,因为更换网址,旧的cookie用在新网址一定会登录失败的
9#
 楼主| Test_dada 发表于 2020-5-22 15:38 |楼主
hj170520 发表于 2020-5-22 15:33
还有一个问题,就是我之前写代码用过selenium包,这个论坛的大佬推荐我用request 以及lxml, ...

找到适合自己项目的方法就好
10#
 楼主| Test_dada 发表于 2020-5-22 15:39 |楼主

可以设置expiration_time参数,判断过期时间长短,具体看实际情况
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表