Bootstrap

python+selenium实现自动联网认证,并实现断网重连

背景

大家是不是有觉得认证联网比较烦的时候,尤其是当在服务器上断网时,还需要认证联网,而此时你又不再服务器边上,对于需要使用服务器的你来说,简直是噩梦。

本文基于python+selenium模拟联网,并通过脚本每隔一段时间,ping一次百度,检查网络状态,当断网时自动重连。

开始

环境搭配

参考:https://www.cnblogs.com/jjstrip/p/11670747.html

不多赘述。注意环境间版本要兼容,如使用新版driver,最好确认兼容浏览器。

本文使用环境如下(ubantu下自带浏览器为火狐,如果用谷歌的话,要相应下载chromedriver):

  • Mozilla Firefox 70.0.1
  • selenium: 3.141.0
  • geckodriver : v0.26

代码

Netlogin.py

实现登录认证页面功能。需要更加自己情况修改账户密码、url和登录按钮元素。

# from etc import jboxenv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.firefox.options import Options


def Netlogin(username, password):
    #设置无头浏览器,否则在命令行下执行可能会报错
    options = Options()
    options.headless = True
    driver = webdriver.Firefox(options=options)
    try:
        driver.get("your login url")
        name = driver.find_element_by_id('username')
        print("debug: name {}".format(name))
        name.send_keys(username)
        psd = driver.find_element_by_id('password')
        print("debug: passwd {}".format(psd))
        psd.send_keys(password)
        btn = driver.find_element_by_class_name('login-btn') #根据自己url,确定登录按钮元素
        print("debug: btn {}".format(btn))
        btn.click()

        wait = WebDriverWait(driver, 10)
        #todo
        # wait.until(EC.presence_of_element_located((By.ID, 'showMine'))) #error
    finally:
        driver.close()

    return "lOG_IN !!!!"

if __name__ == '__main__':
    print(Netlogin('username', '123456'))

net_login.sh

将此文件置于Netlogin.py同级目录下,其执行流程如下:

  1. 首先登录
  2. 每隔一段时间,ping一次百度,检查网络状态,当网络出现问题时,自动调用Netlogin.py重新登录。
  3. 命令行输出记录保存在txt文件下。
#!/bin/bash

#运行命令: nohup ./net_start.sh &

python Netlogin_headless.py

nexttime=60
while : ;
do 
    icmp_cnt=`ping www.baidu.com -c4 | grep icmp_seq | wc -l`
    echo "[`date +'%Y-%m-%d_%H:%M:%S'`]: ping receives: $icmp_cnt / 4"

    if [ $icmp_cnt -lt 4 ]
    then
        python Netlogin_headless.py
    fi
    sleep $nexttime
done

问题

出现如下错误:

selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process

解决方法有以下几个:

  • 浏览器driver和浏览器版本不符,升级旧的版本
  • 将GeckoDriver放到/usr/lib下
  • 在非root用户下执行你的命令
  • 添加headless选项,保证在无头浏览器下运行(代码中已解决)

更多详细参考:

https://stackoverflow.com/questions/52534658/webdriverexception-message-invalid-argument-cant-kill-an-exited-process-with

效果

;