自动登录
上文说道,现在的惠湖通需要不定时打开登录页来登录,所以为何不使用Python来让其自动登录呢?
首先,我们需要引入Selenium库。Selenium是一个用于自动化Web浏览器操作的工具。它提供了一组工具和库,使开发人员能够通过编程方式控制浏览器的行为,从而执行各种任务,如网页测试、数据抓取和自动化任务等。
1 2 3
| from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By
|
我使用了火狐浏览器,其可以直接通过Selenium调用,无需下载对应的驱动文件。并且设置页面加载超时时间为60秒。
1 2
| driver = webdriver.Firefox() driver.set_page_load_timeout(60)
|
接下来就是打开网页,定位输入框,以及点击按钮的操作。大部分主流浏览器都具有开发人员工具功能(Fn+F12),通过选择元素检查可以很容易地找到元素的ID,只需要将账号密码填入即可。
1 2 3 4 5 6
| driver.get('http://10.10.16.12/portal/') wait = WebDriverWait(driver, 10) username = driver.find_element(By.ID,'username') username.send_keys('188****0000') password = driver.find_element(By.ID,'password') password.send_keys('123321')
|
相同的,按钮也可以使用这样的方法来定位。但是惠湖通界面上的似乎并不是普通的按钮,所以我使用了XPATH来定位并点击。
1 2
| login_button = driver.find_element(By.XPATH,"//*[@id='pcLoginCont']/div/div[1]/div[1]/img") login_button.click()
|
如此,一个自动登录程序便完成了。
以下内容并未测试
但是这个程序仍需我们手动执行,我们是否可以让其定时运行呢?
答案是肯定的,但登录后的界面和未登录时的不一样,会导致找不到输入框和按钮。
于是,我觉得可以让程序自己先登出,再登录。(以下内容均并未实际运行过,只是提供思路,不考虑稳定性)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| driver = webdriver.Firefox() driver.set_page_load_timeout(60)
driver.get('http://10.10.16.12/portal/') time.sleep(3) try: login_button1 = driver.find_element(By.ID,"ispLogoutBtn") login_button1.click() finally: wait = WebDriverWait(driver, 10) username = driver.find_element(By.ID,'username') username.send_keys('188****0000') password = driver.find_element(By.ID,'password') password.send_keys('123321') login_button2 = driver.find_element(By.XPATH,"//*[@id='pcLoginCont']/div/div[1]/div[1]/img") login_button2.click()
|
如此一来,只要让程序在凌晨3点定时运行,就可以实现无感上网了。
当然,我们也可以让程序每隔一个小时ping三次baidu,如果三次均失败,则认定为断网,运行自动登录程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| def ping_baidu(): for _ in range(3): response = os.system("ping -c 1 www.baidu.com") if response == 0: print("Ping 百度成功!") return True else: print("Ping 百度失败...") time.sleep(5) return False
def run_program(): driver = webdriver.Firefox() driver.set_page_load_timeout(60)
driver.get('http://10.10.16.12/portal/') wait = WebDriverWait(driver, 10) username = driver.find_element(By.ID, 'username') username.send_keys('188****0000') password = driver.find_element(By.ID, 'password') password.send_keys('123321') login_button = driver.find_element(By.XPATH, "//*[@id='pcLoginCont']/div/div[1]/div[1]/img") login_button.click()
if __name__ == "__main__": while True: if not ping_baidu(): run_program() time.sleep(3600)
|
这个当然也存在弊端,运行间隔足足一个小时,可能会导致处理不及时。
结尾
这个主意很久之前就有了,但是我没有实际投入运行。我宿舍里现在是一台笔记本和台式机。笔记本不知道什么时候就自动熄屏了,程序也不知道能不能运行。而台式机会发出灯光以及风扇转动的声音,不方便开一整个晚上。所以最终还是回归最朴素的每天登一遍惠湖通咯。