From bca08dcbf2ff2dac1139e2f0d356687da366fa58 Mon Sep 17 00:00:00 2001 From: Ting-Jun Wang Date: Fri, 2 Jul 2021 18:02:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=94=B9API=E5=90=8D?= =?UTF-8?q?=E7=A8=B1=20&=20=E6=96=B0=E5=A2=9E=E6=B4=BB=E5=8B=95=E5=A0=B1?= =?UTF-8?q?=E5=90=8D=E7=99=BB=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_Usage.py | 26 ++++++++++++++++++++------ api/eventRigestry.py | 38 ++++++++++++++++++++++++++++++++++++++ api/moodle.py | 2 +- api/ncnu.py | 2 +- api/ncnuMain.py | 2 +- 5 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 api/eventRigestry.py diff --git a/API_Usage.py b/API_Usage.py index 2916716..73d3005 100644 --- a/API_Usage.py +++ b/API_Usage.py @@ -1,7 +1,8 @@ from config import CONFIG -from api.moodle import Moodle -from api.ncnuMain import NcnuMain -from api.ncnu import NCNU +from api.moodle import MoodleAPI +from api.ncnuMain import NcnuMainAPI +from api.ncnu import NcnuAPI +from api.eventRigestry import EventRegistry def space(): print("\n" + "="*20 + "\n") @@ -9,7 +10,7 @@ def space(): # =================== TEST Moodle API ========================== # ===== Test 登入 ===== -moodle = Moodle(CONFIG['moodle']['username'], CONFIG['moodle']['password']) +moodle = MoodleAPI(CONFIG['moodle']['username'], CONFIG['moodle']['password']) if moodle.status: # ===== Test 取得該學期課程資料 ===== @@ -40,7 +41,7 @@ else: # =================== Test 暨大官網 API ========================== # ===== Test 取得暨大官網最新消息 ===== -main = NcnuMain() +main = NcnuMainAPI() for anno in main.getAnno(): print(anno) space() @@ -50,7 +51,7 @@ space() # =================== Test 暨大教務系統 API ========================== # ===== Test 登入 ===== -ncnu = NCNU(CONFIG['NCNU']['username'], CONFIG['NCNU']['password']) +ncnu = NcnuAPI(CONFIG['NCNU']['username'], CONFIG['NCNU']['password']) if ncnu.status: # ===== Test 下載課表 ===== @@ -99,3 +100,16 @@ if ncnu.status: space() else: print("NCNU 教務系統登入失敗") + + + + +# =================== Test 暨大活動報名系統 API ========================== + +# ===== Test 登入 ===== +eventReg = EventRegistry(CONFIG['NCNU']['username'], CONFIG['NCNU']['password']) +if eventReg.status: + print("登入成功") + space() +else: + print("登入失敗") diff --git a/api/eventRigestry.py b/api/eventRigestry.py new file mode 100644 index 0000000..65c418d --- /dev/null +++ b/api/eventRigestry.py @@ -0,0 +1,38 @@ +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 \ No newline at end of file diff --git a/api/moodle.py b/api/moodle.py index 5d8b098..f4104e6 100644 --- a/api/moodle.py +++ b/api/moodle.py @@ -4,7 +4,7 @@ from bs4 import BeautifulSoup from api.tools import * import json -class Moodle(): +class MoodleAPI(): def __init__(self, username, password): ''' Create a Moodle object to handle Session diff --git a/api/ncnu.py b/api/ncnu.py index 85fd2ba..5aa06ba 100644 --- a/api/ncnu.py +++ b/api/ncnu.py @@ -1,7 +1,7 @@ import requests from api.tools import * -class NCNU(): +class NcnuAPI(): def __init__(self, username, password): ''' initial 就登入 diff --git a/api/ncnuMain.py b/api/ncnuMain.py index 7b1ea10..84fb0c1 100644 --- a/api/ncnuMain.py +++ b/api/ncnuMain.py @@ -2,7 +2,7 @@ from api.tools import * import requests from bs4 import BeautifulSoup -class NcnuMain(): +class NcnuMainAPI(): def getAnno(self): response = requests.get('https://www.ncnu.edu.tw/ncnuweb/ann/tabs.aspx?homeType=ncnu&unit=ncnu') block = find(response, 'div', param={'id': 'annNews'}) From c84ccec8e8cc6819b7063170a5bce5ac797ae3e8 Mon Sep 17 00:00:00 2001 From: Ting-Jun Wang Date: Fri, 2 Jul 2021 23:09:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=B4=BB=E5=8B=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=A9=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_Usage.py | 5 +++++ api/eventRigestry.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/API_Usage.py b/API_Usage.py index 73d3005..a22c1c3 100644 --- a/API_Usage.py +++ b/API_Usage.py @@ -111,5 +111,10 @@ eventReg = EventRegistry(CONFIG['NCNU']['username'], CONFIG['NCNU']['password']) if eventReg.status: print("登入成功") space() + + # ===== Test 取得所有活動第一頁的列表 + for event in eventReg.getEventsList(): + print(event) + else: print("登入失敗") diff --git a/api/eventRigestry.py b/api/eventRigestry.py index 65c418d..0c5d048 100644 --- a/api/eventRigestry.py +++ b/api/eventRigestry.py @@ -35,4 +35,34 @@ class EventRegistry(): if len(response.history)!=0: return True else: - return False \ No newline at end of file + 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:])] + From 21f23dd57a73d073eed4417bc665cea3b9f991e8 Mon Sep 17 00:00:00 2001 From: Ting-Jun Wang Date: Fri, 2 Jul 2021 23:49:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=B4=BB=E5=8B=95=E5=A0=B1?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_Usage.py | 10 ++++++++-- api/eventRigestry.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/API_Usage.py b/API_Usage.py index a22c1c3..4def0bc 100644 --- a/API_Usage.py +++ b/API_Usage.py @@ -112,9 +112,15 @@ if eventReg.status: print("登入成功") space() - # ===== Test 取得所有活動第一頁的列表 + # ===== 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("登入失敗") diff --git a/api/eventRigestry.py b/api/eventRigestry.py index 0c5d048..dac8f4d 100644 --- a/api/eventRigestry.py +++ b/api/eventRigestry.py @@ -66,3 +66,41 @@ class EventRegistry(): '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