吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4825|回复: 22
收起左侧

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

[复制链接]
Test_dada 发表于 2020-7-30 10:43
本帖最后由 Test_dada 于 2020-7-30 15:57 编辑

哈喽,大家好!
最近闲着没事对之前发过的帖子进行一些小优化
有兴趣的朋友可以看下之前的帖子
之前的版本:https://www.52pojie.cn/thread-1184495-1-1.html

这此修改的主要是针对参数的优化,还有就是解决一个小bug;
1.在自动登录没有写入quit()、close()时,页面总会在最后莫名退出的问题


[Python] 纯文本查看 复制代码
# ******************
# 通过cookie登录网站
# ******************

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
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, yuanshu, cookie_name = 'cookie.txt', expiration_time = 30):
        '''
        :param log_url: 登录网址
        :param home_url: 首页网址
        :param cookie_path: cookie文件存放路径
        :param yuanshu: 进入主页后验证的元素
        :param cookie_path: 文件命名
        :param expiration_time: cookie过期时间,默认30分钟
        '''
        self.log_url = log_url
        self.home_url = home_url
        self.cookie_path = cookie_path
        self.yuanshu = yuanshu
        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()

        # 显性等待2,当页面出现某个元素时就执行下列的操作
        WebDriverWait(driver, 60, 2).until(lambda x: x.find_element_by_xpath(self.yuanshu))
        print("进入主页验证1成功")

        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()

    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("%Y-%m-%d %H:%M:%S"))
            print('最新cookie文件修改时间:', t.strftime("%Y-%m-%d %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是否已获取,是否过期
        print("自动登录开始...")

        # 加启动配置
        option = webdriver.ChromeOptions()
        # 关闭“chrome正受到自动测试软件的控制”
        # V75以及以下版本
        # option.add_argument('disable-infobars')
        # V76以及以上版本
        option.add_experimental_option('useAutomationExtension', False)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 不自动关闭浏览器
        option.add_experimental_option("detach", True)
        # 打开chrome浏览器
        driver = webdriver.Chrome(chrome_options=option)

        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)

            # 方法1删除该字段
            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(2)
            driver.close()
            print("浏览器退出")


if __name__ == "__main__":
    log_url = 'https://passport.jd.com/new/login.aspx'       # 这里测试用的是京东的网址
    home_url = 'https://www.jd.com/'
    cookie_path = 'D:\python_file\python_test\cookies'  
    yuanshu = "//input[@id='key']"

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



下面这段就是解决自动关闭的代码了
[Python] 纯文本查看 复制代码
        # 加启动配置
        option = webdriver.ChromeOptions()
        # 关闭“chrome正受到自动测试软件的控制”
        # V75以及以下版本
        # option.add_argument('disable-infobars')
        # V76以及以上版本
        option.add_experimental_option('useAutomationExtension', False)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 不自动关闭浏览器
        option.add_experimental_option("detach", True)
        # 打开chrome浏览器
        driver = webdriver.Chrome(chrome_options=option)


免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
alam-132 + 1 + 1 我很赞同!
mf762 + 1 + 1 热心回复!
嘚瑟挨顿揍 + 1 + 1 用心讨论,共获提升!
XIAKE興 + 1 谢谢@Thanks!

查看全部评分

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

dapiqq 发表于 2020-7-30 11:34
[Python] 纯文本查看 复制代码
 
# 加启动配置
        option = webdriver.ChromeOptions()
        # 关闭“chrome正受到自动测试软件的控制”
        # V75以及以下版本
        # option.add_argument('disable-infobars')
        # V76以及以上版本
        option.add_experimental_option('useAutomationExtension', False)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])


多谢分享,之前弄的一直显示“正受到自动测试软件的控制”,终于可以关掉了。。。
 楼主| Test_dada 发表于 2020-12-25 17:00
本帖最后由 Test_dada 于 2020-12-25 17:01 编辑
alam-132 发表于 2020-12-25 16:52
有些图形验证的网站,能够加入弹出验证窗口,然后人工选择就完美了。谢谢分享。

可以加个函数,专门验证是否出现某验证元素,把输入参数化,然后等待手动输入;最后就可以在任何你觉得会出现验证图片的地方,调用该函数。
yep96 发表于 2020-7-30 10:55
emmmm总觉得模拟浏览器不是很好的解决办法,当然很多情况下分享js真的麻烦
叫我小王叔叔 发表于 2020-7-30 10:58
python能模拟某个app登陆,并获取一个位置么?可以通过抓包来获得app登陆需要的数据,然后python模拟,使服务器认为是app登陆的,位置数据可以写死。这样是否可行?
 楼主| Test_dada 发表于 2020-7-30 11:17
yep96 发表于 2020-7-30 10:55
emmmm总觉得模拟浏览器不是很好的解决办法,当然很多情况下分享js真的麻烦

也可以接口自动化、app自动化;需求不同技术不同
 楼主| Test_dada 发表于 2020-7-30 11:18
叫我小王叔叔 发表于 2020-7-30 10:58
python能模拟某个app登陆,并获取一个位置么?可以通过抓包来获得app登陆需要的数据,然后python模拟,使服 ...

可以用postman接口工具登录下,看是否成功,然后再代码实现
a6608816 发表于 2020-7-30 11:20
正在学 Python,收藏了
logen 发表于 2020-7-30 11:30
打开爬虫后  以后都自动绕过所有网站的验证码吗
kci23 发表于 2020-7-30 13:49
谢谢分享 学习一下
知心 发表于 2020-7-30 13:57
楼主你好,想交流一下,服务端检测selenium该如何处理。在console中输入window.navigator.webdriver 是True就是用了自动化脚本,undefined就是正常打开的。这段代码只能本地不显示受脚本控制,但是这个参数没有显示为undefined
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 16:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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