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 random

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--no-sandbox")


class Chachengji(object):
    username = u"1018230x" # 填你的学号
    passwd = u"xxxxx" #填你的密码

    xueqi = '2018-2019-2' #你想查哪个学期的成绩,注意格式正确

    _user = "[email protected]" # 你获得授权码的邮箱
    _pwd = "xxxxxxxx" # 授权码
    _to = "[email protected]" # 成绩更新后发邮件到哪个邮箱

    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:
                break

    def send(self, text):
        import smtplib
        from email.mime.text import MIMEText

        msg = MIMEText(text)
        msg["Subject"] = "你的成绩更新了!"
        msg["From"] = self._user
        msg["To"] = self._to
        s = 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.old
                text = ''
                for i in data2:
                    current_window = self.driver.current_window_handle
                    data[i][2].click()
                    handles = self.driver.window_handles
                    for 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()

就把脚本挂在阿里云上跑着就行啦,成绩更新了就会发邮件到手机上的。
效果图:
python3 + selenium 进行强智教务成绩的刷新以及通知成绩(华东理工大学 某ecust)_第1张图片

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