Merge branch 'tkinter' into courseTable
This commit is contained in:
commit
987081e6d3
37
API_Usage.py
37
API_Usage.py
@ -1,7 +1,8 @@
|
|||||||
from config import CONFIG
|
from config import CONFIG
|
||||||
from api.moodle import Moodle
|
from api.moodle import MoodleAPI
|
||||||
from api.ncnuMain import NcnuMain
|
from api.ncnuMain import NcnuMainAPI
|
||||||
from api.ncnu import NCNU
|
from api.ncnu import NcnuAPI
|
||||||
|
from api.eventRigestry import EventRegistry
|
||||||
|
|
||||||
def space():
|
def space():
|
||||||
print("\n" + "="*20 + "\n")
|
print("\n" + "="*20 + "\n")
|
||||||
@ -9,7 +10,7 @@ def space():
|
|||||||
# =================== TEST Moodle API ==========================
|
# =================== TEST Moodle API ==========================
|
||||||
|
|
||||||
# ===== Test 登入 =====
|
# ===== Test 登入 =====
|
||||||
moodle = Moodle(CONFIG['moodle']['username'], CONFIG['moodle']['password'])
|
moodle = MoodleAPI(CONFIG['moodle']['username'], CONFIG['moodle']['password'])
|
||||||
if moodle.status:
|
if moodle.status:
|
||||||
|
|
||||||
# ===== Test 取得該學期課程資料 =====
|
# ===== Test 取得該學期課程資料 =====
|
||||||
@ -40,7 +41,7 @@ else:
|
|||||||
# =================== Test 暨大官網 API ==========================
|
# =================== Test 暨大官網 API ==========================
|
||||||
|
|
||||||
# ===== Test 取得暨大官網最新消息 =====
|
# ===== Test 取得暨大官網最新消息 =====
|
||||||
main = NcnuMain()
|
main = NcnuMainAPI()
|
||||||
for anno in main.getAnno():
|
for anno in main.getAnno():
|
||||||
print(anno)
|
print(anno)
|
||||||
space()
|
space()
|
||||||
@ -50,7 +51,7 @@ space()
|
|||||||
# =================== Test 暨大教務系統 API ==========================
|
# =================== Test 暨大教務系統 API ==========================
|
||||||
|
|
||||||
# ===== Test 登入 =====
|
# ===== Test 登入 =====
|
||||||
ncnu = NCNU(CONFIG['NCNU']['username'], CONFIG['NCNU']['password'])
|
ncnu = NcnuAPI(CONFIG['NCNU']['username'], CONFIG['NCNU']['password'])
|
||||||
if ncnu.status:
|
if ncnu.status:
|
||||||
|
|
||||||
# ===== Test 下載課表 =====
|
# ===== Test 下載課表 =====
|
||||||
@ -99,3 +100,27 @@ if ncnu.status:
|
|||||||
space()
|
space()
|
||||||
else:
|
else:
|
||||||
print("NCNU 教務系統登入失敗")
|
print("NCNU 教務系統登入失敗")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# =================== Test 暨大活動報名系統 API ==========================
|
||||||
|
|
||||||
|
# ===== Test 登入 =====
|
||||||
|
eventReg = EventRegistry(CONFIG['NCNU']['username'], CONFIG['NCNU']['password'])
|
||||||
|
if eventReg.status:
|
||||||
|
print("登入成功")
|
||||||
|
space()
|
||||||
|
|
||||||
|
# ===== Test 取得所有活動第一頁的列表 =====
|
||||||
|
for event in eventReg.getEventsList():
|
||||||
|
print(event)
|
||||||
|
space()
|
||||||
|
|
||||||
|
# ===== Test 報名前準備 request body =====
|
||||||
|
requestBody = eventReg.signUpPrepare('3010')
|
||||||
|
for key, value in requestBody.items():
|
||||||
|
print("{}: {}".format(key, value))
|
||||||
|
space()
|
||||||
|
else:
|
||||||
|
print("登入失敗")
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
from tkinter import *
|
from tkinter import *
|
||||||
from api.moodle import Moodle
|
from api.moodle import MoodleAPI
|
||||||
from config import CONFIG
|
from config import CONFIG
|
||||||
from tkhtmlview import HTMLLabel
|
from tkhtmlview import HTMLLabel
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ def getIdAndName(course):
|
|||||||
|
|
||||||
|
|
||||||
def createMoodleWin():
|
def createMoodleWin():
|
||||||
moodle = Moodle(CONFIG['moodle']['username'], CONFIG['moodle']['password'])
|
moodle = MoodleAPI(CONFIG['moodle']['username'], CONFIG['moodle']['password'])
|
||||||
|
|
||||||
if moodle.status:
|
if moodle.status:
|
||||||
# ===== 取得課程ID與名稱 =====
|
# ===== 取得課程ID與名稱 =====
|
||||||
|
|||||||
100
Ncnu.py
Normal file
100
Ncnu.py
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
from tkinter import *
|
||||||
|
from api.ncnu import NcnuAPI
|
||||||
|
from config import CONFIG
|
||||||
|
from tkinter import messagebox
|
||||||
|
from tkhtmlview import HTMLLabel
|
||||||
|
|
||||||
|
def createNcnuWin():
|
||||||
|
ncnu = NcnuAPI(CONFIG['NCNU']['username'], CONFIG['NCNU']['password'])
|
||||||
|
if ncnu.status:
|
||||||
|
def dlCurriculum(sem):
|
||||||
|
if ncnu.getCourseTable(sem):
|
||||||
|
messagebox.showinfo(message="{} 課表已經儲存到 ./{}課表.pdf".format(sem,sem))
|
||||||
|
else:
|
||||||
|
messagebox.showwarning(message="無法存取 {} 課表".format(sem))
|
||||||
|
win=Tk()
|
||||||
|
leftframe=Frame(win)
|
||||||
|
leftframe.pack(fill=BOTH,side=LEFT)
|
||||||
|
rightframe=Frame(win)
|
||||||
|
rightframe.pack(side=RIGHT)
|
||||||
|
|
||||||
|
textlb=Label(leftframe,text="我的學習紀錄",font="Helvetica 20")
|
||||||
|
options=["各學期成績總覽","指定學期的成績列表","缺曠課記錄","獎懲紀錄","加選課程狀態"]
|
||||||
|
optionsListbox=Listbox(leftframe)
|
||||||
|
optionsListbox.insert(END,*options)
|
||||||
|
chooseSemesterLb=Label(leftframe,text="指定學期",font="Helvetica 10")
|
||||||
|
|
||||||
|
chooseSemesterEntry=Entry(leftframe)
|
||||||
|
chooseSemesterEntry.insert(0,"1092")
|
||||||
|
downloadBtn=Button(leftframe,text="下載課表",command=lambda:dlCurriculum(chooseSemesterEntry.get()))
|
||||||
|
|
||||||
|
|
||||||
|
textlb.pack(fill=BOTH,expand=True)
|
||||||
|
optionsListbox.pack(fill=BOTH)
|
||||||
|
chooseSemesterLb.pack(fill=BOTH)
|
||||||
|
chooseSemesterEntry.pack(fill=BOTH)
|
||||||
|
downloadBtn.pack()
|
||||||
|
|
||||||
|
htmlLb=HTMLLabel(rightframe,html="")
|
||||||
|
htmlScrollbar=Scrollbar(rightframe)
|
||||||
|
htmlLb.configure(yscrollcommand=htmlScrollbar.set)
|
||||||
|
|
||||||
|
htmlScrollbar.pack(fill=Y,side=RIGHT)
|
||||||
|
htmlLb.pack()
|
||||||
|
|
||||||
|
def itemSelected(event):
|
||||||
|
obj = event.widget
|
||||||
|
Index = obj.curselection()
|
||||||
|
|
||||||
|
Html=''''''
|
||||||
|
if str( obj.get(Index) ) == options[0]:
|
||||||
|
scores = ncnu.getScoreSummary()
|
||||||
|
for c in scores['semesters']:
|
||||||
|
Html+='''<tr> <td>學期:{}</td> <td>修課數:{}</td> <td>通過數:{}</td> <td>學分數:{}</td> <td>平均分數:{}</td> <td>排名:{}</td></tr><p>'''.format(c.get("semester"),
|
||||||
|
c.get("select_num"),c.get("pass_Num"),c.get("pass_credit"),c.get("average"),c.get("rank") )
|
||||||
|
c=scores['sum']
|
||||||
|
Html+='''<tr> <td>學期{}</td> <td>修課數:{}</td> <td>通過數:{}</td> <td>學分數:{}</td> <td>{}</td> <td>{}</td></tr>'''.format(c.get("semester"),
|
||||||
|
c.get("select_num"),c.get("pass_Num"),c.get("pass_credit"),c.get("average"),c.get("rank") )
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
|
||||||
|
elif str( obj.get(Index) ) == options[1]:
|
||||||
|
scores = ncnu.getScore(chooseSemesterEntry.get())
|
||||||
|
for i in scores:
|
||||||
|
Html+="<tr><td>代號: {}</td> <td>班號: {}</td> <td>課程名稱: {}</td> <td>學分數: {}</td><td>老師: {}</td> <td>時間: {}</td> <td>地點: {}</td> <td>學分: {}</td> <td>分數: {}</td> <td>是否為必修?: {}</td></tr><p>".format(i.get("number"),
|
||||||
|
i.get("class"),i.get("name"),i.get("credit"),i.get("teacher"),i.get("time"),i.get("place"),i.get("credit"),i.get("score"),i.get("mandatary") )
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
elif str( obj.get(Index) ) == options[2]:
|
||||||
|
absenceLogs = ncnu.getAbsenceLogs()
|
||||||
|
if absenceLogs:
|
||||||
|
for log in absenceLogs:
|
||||||
|
Html+='''<tr> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td></tr>'''.format(log.get('id'),
|
||||||
|
log.get('semester'),log.get('classname'),log.get('date'),log.get('time'))
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
else:
|
||||||
|
Html+='''<h3>沒有任何缺曠課記錄</h3>'''
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
elif str( obj.get(Index) ) == options[3]:
|
||||||
|
awardLogs = ncnu.getAwardLogs()
|
||||||
|
if awardLogs:
|
||||||
|
for log in awardLogs:
|
||||||
|
Html+='''<tr> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td> <td>{}</td></tr>'''.format(log.get('id'),
|
||||||
|
log.get('semester'),log.get('award'),log.get('count'),log.get('content'))
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
else:
|
||||||
|
Html+='''<h3>沒有任何缺曠課記錄</h3>'''
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
elif str( obj.get(Index) ) == options[4]:
|
||||||
|
logs = ncnu.getAddCourseLogs()
|
||||||
|
if logs:
|
||||||
|
for log in logs:
|
||||||
|
Html+='''<tr> <td> {} </td> <td>學期: {} </td> <br> <td>課名: {} </td> <td>班別: {} </td> <td>加選狀態:{}</td></tr><p>'''.format(log.get('id'),
|
||||||
|
log.get('semester'),log.get('classname'),log.get('class'),log.get('check'))
|
||||||
|
htmlLb.set_html(Html)
|
||||||
|
optionsListbox.bind("<<ListboxSelect>>", itemSelected)
|
||||||
|
|
||||||
|
win.mainloop()
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("NCNU 教務系統登入失敗")
|
||||||
|
|
||||||
|
createNcnuWin()
|
||||||
@ -1,12 +1,12 @@
|
|||||||
from tkinter import *
|
from tkinter import *
|
||||||
from tkhtmlview import HTMLLabel
|
from tkhtmlview import HTMLLabel
|
||||||
from api.ncnuMain import NcnuMain
|
from api.ncnuMain import NcnuMainAPI
|
||||||
|
|
||||||
def createNcnuMainWin():
|
def createNcnuMainWin():
|
||||||
win=Tk()
|
win=Tk()
|
||||||
win.title("暨大官網最新資訊!")
|
win.title("暨大官網最新資訊!")
|
||||||
win.geometry("600x600")
|
win.geometry("600x600")
|
||||||
main = NcnuMain()
|
main = NcnuMainAPI()
|
||||||
Link='''<span style="background-color:#ffcccc"><ul>'''
|
Link='''<span style="background-color:#ffcccc"><ul>'''
|
||||||
textLb=Label(win,text="暨大校園最新資訊",font="Helvetica 20",bg="#ffcccc")
|
textLb=Label(win,text="暨大校園最新資訊",font="Helvetica 20",bg="#ffcccc")
|
||||||
|
|
||||||
|
|||||||
106
api/eventRigestry.py
Normal file
106
api/eventRigestry.py
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
import requests
|
||||||
|
from api.tools import *
|
||||||
|
|
||||||
|
class EventRegistry():
|
||||||
|
def __init__(self, username, password):
|
||||||
|
'''
|
||||||
|
initial 就登入
|
||||||
|
根據 self.status 判斷成功與否
|
||||||
|
'''
|
||||||
|
self.username = username # 學號
|
||||||
|
self.session = requests.Session()
|
||||||
|
self.status = self.login(username, password)
|
||||||
|
|
||||||
|
def login(self, username, password):
|
||||||
|
'''
|
||||||
|
登入活動報名系統
|
||||||
|
return bool
|
||||||
|
'''
|
||||||
|
# get login token
|
||||||
|
response = self.session.get('https://ccweb.ncnu.edu.tw/SLLL/login.asp')
|
||||||
|
loginToken = find(response, 'input', param={'name': 'token'}).get('value')
|
||||||
|
|
||||||
|
# request login page
|
||||||
|
response = self.session.post(
|
||||||
|
"https://ccweb.ncnu.edu.tw/SLLL/login.asp",
|
||||||
|
data={
|
||||||
|
'token': loginToken,
|
||||||
|
'username': username,
|
||||||
|
'password': password,
|
||||||
|
'type': ''
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# 成功的話 return http 302, redirect
|
||||||
|
if len(response.history)!=0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def getEventsList(self):
|
||||||
|
'''
|
||||||
|
取得活動列表中的第一頁
|
||||||
|
包含所有狀態的活動
|
||||||
|
'''
|
||||||
|
url = "https://ccweb.ncnu.edu.tw/SLLL/z6D3B52D553CA5831540D8CC7659967E58A62list.asp"
|
||||||
|
response = self.session.get(url)
|
||||||
|
|
||||||
|
with open('test.html') as fp:
|
||||||
|
response = fp.read()
|
||||||
|
|
||||||
|
root = BeautifulSoup(response, 'html.parser')
|
||||||
|
events = root.find('table').findAll('tr')
|
||||||
|
|
||||||
|
return [{
|
||||||
|
'id': getUrlParam(data[0].find('a').get('href').replace('&', '&'), 'RowID'),
|
||||||
|
# 活動詳細:
|
||||||
|
# https://ccweb.ncnu.edu.tw/SLLL/z6D3B52D553CA5831540D8CC7659967E58A62view.asp?showdetail=&RowID={}
|
||||||
|
|
||||||
|
'semester': data[1].text.replace('\n', ''),
|
||||||
|
'status': data[2].text.replace('\n', ''), # 活動報名狀態
|
||||||
|
'name': data[3].text.replace('\n', ''),
|
||||||
|
'time': data[4].text.replace('\n', ''), # 活動開始時間
|
||||||
|
'method': data[5].text.replace('\n', ''), # 報名方式
|
||||||
|
'hour': data[6].text.replace('\n', ''), # 時數
|
||||||
|
'speaker': data[7].text.replace('\n', ''), # 講師
|
||||||
|
'teacherEvent': data[8].text.replace('\n', ''), # 申請為教師知能活動
|
||||||
|
} for data in (event.findAll('td') for event in events[1:])]
|
||||||
|
|
||||||
|
def signUpPrepare(self, eventID):
|
||||||
|
'''
|
||||||
|
報名活動前的資料確認
|
||||||
|
return 報名系統預設給的資料,供使用者確認
|
||||||
|
'''
|
||||||
|
url = "https://ccweb.ncnu.edu.tw/SLLL/z7DDA4E0A5831540Dadd.asp?showmaster=z958B653E5831540D4E4B6D3B52D5660E7D30&fk_RowID={}"
|
||||||
|
response = self.session.get(url.format(eventID))
|
||||||
|
inputs = find(response, 'form').findAll('input')
|
||||||
|
|
||||||
|
values = [inputData.get('value') for inputData in inputs]
|
||||||
|
names = [inputData.get('name') for inputData in inputs]
|
||||||
|
|
||||||
|
# 僅下列資料可更改
|
||||||
|
# - x_iphone 校內分機
|
||||||
|
# - x_phone 聯絡電話
|
||||||
|
# - x_zemail EMAIL
|
||||||
|
# - x_remark 備註
|
||||||
|
|
||||||
|
ans = {}
|
||||||
|
for index in range(len(values)):
|
||||||
|
ans[names[index]] = values[index]
|
||||||
|
|
||||||
|
return ans
|
||||||
|
|
||||||
|
# 前端接收後,僅可更改上述四項 value
|
||||||
|
# 更改後送到 signUp(requestBody) function 中送出請求
|
||||||
|
|
||||||
|
def signUp(self, requestBody):
|
||||||
|
'''
|
||||||
|
目前禁止使用!!!
|
||||||
|
'''
|
||||||
|
url = "https://ccweb.ncnu.edu.tw/SLLL/z7DDA4E0A5831540Dadd.asp"
|
||||||
|
response = self.session.post(url, data=requestBody)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
@ -4,7 +4,7 @@ from bs4 import BeautifulSoup
|
|||||||
from api.tools import *
|
from api.tools import *
|
||||||
import json
|
import json
|
||||||
|
|
||||||
class Moodle():
|
class MoodleAPI():
|
||||||
def __init__(self, username, password):
|
def __init__(self, username, password):
|
||||||
'''
|
'''
|
||||||
Create a Moodle object to handle Session
|
Create a Moodle object to handle Session
|
||||||
@ -122,7 +122,7 @@ class Moodle():
|
|||||||
return [{
|
return [{
|
||||||
'name': " ".join( link.text.split(' ')[:-1] ),
|
'name': " ".join( link.text.split(' ')[:-1] ),
|
||||||
'type': link.text.split(' ')[-1],
|
'type': link.text.split(' ')[-1],
|
||||||
'link': link.find('a').get('href')
|
'link': link.find('a').get('href') if link.find('a') != None else ""
|
||||||
} for link in links]
|
} for link in links]
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import requests
|
import requests
|
||||||
from api.tools import *
|
from api.tools import *
|
||||||
|
|
||||||
class NCNU():
|
class NcnuAPI():
|
||||||
def __init__(self, username, password):
|
def __init__(self, username, password):
|
||||||
'''
|
'''
|
||||||
initial 就登入
|
initial 就登入
|
||||||
|
|||||||
@ -2,7 +2,7 @@ from api.tools import *
|
|||||||
import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
class NcnuMain():
|
class NcnuMainAPI():
|
||||||
def getAnno(self):
|
def getAnno(self):
|
||||||
response = requests.get('https://www.ncnu.edu.tw/ncnuweb/ann/tabs.aspx?homeType=ncnu&unit=ncnu')
|
response = requests.get('https://www.ncnu.edu.tw/ncnuweb/ann/tabs.aspx?homeType=ncnu&unit=ncnu')
|
||||||
block = find(response, 'div', param={'id': 'annNews'})
|
block = find(response, 'div', param={'id': 'annNews'})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user