# -*- coding:utf-8 -*-# 用于http请求
import requests# 解析HTML和XML
import bs4# 操作系统的命令操作模块
import os# 在内存中读写str
import io# 图形界面第三方库
from tkinter import *import tkinter as tk# 对话框
import tkinter.messagebox as messageboxfrom  tkinter import ttk# 图像处理库
from PIL import Image, ImageTk# 把URL字符串拆分成组件,能把组件合并成URL和将一个相对的URL转成一个抽象的URL,从而的到一个基本的URL标准格式。简单的说就是可以拆分URL,也可以拼接URL
from urllib.parse import quote# 用于对字符串进行操作
import  string# 正则表达式
import re# from urllib.request import urlopenurl = 'http://jwxt.jit.edu.cn/default2.aspx'#教务管理系统登录网址
xs_url = 'http://jwxt.jit.edu.cn/xs_main.aspx?xh='#教务管理系统网址
code_url = 'http://jwxt.jit.edu.cn/CheckCode.aspx'#验证码网址
schedule_url = 'http://jwxt.jit.edu.cn/xskbcx.aspx?xh='#课表网址data = {'__VIEWSTATE': '','txtUserName': '',#用户名'Textbox1':'','TextBox2': '',#密码'txtSecretCode': '',#验证码'RadioButtonList1': '%D1%A7%C9%FA',#选择按钮 学生(这里需要手动编码成gbk编码)'Button1': '','lbLanguage': '','hidPdrs': '','hidsc':'',}headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Content-Length': '205','Content-Type': 'application/x-www-form-urlencoded',#'Cookie': '','Host': 'jwxt.jit.edu.cn','Origin': 'http://jwxt.jit.edu.cn','Referer': 'http://jwxt.jit.edu.cn/default2.aspx','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}class Application(tk.Frame):def __init__(self, master=None):super().__init__(master)self.pack()self.create_widgets()def create_widgets(self):# 用户名self.nameLabel = Label(self, text='用户名:')self.nameLabel.grid(row=0,column=0,sticky=W)self.nameInput = Entry(self)self.nameInput.grid(row=0,column=1,sticky=W)# 密码self.passwordLabel = Label(self, text='密   码:')self.passwordLabel.grid(row=1,column=0,sticky=W)self.passwordInput = Entry(self,show = "*")self.passwordInput.grid(row=1,column=1,sticky=W)# 验证码self.codeLabel = Label(self, text='验证码:')self.codeLabel.grid(row=2,column=0,sticky=W)self.codeInput = Entry(self)self.codeInput.grid(row=2,column=1,sticky=W)# 获取验证码图片self.code_refresh()# 刷新验证码图片self.codeRefresh = tk.Button(self, text="看不清,换一张", fg="blue")session = self.code_refresh()self.codeRefresh["command"] = self.code_refresh     # 点击按钮触发code_refresh重新获取验证码self.codeRefresh.grid(row=2,column=2,sticky=W)# 登录按钮self.login = tk.Button(self)self.login["text"] = "登录"self.login["command"] = self.start    # 点击按钮触发startself.login.grid(row=3,column=1,sticky=W)# 退出按钮self.quit = tk.Button(self, text="退出", fg="red",command=root.destroy)self.quit.grid(row=3,column=1,sticky=E)# 提示信息self.ps = Label(self, text='已默认为学生')self.ps.grid(row=4,column=0,sticky=W)def code_refresh(self):image_bytes = session.get(code_url).content     # urlopen(code_url).read()  # 获取验证码网页回应data_stream = io.BytesIO(image_bytes)   # 作为PIL图像对象开放load = Image.open(data_stream)w, h = load.sizef = 1    # 缩放比w_box,h_box = int(w*f),int(h*f) # 获取缩放后的图像大小load_resized = load.resize((w_box,h_box),Image.ANTIALIAS)render = ImageTk.PhotoImage(load_resized)img = Label(self,image=render)img.image = renderimg.place(x=150,y=45)return sessiondef get_post_data(self):html = session.get(url)#获取登陆界面的htmlsoup = bs4.BeautifulSoup(html.text, 'html.parser')__VIEWSTATE = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']#找到验证参数__VIEWSTATE#print(__VIEWSTATE)# 构造需要post的参数表data['__VIEWSTATE'] = __VIEWSTATE# 用户名#data['txtUserName'] = self.nameInput.get()# 密码#data['TextBox2'] = self.passwordInput.get()# 验证码data['txtSecretCode'] = self.codeInput.get()return session# 登录教务系统def login_post_data(self):res = session.post(url,data=data,headers=headers)#print(res.text)return sessiondef schedule(self,schedule_url,name):header = {'Referer': xs_url,'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',}#print(schedule_url)name = quote(name,safe = string.printable,encoding='gb2312')   # safe表示可以忽略的字符  #print(name)schedule_url = schedule_url+data['txtUserName']+'&xm='+name+'&gnmkdm=N121603'#print(schedule_url)res = session.get(schedule_url,headers=header)soup = bs4.BeautifulSoup(res.text, 'html.parser')#print(soup)#测试#label#formlist = soup.find_all('table',class_='formlist noprint')#print(formlist[0].text)#table1table1 = soup.find_all('table',class_='blacktab')#print(table1[0])list=[]for tr in table1[0].find_all('tr'):#print(tr)for td in tr.find_all('td'):tdstr = str(td)#print(td)tdstr_replace = tdstr.replace(r'<br/>','\n')#用换行符替换'<br/>'  #print(tdstr_replace)while True:                      #去掉无用字符 index_begin = tdstr_replace.find("<")  index_end = tdstr_replace.find(">",index_begin + 1)  if index_begin == -1:  break  tdstr_replace = tdstr_replace.replace(tdstr_replace[index_begin:index_end+1],"")  #print(tdstr_replace)list.append(tdstr_replace)#print(list)#for i in range(0,len(list)):#print(list[i])return listdef start(self):session = self.get_post_data()#print(data)xs2_url = xs_url+data['txtUserName']#print(xs2_url)# 模拟登录教务系统session = self.login_post_data()test = session.get(xs2_url)# 测试看看是否能找到登陆后的信息soup = bs4.BeautifulSoup(test.text, 'html.parser')try:name = soup.find('span', attrs={'id': 'xhxm'}).textlist = []list = self.schedule(schedule_url,name[0:-2])except:name = '登录失败'self.code_refresh()#print(name)messagebox.showinfo('Message', name+'\n'+str(list))# 尝试做出表格#for i in range(0,len(list)):#    if (i+1)%7 == 0:#        bookList = []#        bookList = list[i]#print(bookList)    frame=tk.Frame(root)  frame.pack(fill='both',expand='false')  tree=tk.Treeview(frame)#表格  tree["columns"]=("时间","星期一","星期二","星期三","星期四","星期五","星期六","星期日")  tree.heading("时间",text="时间")  #显示表头  tree.heading("星期一",text="星期一")  tree.heading("星期二",text="星期二")tree.heading("星期三",text="星期三")tree.heading("星期四",text="星期四")tree.heading("星期五",text="星期五")tree.heading("星期六",text="星期六")tree.heading("星期日",text="星期日") for item in list:  tree.insert('','end',values=item)  #tree.insert("",0,text="line1" ,values=("1","2","3")) #插入数据,  #tree.insert("",1,text="line1" ,values=("1","2","3"))  #tree.insert("",2,text="line1" ,values=("1","2","3"))  #tree.insert("",3,text="line1" ,values=("1","2","3"))  tree.pack() # 通过requests库构造一个浏览器session,这能帮我们自动、持久的管理cookies
session = requests.session()root = tk.Tk()
# 设置窗口标题:
root.wm_title("正方教务管理系统——by_Toshio")
# 设置窗口大小
root.geometry("400x300+300+100")
app = Application(master=root)
# 主消息循环
app.mainloop()

模拟登录学校教务系统网站相关推荐

  1. 用Python模拟登录学校教务系统抢课

    --  Illustrations by Vladislav Solovjov -- ♚ 作者:小苏打 博客地址:https://vhyz.me GitHub地址:github.com/vhyz/ZF ...

  2. 抢课不再凭手速和运气,Python模拟登录学校教务系统抢课

    前言: 最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,不用再担心手速跟不上,抢啥中啥.不用再承受抢不中想去的课,最后被调剂到各种"灭绝师太&q ...

  3. 用 Python 实现模拟登录正方教务系统抢课

    (点击上方蓝字,快速关注我们) 作者:小苏打 https://vhyz.me/2018/06/12/用Python实现模拟登录正方教务系统抢课/ 最近学校开始选课,但是如果选课时间与自己的事情冲突,这 ...

  4. 用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

  5. asp 退出登录修改cookie能进入后台_用Python实现模拟登录正方教务系统抢课

    6月23日更新:由于国内高校正方教务系统或多或少都会有所不同,所以细节地方还是需要自己修改的,我这个过程也只是一个案例,但这其中的本质上是不变的,即是抓包分析. 如果有什么不懂的,可以在评论区评论,或 ...

  6. python模拟登录教务系统_用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

  7. python多次登录教务系统_python3模拟登录正方教务系统

    刚学了大概两周的python ,顺便搞了下爬虫.试着用python模拟登录学校的教务系统. 看了个教程,附上链接 参照教程做了一下,发现系统经过一些变动,原教程还有很多可以改进的地方 准备工作 先来看 ...

  8. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

  9. python抢课脚本 验证码_用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作. 而且整个流程是比较简单,这是因为正方 ...

最新文章

  1. 扩展源_Ubuntu14版本下无法使用php7.2版本的bcmath扩展
  2. 2011-04-21 运程连Oracle的方法
  3. python【数据结构与算法】倍增思想
  4. DSP 28335中GPIO配置
  5. linux p2p视频播放器,avplayer: 一个基于FFmpeg、libtorrent的P2P播放器实现.
  6. php父子遍历,php无限分类父子追溯方法
  7. WPF 自定义BarChartControl(可左右滑动的柱状图)
  8. 年薪50W测试大牛,分享测试开发基础知识
  9. Spring项目启动后报连接MYSQL错误两则
  10. python椭圆花瓣_Python抓取花瓣网高清美图
  11. 如何在html上显示时间设置,如何在网页上显示日期的两种方法
  12. 详解 LVS、Nginx 及 HAProxy 工作原理
  13. Android Studio 编译 UVCCamera
  14. API 接口监控产品全新改版,免费开放全部功能
  15. 原创轻量VIO算法、简单易上手——XRSLAM帮你快速搭建移动平台AR应用
  16. 关于大三学生的请教回复
  17. LeetCode的SQL题练手(MySQL实现)
  18. 完整iOS APP发布App Store上架流程指南
  19. 无法打开位置服务器,电脑的定位功能无法打开怎么办?
  20. PTA ## 统计字符

热门文章

  1. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验三《敏捷开发与XP实践》 实验报告...
  2. UE5 官方案例Lyra 全特性详解 8.如何用配置表初始化角色数据
  3. echart 正负图
  4. oracle导出1455,oracle 11g导出数据时报ORA 1455错误的处理方法
  5. Python字典以及方法的测试
  6. JS算法:广度优先搜索(BSF)的理解
  7. 如何升级 Debian 10 (Buster) 到 Debian 11 (Bullseye) ?
  8. 万科成都再现欺诈门,业主集体抵制狗洞式入户
  9. 【Android】App首页上下滚动快报控件 通知控件 类似京东快报控件(二)
  10. 计算机辅助制造题库选择题,《机械设计基础习题库