add timeout except and add upload_answer function

This commit is contained in:
2017-08-08 20:25:28 +08:00
parent 414b633156
commit 764b1a6a13

160
access.py
View File

@ -12,77 +12,117 @@ class kuser_api:
self.session = requests.Session() self.session = requests.Session()
# login kCOJ # login kCOJ
def login_kcoj(self, username, password): def login_kcoj(self, username, password):
payload = {'name': username, try:
'passwd': password, payload = {'name': username,
'rdoCourse': 1} 'passwd': password,
return self.session.post(config.URL + '/Login', data=payload) 'rdoCourse': 1}
return self.session.post(config.URL + '/Login', data=payload, timeout=0.1)
except requests.exceptions.Timeout:
return None
# check online status # check online status
def check_online(self): def check_online(self):
response = self.session.get(config.URL + '/TopMenu') try:
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.get(config.URL + '/TopMenu', timeout=0.1)
return soup.find('a').get_text() == '線上考試' soup = BeautifulSoup(response.text, 'html.parser')
return soup.find('a').get_text() == '線上考試'
except requests.exceptions.Timeout:
return True
# list all questions, deadline and hand-in status # list all questions, deadline and hand-in status
def list_questions(self): def list_questions(self):
questions = {} try:
response = self.session.get(config.URL + '/HomeworkBoard') questions = {}
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.get(config.URL + '/HomeworkBoard', timeout=0.1)
for tag in soup.find_all('tr'): soup = BeautifulSoup(response.text, 'html.parser')
if tag.find('a') == None: for tag in soup.find_all('tr'):
continue if tag.find('a') == None:
else: continue
number = tag.find('a').get_text() else:
deadline = tag.find_all('td')[3].get_text() number = tag.find('a').get_text()
submit = "期限已到" if tag.find_all('td')[4].get_text().strip() == "期限已過" else "期限未到" deadline = tag.find_all('td')[3].get_text()
status = tag.find_all('td')[5].get_text().strip() submit = "期限已到" if tag.find_all('td')[4].get_text().strip() == "期限已過" else "期限未到"
questions[number] = (deadline, submit, status) status = tag.find_all('td')[5].get_text().strip()
return questions questions[number] = (deadline, submit, status)
return questions
except requests.exceptions.Timeout:
return {'Timeout':('Timeout', 'Timeout', 'Timeout')}
# show the content of the question # show the content of the question
def show_question(self, number): def show_question(self, number):
response = self.session.get(config.URL + '/showHomework', params={'hwId': number}) try:
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.get(config.URL + '/showHomework', params={'hwId': number}, timeout=0.1)
content = str(soup.find('body')) soup = BeautifulSoup(response.text, 'html.parser')
content = content.replace('<body alink="#FFCCFF" bgcolor="#000000" link="#00FFFF" text="#FFFFFF" vlink="#CCFF33">\n', '') content = str(soup.find('body'))
content = content.replace('<!DOCTYPE html>\n\n', '').replace('<meta charset="utf-8"/>\n', '') content = content.replace('<body alink="#FFCCFF" bgcolor="#000000" link="#00FFFF" text="#FFFFFF" vlink="#CCFF33">\n', '')
content = content.replace('<input onclick="history.go( -1 );return true;" type="button" value="上一頁"/>', '') content = content.replace('<!DOCTYPE html>\n\n', '').replace('<meta charset="utf-8"/>\n', '')
content = content.replace('<a href="upLoadHw?hwId=' + number + '"> 繳交作業 </a>', '') content = content.replace('<input onclick="history.go( -1 );return true;" type="button" value="上一頁"/>', '')
content = content.replace('</body>', '').replace('<br/> ', '\n').replace('<br/>', '\n').replace(' ', '') content = content.replace('<a href="upLoadHw?hwId=' + number + '"> 繳交作業 </a>', '')
return content content = content.replace('</body>', '').replace('<br/> ', '\n').replace('<br/>', '\n').replace(' ', '')
return content
except requests.exceptions.Timeout:
return 'Timeout'
# list passers of the question # list passers of the question
def list_passers(self, number): def list_passers(self, number):
passers = [] try:
response = self.session.get(config.URL + '/success.jsp', params={'HW_ID': number}) passers = []
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.get(config.URL + '/success.jsp', params={'HW_ID': number}, timeout=0.1)
for tr in soup.find_all('tr'): soup = BeautifulSoup(response.text, 'html.parser')
passer = tr.get_text().replace('\n', '') for tr in soup.find_all('tr'):
if passer != '學號': passer = tr.get_text().replace('\n', '')
passers += [passer] if passer != '學號':
return passers passers += [passer]
def list_results(self, number): return passers
results = [] except requests.exceptions.Timeout:
response = self.session.get(config.URL + '/CheckResult.jsp', params={'questionID': number, 'studentID': self.username}) return ['Timeout']
soup = BeautifulSoup(response.text, 'html.parser')
for tr in soup.find_all('tr'): # list results of the question
td = tr.find('td') def list_results(self, number, username):
if td.get_text() != '測試編號': try:
results += [(td.get_text(), tr.find_all('td')[1].get_text())] results = []
return results response = self.session.get(config.URL + '/CheckResult.jsp', params={'questionID': number, 'studentID': username}, timeout=0.1)
soup = BeautifulSoup(response.text, 'html.parser')
for tr in soup.find_all('tr'):
td = tr.find('td')
if td.get_text() != '測試編號':
results += [(td.get_text(), tr.find_all('td')[1].get_text())]
return results
except requests.exceptions.Timeout:
return ['Timeout', 'Timeout']
# change password
def change_password(self, password):
try:
payload = {'pass': password,
'submit': 'sumit'}
response = self.session.post(config.URL + '/changePasswd', data=payload, timeout=0.1)
soup = BeautifulSoup(response.text, 'html.parser')
return str(soup.find('body')).split()[-2] == 'Success'
except requests.exceptions.Timeout:
return False
# delete the answer of the question # delete the answer of the question
def delete_answer(self, number): def delete_answer(self, number):
response = self.session.get(config.URL + '/delHw', params={'title': number}) try:
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.get(config.URL + '/delHw', params={'title': number}, timeout=0.1)
return soup.find('body').get_text().replace('\n', '') == 'delete success' soup = BeautifulSoup(response.text, 'html.parser')
# hand in a answer return soup.find('body').get_text().replace('\n', '') == 'delete success'
def upload_answer(self, number): except requests.exceptions.Timeout:
self.session.get(config.URL + '/upLoadHw', params={'hwId': number}) return False
response = self.session.post(config.URL + '/upLoadFile')
return response.text # unavailable
def change_password(self, password): # hand in a answer
payload = {'pass': password, def upload_answer(self, number, file_path):
'submit': 'sumit'} try:
response = self.session.post(config.URL + '/changePasswd', data=payload) self.session.get(config.URL + '/upLoadHw', params={'hwId': number}, timeout=0.1)
soup = BeautifulSoup(response.text, 'html.parser') response = self.session.post(config.URL + '/upLoadFile',
return str(soup.find('body')).split()[-2] == 'Success' data={'FileDesc': 'Send from kcoj_bot'},
files={'hwFile': open(file_path, 'rb')},
timeout=0.1)
soup = BeautifulSoup(response.text, 'html.parser')
return soup.find('body').get_text().strip() != '您沒有上傳檔案 請重新操作'
except requests.exceptions.Timeout:
return False
# for debug # for debug
def main(): def main():