python3 + selenium 进行强智教务成绩的刷新以及通知成绩(华东理工大学 某ecust)

强智教务自动刷新教务处成绩,更新后发邮件通知,以某ECUST华理为例子。此处的ECUST华理教务系统是18年9月后的新系统

Windows端或者挂在阿里云上都可以,下文示例是在Ubuntu上运行的。
这代码是拿某ECUST教务系统测试的,如果是其他学校的强智教务系统自己改一下,有可能页面元素的id,xpath什么的不一定相同。

  1. 安装好Chrome和Chromedriver,此处就不放教程了
  2. 安装好selenium这个包
  3. 如果想邮箱收到成绩更新通知就提前弄好smtp授权码等等,我这个代码用的qq邮箱发送的,如果是其他邮箱的话记得改端口
  4. 代码如下:
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select
import randomchrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--no-sandbox")class Chachengji(object):username = u"1018230x" # 填你的学号passwd = u"xxxxx" #填你的密码xueqi = '2018-2019-2' #你想查哪个学期的成绩,注意格式正确_user = "xxxxxxxxx@qq.com" # 你获得授权码的邮箱_pwd = "xxxxxxxx" # 授权码_to = "xxxxxxxx@qq.com" # 成绩更新后发邮件到哪个邮箱login_url = "http://inquiry.ecust.edu.cn/jsxsd/" # 登录页afterlogin_url = 'http://inquiry.ecust.edu.cn/jsxsd/framework/xsMain.jsp' # 登录后跳转到的页面kscj_url = "http://inquiry.ecust.edu.cn/jsxsd/kscj/cjcx_query" # 查成绩的页面,注意是要可以选学期的那个页面,不是学生成绩卡old = set(['线性代数','物理与现代科技','体育(2)','军事理论','Python程序设计','中国文化概论(MOOC)','大学生职业生涯规划与管理','高等数学(下)','大学英语Ⅱ','新生心理健康教育',]) # 用来存放已经出成绩了的科目的集合def __init__(self):print("开始查成绩")def login(self):self.driver.get(self.login_url)self.driver.find_element_by_id("userAccount").send_keys(self.username)self.driver.find_element_by_id("userPassword").send_keys(self.passwd)print("等待验证码,自行输入....")while True:if self.driver.current_url != self.afterlogin_url:sleep(1)else:breakdef send(self, text):import smtplibfrom email.mime.text import MIMETextmsg = MIMEText(text)msg["Subject"] = "你的成绩更新了!"msg["From"] = self._usermsg["To"] = self._tos = smtplib.SMTP_SSL("smtp.qq.com", 465) # 如果是其他邮箱的话记得改端口s.login(self._user, self._pwd)s.sendmail(self._user, self._to, msg.as_string())s.quit()def start(self):self.driver = webdriver.Chrome(chrome_options=chrome_options)self.driver.set_window_size(1400, 1000)self.login()self.driver.get(self.kscj_url)print('开始查询成绩')xueqi_select = Select(self.driver.find_element_by_id('kksj'))xueqi_select.select_by_value(self.xueqi)self.driver.find_element_by_id('btn_query').click()while True:dl = self.driver.find_elements_by_id('dataList')table1, table2 = dl[0], dl[1]table_rows1 = table1.find_elements_by_tag_name('tr')table_rows2 = table2.find_elements_by_tag_name('tr')data = {}for i in table_rows1[1:]:j = i.find_elements_by_tag_name('td')data[j[2].text] = j[10].text, j[11].text, j[10]for i in table_rows2[1:]:j = i.find_elements_by_tag_name('td')data[j[2].text] = j[10].text, j[11].text, j[10]new = set(data.keys())if new != self.old:data2 = new - self.oldtext = ''for i in data2:current_window = self.driver.current_window_handledata[i][2].click()handles = self.driver.window_handlesfor j in handles:if j != current_window:self.driver.switch_to.window(j)tb = self.driver.find_element_by_id('dataList')trs = tb.find_elements_by_tag_name('tr')for k in trs[1:]:tds = k.find_elements_by_tag_name('td')text += i + ':\n' + '\t  期末成绩:' + tds[1].text + '\t  平时成绩:' + \tds[2].text + '\t  总成绩:' + tds[3].text + '\n'self.driver.find_element_by_xpath('/html/body/div[1]/div/a').click()self.driver.switch_to.window(current_window)self.send(text)  # 将新出成绩的科目的成绩信息发送到邮箱self.old = new   # 将目前已出成绩的科目信息更新sleep(random.randint(10,15))self.driver.refresh()if __name__ == "__main__":a = Chachengji()a.start()

就把脚本挂在阿里云上跑着就行啦,成绩更新了就会发邮件到手机上的。
效果图:
在这里插入图片描述

Published by

风君子

独自遨游何稽首 揭天掀地慰生平