前言:通过Python爬虫与tkinter模块实现桌面快捷自动化登录教务系统
目录:
前言:通过Python爬虫与tkinter模块实现桌面快捷自动化登录教务系统
4.MockLongn()自动化登录函数(整个项目的重点!!!)
5.baiduOCR()图像处理识别函数——基于百度图像识别技术
效果展示:
整体思路:创建主界面,在界面中手动输入用户名和密码,点击登录后自动打开浏览器,截取整个页面,裁剪出登录页面中的图片验证码并保存到本地,对验证码图片进行处理,识别出验证码。将用户名,密码,验证码一同自动输入到对应的框中,自动登录进入主页。
总体框架:
思维导图
代码实现:
所用到的第三方库:
time、tkinter、AipOcr、selenium、PIL
1.主界面实现
VisualInterface()主界面
#获取主界面窗口所有图片
def get_img(filename, width, height):
im = Image.open(filename).resize((width, height))
im = ImageTk.PhotoImage(im)
return im
#创建主界面
def VisualInterface():
root = t.Tk() # 创建主窗口
root.title("xxxxxxx教务系统") # 设置标题
root.geometry("500x280") # 设置窗口大小
root.state("zoomed") # 全屏
#背景图
canvas_root = t.Canvas(root, width=500, height=280)
im_root = get_img('p5.png', 500, 280)
canvas_root.create_image(250, 140, image=im_root)
canvas_root.create_text(250, 55,text='xxxxxx教务系统桌面可视化登录' # 所绘制文字的内容
, fill='black', font=('宋体', 17,"bold"))
canvas_root.create_text(180, 110,text='用户名:' # 所绘制文字的内容
, fill='black', font=('宋体', 14,"bold"))
canvas_root.create_text(180, 150,text='密码:' # 所绘制文字的内容
, fill='black', font=('宋体', 14,"bold"))
canvas_root.pack()
# 用户名输入框
varName = tkinter.StringVar(root, value='') # 为输入框绑定字符串变量
entryName = tkinter.Entry(root, width=80, textvariable=varName)
entryName.place(x=220, y=100, width=120, height=20)
# 密码输入框
varPassword = tkinter.StringVar(root, value='') # 为输入框绑定字符串变量
entryPassword = tkinter.Entry(root, width=80, textvariable=varPassword, show='*')
entryPassword.place(x=220, y=140, width=120, height=20)
主界面中我采用了python自带的库来做可视化界面,这个库功能性不是很好,只有三种布局方式,局限性有点大,界面美观效果不是特别好,想要了解的朋友可以看这篇文章:
python之Tkinter使用详解
https://blog.csdn.net/qq_45664055/article/details/117625146?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167064224616782390553588%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167064224616782390553588&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-117625146-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_control2&utm_term=python%E4%B8%ADtkinter%E7%94%A8%E6%B3%95&spm=1018.2226.3001.4187
大家可以去找找其他的python可视化窗口的库。首先我为tkinter窗口添加了背景图片,通过canvas工具包对图片样式进行修改,在图片的表面添加了文字对文字进行了字体,字号,加粗的调整。通过绝对布局对输入框进行位置调整。
2.login()登录按钮
def login():
url = "https://jw.scujj.edu.cn:82/xtgl/login_slogin.html"
name = entryName.get()
password = entryPassword.get()
MockLongn(url, name, password)
root.quit()
# 创建按钮组件,同时设置按钮事件处理函数
buttonOK = tkinter.Button(root, text='登录', command=login)
buttonOK.place(x=135, y=200, width=60, height=20)
在主界面中创建登录按钮,当按钮点击后执行login()函数,获取上方输入框中输入的用户名和密码,并且调用MockLongn()函数自动化进入教务系统主页
3.Cancel()清除函数
def Cancel():
# 清理用户输入的用户名和密码
varName.set('')
varPassword.set('')
# 创建取消按钮
buttonCancel = tkinter.Button(root, text='清除', command=Cancel)
buttonCancel.place(x=235, y=200, width=60, height=20)
#退出按钮
buttonQuit=tkinter.Button(root, text="退出", command=root.quit)
buttonQuit.place(x=335,y=200,width=60,height=20)
root.mainloop() # 显示主窗口,进入事件循环
这里创建清除按钮对主界面输入框中输入的值进行清除,创建了退出主界面按钮,防止主界面在MockLongn()函数为未执行完进程之前异常卡死,主动退出主界面。代码比较简单我就不介绍了。
4.MockLongn()自动化登录函数(
整个项目的重点!!!
)
def MockLongn(url, name, password):
s = Service(r'D:\Install the package\chromedriver.exe')
browser = webdriver.Chrome(service=s) # 实例化谷歌浏览器对象
browser.implicitly_wait(10) # 设置隐式等待
browser.get(url) # 访问教务系统登录界面
browser.save_screenshot("./pic.png") # 可以修改保存地址
time.sleep(2)
# (3)获取图片验证码坐标
code_ele = browser.find_element(By.XPATH,
"/html/body/div[1]/div[2]/div[2]/form/div/div/div[1]/div[3]/div[2]/img")
# (4)图片4个点的坐标位置
left = code_ele.location['x'] # x点的坐标
top = code_ele.location['y'] # y点的坐标
right = code_ele.size['width'] + left # 上面右边点的坐标
down = code_ele.size['height'] + top # 下面右边点的坐标
image = Image.open('pic.png')
# (5)将图片验证码截取
code_image = image.crop((left, top, right, down))
code_image.save('./pic1.png') # 截取的验证码图片保存为新的文件
user_input = browser.find_element(By.XPATH, '//*[@id="yhm"]') # 定位登录表单中的用户名输入框
password_input = browser.find_element(By.XPATH, '//*[@id="mm"]') # 定位登录表单中的密码输入框
closs_input = browser.find_element(By.XPATH, '//*[@id="yzm"]') # 定位登录表单中的验证码输入框
user_input.send_keys(name) # 在输入框中输入“用户名”
password_input.send_keys(password) # 在输入框中输入“密码”
captcha = baiduOCR("pic1.png")
closs_input.send_keys(captcha) # 在输入框中输入"验证码"
long_in = browser.find_element(By.XPATH,
'/html/body/div[1]/div[2]/div[2]/form/div/div/div[1]/div[5]/button') # 定位登录按钮
actions = ActionChains(browser)
actions.click(long_in).perform() # 执行点击登录按钮操作
browser.switch_to.window(browser.window_handles[-1]) # 切换到用户主界面
ActionChains(browser).key_down(Keys.CONTROL).send_keys("t").key_up(Keys.CONTROL).perform()
该部分主要通过模拟登录来首先,自动化登录。首先我们需要使用驱动ChromeDriver,来模拟Chrome浏览器,当然也可以用其他浏览器,需要去下载相应的驱动,这里作者以Chrome为例,如何下载使用请参考这篇文章:
chromedriver使用
。
我们模拟登录除了手动输入用户名和密码传递到网页外,最大的难点就是
如何自动填写当前时刻的验证码
,我最开始以爬虫的思路直接获取当前时刻验证码的url并下载保存验证码图片,结果发现下载后的图片与登录界面中显示的图片完全不相同,无法通过图片的URL直接保存当前时刻的图片验证码,后来通过不断寻找解决方法,参考思路,我突然想到可以直接保存当前时刻的登录界面,直接保存整个界面图片,并且识别出验证码所在的位置,将其从登录界面裁剪出来,即可得到当前时刻的验证码图片。然而图像的识别又是另一难点,在这里我才用的是百度开放平台提供的第三方识别文字工具——
AI开发平台
,至于如何使用可以参考:
使用Python调用百度OCR
。
在这个平台中新用户都可以领取到识别次数,要是没有领取,程序运行的时候就会报错,所以新用户记得都去领取一下。
对于验证码图像识别百度提供的库也存在一定的缺陷,对于干扰性线条多的验证码就无法正确的进行识别,我们可以使用另外一种识别方法
OCR工具pytesseract
,可以对图像进行大精度的识别处理,常见的验证码如下:
XPATH参数的获取,可以对教务系统页面源代码进行查看,右键获取输入框和验证码的XPATH值
模拟登录中的点击事件也是自动化的一个重要板块,如何点击可以看看这篇:
python+selenium实现登录账户后自动点击
https://blog.csdn.net/lijun538/article/details/50695914
5.baiduOCR()图像处理识别函数——基于百度图像识别技术
def baiduOCR(picfile):
#百度识别技术
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
i = open(picfile, 'rb')
img = i.read()
""" 调用通用文字识别(高精度版) """
message = client.basicAccurate(img)
i.close()
return message['words_result'][0]['words'] #返回验证码值
这个函数我就不做过多介绍,如何使用请看上文——
使用Python调用百度OCR
6.结语
最后我还将.py文件和图片打包成为了一个可执行的EXE文件,直接在桌面就可以使用,想要使用或者学习的小伙伴可以直接私信我。本文所使用的方式和代码还有很多不足的地方,也有一些BUG还没有解决,验证码识别不一定每一次都能正确的识别出来,需要多运行几次,大概率是可以正常识别出来,不影响正常的使用,这也是我第一个自己写的小程序,大佬勿喷。