基于python实现开机自动连接校园网(广工商)
因为每次开机之后无法直接使用网络,每次嫌麻烦都要打开网页输入账号密码或者打开天翼校园客户端,所以直接做了一个自动化程序来帮助我每次开机自动连接校园网
python环境准备:
1.python==>3.7
2.selenium ==>3.14.0 (需要下载对应的浏览器驱动,具体的可以去csdn里面搜一下)
3.pytesseract ==>0.39 (对应一个tesseract-OCR识别的工具,在github上面开源的,支持一般的字母数字识别)
主要流程:
开机后自动启动此脚本,使用selenium自动化工具做对应的js页面处理,所以我们只用关心日常登录的过程,实际上我们也是让程序模拟执行我们日常登陆的操作流程。
分析过程:
我们通过细心的观察不难发现每次连接网络后都会打开aHR0cDovL2VuZXQuMTAwMDAuZ2QuY246MTAwMDEvcXMvaW5kZXhfZ3ouanNwP3dsYW5hY2lwPTE4My41Ni42LjQ1JndsYW51c2VyaXA9MTcyLjIwLjIyMy4xMg==(经过base64加密)这个网站,那么我们主要处理的就是这个网站。
代码实现:
import re
import time
from selenium import webdriver
import pytesseract
from PIL import Image
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
user = '' # 账号
passworld = '' # 密码
driver = webdriver.Chrome()
driver.maximize_window()
pytesseract.pytesseract.tesseract_cmd = r'E:\tesseract-OCR\tesseract.exe' # 换成自己电脑上的路径 指定tesseract.exe的路径
tesseract_dir_config = r"--tessdata-dir 'E:\tesseract-OCR\tessdata'" # 换成自己电脑上的路径 指定训练集的路径
stop = False
while not stop:
driver.get('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
time.sleep(1)
driver.save_screenshot('xyw.png')
driver.find_element_by_xpath('//*[@id="username"]').send_keys(user)
driver.find_element_by_xpath('//*[@id="password"]').send_keys(passworld)
driver.find_element_by_xpath('//*[@id="code"]').send_keys()
element = driver.find_element_by_id('image_code')
# 计算出上下左右的位置
left = element.location['x']
top = element.location['y']
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
im = Image.open('./xyw.png')
im = im.crop((left, top, right, bottom))
im.save('./code1.png')
image = Image.open('./code1.png')
img_str = pytesseract.image_to_string(image=image, lang='eng', config=tesseract_dir_config)
img_str = re.sub("\s", '', img_str)
print(img_str)
if len(img_str) == 4:
driver.find_element_by_xpath('//*[@id="code"]').send_keys(img_str)
else:
driver.find_element_by_xpath('//*[@id="code"]').send_keys(str(input('请输入验证码:')))
driver.find_element_by_xpath('//*[@id="login"]/form/div[5]/div/button').click()
try:
WebDriverWait(driver, 2).until(EC.visibility_of_element_located((By.ID, 'success'))) # 判断元素是否可见
stop = True
driver.quit()
except:
pass
'''
代码解释:
首先我们导入了需要用到的库 设置一下配置 主要的代码逻辑还是得看 while STOP:后面的
首先我们访问学校的网址,把selenium 的窗口调到最大,等待一秒钟等网址加载(根据电脑的配置可以自行调整速度),保存该页面的图片(等下验证码处理的时候会用到),选择到对应的账号密码的输入框把账号密码输入进去(这里是固定的所以基本不用管),最主要的还是做验证码的识别和处理。
然后我们再选择到验证码的页面元素,通过网页来看不难看出有一个固定的id是image_code,选择到这个id然后计算出来图片的所在的位置,具体的可以看我另一篇博客:通过selenium截图,然后经过ocr识别出验证码进行登录操作,最后再关闭selenium
但是这里有一点需要注意,网上开源的ocr识别没有那么准确,再加上开机之后是断网的环境无法使用百度等接口实现图片识别,所以此处加了一个逻辑处理,若没有识别正确的话需要人工输入或者重试,目前这里是想到比较好的办法了,若是有更好的可以加我的微信详谈:G07527386 (请注明来意)
'''
将脚本添加到开机启动
创建一个activate.bat文件:再把此行代码加入(将路径替换一下成自己的python路径就可以了)
cmd /k "timeout /t 5&&E:\py3.7.2\python.exe code.py"
再按Win+R键打开输入shell:startup将之前创建的activate.bat文件创建一个快捷方式放入里面就可以了
到此处本次的脚本就制作完成了