一些自动登录方法

自动登录

上文说道,现在的惠湖通需要不定时打开登录页来登录,所以为何不使用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():
# Ping百度3次
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) # 等待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) # 每隔一个小时执行一次

这个当然也存在弊端,运行间隔足足一个小时,可能会导致处理不及时

结尾

这个主意很久之前就有了,但是我没有实际投入运行。我宿舍里现在是一台笔记本和台式机。笔记本不知道什么时候就自动熄屏了,程序也不知道能不能运行。而台式机会发出灯光以及风扇转动的声音,不方便开一整个晚上。所以最终还是回归最朴素的每天登一遍惠湖通咯。