因为懒,我的实习日志只是每天登录+复制粘贴就行了,但是每天都是重复干同一件事就想着能不能更懒,每天只要点一下鼠标就完事,于是这篇文章诞生了。
(其实以前吧,还写过批量提交、智能生成等…但是后面觉得太嚣张+学校网站改成了只能提交当天日志,当天就当天吧)
环境的介绍
python 随便下个3.x版本
selenium python的一个库,在控制台输入安装pip install selenium
webdriver 浏览器驱动,不同浏览器对应不同的驱动,我用的是Chrome,就下载chrome的驱动,点击选择版本下载
下载的 webdriver 是一个压缩包,将其解压加入全局路径(mac版不需要),为了省事,我直接把 webdriver 放到了 python 同级目录(因为python在安装时加入了全局路径),如果不加入全局路径会出错就是了。
百度api 就是一个库, 安装就完事了 pip install baidu-aip
从这里开始吧
第一步,登录页面
准备好登录页面的 url http://219.137.26.162:83/sxoa/
直接用 selenium 操控chrome访问过去
from selenium import webdriver
login_url = 'http://219.137.26.162:83/sxoa/' # 登录网址
browser = webdriver.Chrome() # 启动浏览器
browser.get(login_url) # 访问
运行代码可以来到如下页面,可以看到登录步骤只需填写账号、密码、验证码再点击登录即可。
用代码让浏览器帮我们填入账号、密码。selenium 提供了很多种办法找到你需要填入信息的元素,选择其中一种即可,这里选择的是by_id。
本文的代码是从上一片代码逐渐往下增加
txtID = browser.find_element_by_id('txtID') # 账号
txtPwd = browser.find_element_by_id('txtPwd') # 密码
txtID.send_keys('你的账号') # 填写账号
txtPwd.send_keys('你的密码') # 填写密码
好好写上你的学号密码,还差一个验证码,因为学校的验证码比较简单,交给百度进行识别能达到80%以上的准确率。行下面开始随便了解了解百度的api。
1.百度云的登录页面,自己注册个百度账号进去
https://login.bce.baidu.com/?account=&redirect=http%3A%2F%2Fconsole.bce.baidu.com%2Fai%2F%3Ffromai%3D1#/ai/imagerecognition/overview/index
2.创建应用,创建的时候记得勾选上通用文字识别(这个非常重要,很多人在这里错了找不到答案),不然会显示No permission to access data… 创建好之后可以在应用列表查看一些key,id等的信息。这些东西在后面写代码进行引用百度api的时候用到。
3.写代码
from aip import AipOcr
AppID = '上文提到的appid'
API_Key = '这里填 Api Key'
Secret_Key = '这里填 Secret Key'
# 创建客户端,即连接百度服务
client = AipOcr(AppID, API_Key, Secret_Key)
# 验证码 url
img_url = 'http://219.137.26.162:83/sxoa/images/check.jpg'
# 远程文字识别
result = client.basicGeneralUrl(img_url)
谈一下 img_url ,因为Chrome进去的时候就获取了验证码,所以再次访问的时候服务器根据你的 cookie 给你图片,也就是直接访问图片地址与登录页面的验证码其实是同一个,直接把地址给百度就好了。
得到的 result 是一个字典,只要把其中的 words 提取出来即可,有时候识别不准确,要是有空可以用 try 识别到正确再登录,因为我懒本文就不做验证码错误的处理了,如果直接拿下文的完整代码,错了就重新运行代码吧。
这个是 result 的格式参考,非代码,非代码
{'log_id': 6901985564077557840, 'words_result_num': 1, 'words_result': [{'words': 'ZHBJ'}]}
接着往下写登录的代码,选择到登录的按钮,再执行 selenium 提供的 click() 函数
# 验证码输入
txtCode = browser.find_element_by_id('txtCode')
txtCode.send_keys(result['words_result'][0]['words'])
# 登录
submit = browser.find_element_by_id('btnSubmit')
submit.click()
第二步,写日志
此时登录成功,到了首页。直接跳转到写日志界面,如果不知道url的自己用浏览器开发者工具抓一下包。
从上图可以看到我们需要跳转的 url 后有一个参数date,这其实是当天日期,用内置 datetime 库在 date 上补上当天日期就开始跳转吧
import datetime
# 今天日期
today = str(datetime.date.today())
# 写日志 url
daily_url = 'http://219.137.26.162:83/SXOA/Daily_Record/daily_record_add.aspx?date={}'.format(today)
# 跳转
browser.get(daily_url)
跳转成功到达以下页面,可以看到已经自动为我们填上了姓名和日期,因为上一步已经在 date 后面加了时间的参数。实际上需要操控浏览器填上的信息有三个,标题、地点、工作内容。
接下来的操作和登录页面一样,通过 id 选择到元素,再输入提交即可。
txtDRTitle = browser.find_element_by_id('txtDRTitle') # 标题
txtDRAddr = browser.find_element_by_id('txtDRAddr') # 地点
txtDRContent = browser.find_element_by_id('txtDRContent') # 内容
daily_submit = browser.find_element_by_id('btn') # 提交按钮
# 发送
txtDRTitle.send_keys('{}日志'.format(today))
txtDRAddr.send_keys('广州')
txtDRContent.send_keys('今天也是充满希望的一天')
# 提交
daily_submit.click()
到此就完事了,设置好内容,每天点一下就完了,如果你点都不想点,那行,百度一下每日到点自动运行即可。
完整代码
from selenium import webdriver
from aip import AipOcr
import datetime
'''登录部分'''
login_url = 'http://219.137.26.162:83/sxoa/' # 登录网址
browser = webdriver.Chrome() # 启动浏览器
browser.get(login_url) # 访问
txtID = browser.find_element_by_id('txtID') # 账号
txtPwd = browser.find_element_by_id('txtPwd') # 密码
txtID.send_keys('你的账号') # 填写账号
txtPwd.send_keys('你的密码') # 填写密码
# 百度验证码识别
AppID = '你的 APP ID'
API_Key = '你的 API key'
Secret_Key = '你的 Secret key'
# 创建客户端,即连接百度服务
client = AipOcr(AppID, API_Key, Secret_Key)
# 验证码 url
img_url = 'http://219.137.26.162:83/sxoa/images/check.jpg'
# 远程文字识别
result = client.basicGeneralUrl(img_url)
# 验证码输入
txtCode = browser.find_element_by_id('txtCode')
txtCode.send_keys(result['words_result'][0]['words'])
# 登录
submit = browser.find_element_by_id('btnSubmit')
submit.click()
'''首页部分'''
# 今天日期
today = str(datetime.date.today())
# 写日志 url
daily_url = 'http://219.137.26.162:83/SXOA/Daily_Record/daily_record_add.aspx?date={}'.format(today)
# 跳转
browser.get(daily_url)
txtDRTitle = browser.find_element_by_id('txtDRTitle') # 标题
txtDRAddr = browser.find_element_by_id('txtDRAddr') # 地点
txtDRContent = browser.find_element_by_id('txtDRContent') # 内容
daily_submit = browser.find_element_by_id('btn') # 提交按钮
# 发送
txtDRTitle.send_keys('{}日志'.format(today))
txtDRAddr.send_keys('广州')
txtDRContent.send_keys('今天也是充满希望的一天')
# 提交
daily_submit.click()
庸了个白,才华与美貌集于一身