有些时候总是忘记作业截止时间,刚好最近学了python的爬虫,写了一个定时推送未完成作业的代码,编程功底比较差,代码有点儿乱,大佬们有什么建议可以提出来我看看怎么改
需要抓学习通的Cookie和User-Agent,之后代码直接粘贴到腾讯的云函数内即可,需要安装bs4的库,可以选择使用方糖或者wxpusher推送,默认使用wxpusher
之后又做了个简单的安卓app,根据代码改了下写了个后端给app调用,点一下就可以看所有未完成的作业了,只需要填写Cookie就可以了,需要的可以自取
下面介绍一下腾讯云函数的详细使用方法
1.先进去创建一个空白函数,代码粘贴到下面的编辑框内即可
2.接下来到终端内安装需要导入的包,安装在当前目录下
先cd src
pip3 install bs4 -t .
pip3 install lxml -t .
2.进入函数配置,配置一下时间的环境变量,设置为上海时间
3.进入触发管理,设置触发器,我这里设置的是每天7:30,12:30,18:30推送一次,可以根据自己的需要使用cron表达式更改推送时间
3.在代码内填入Cookie,User-Agent,推送的id就可以了,使用方糖的话把代码的注释打开,下面的body和request.post注释上或者删掉就行。改完代码记得点一下编辑框右上角的部署,这样代码才能生效。
推送展示
app展示:
app下载地址:
https://wwc.lanzoui.com/i420mx0f5wf
密码:3ah1
下面是代码:
# -*- coding: utf8 -*-
import requests
from bs4 import BeautifulSoup
import json
import re
import datetime
# 方糖推送(需要输入方糖推送的sckey)sckey = ''
ftqqUrl = "https://sc.ftqq.com/%s.send" % (sckey)
# wxpusher推送(需要输入wxpusher的apptoken)appToken = ""
wxurl = "http://wxpusher.zjiecode.com/api/send/message"
getAllCourseDataUrl = 'http://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&rss=1'
headers = {
'Host': 'mooc1-api.chaoxing.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Cookie': '在这里输入你的学习通cookie',
'User-Agent': '在这里输入你的user-Agent',
'Accept-Language': 'zh-cn',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
}
wx_header = {
"Content-Type": "application/json",
}
def checkHomework():
status = "未完成作业概览:\n"
courses = getDataUrl()
allTodoWork = []
for name in courses:
url = courses[name]
homework = requests.get(url, headers=headers).text
soup = BeautifulSoup(homework, 'lxml')
work = soup.find_all('li')
for i in range(len(work)):
if work.div.span.string == "未交" and work.find('span', class_='fr') is not None:
# status = status + '\n' + name + '\n'
restTime = work.find('span', class_='fr').string
# 剩余具体小时数
restHour = re.findall(r"剩余(.+?)小时", restTime)
# 剩余多出来的分钟数
restMinute = re.findall(r"小时(.+?)分钟", restTime)
# 当前时间加上剩余小时
endTime1 = datetime.datetime.now() + datetime.timedelta(hours=int(restHour[0]))
# 最后加上分钟数即可算出具体的截止时间
endTime2 = endTime1 + datetime.timedelta(minutes=int(restMinute[0]))
# 当前作业状态
workStatus = '\n' + name + '\n' + work[
i].div.p.string + '\n' + restTime + '\n' + '截止时间:' + endTime2.strftime(
"%Y-%m-%d %H:%M:%S") + '\n'
allTodoWork.append(workStatus)
# 重新排序,时间截止日期近的排在前面
allTodoWork.sort(key=lambda t: int(re.findall(r"剩余(.+?)小时", t)[0]))
for i in range(len(allTodoWork)):
status = status + allTodoWork
print(status)
# payload = {'text': '作业未完成通知', 'desp': status}
# requests.post(ftqqUrl, params=payload)
body = {
"appToken": appToken,
"content": status,
"summary": "",
"contentType": 1,
"topicIds": [],
"uids": ["在这里需要输入你的wxpusher的UID"],
}
requests.post(wxurl, headers=wx_header, data=json.dumps(body))
# 获取所有本学期内的课程名及对应url
def getDataUrl():
allCourse = requests.get(getAllCourseDataUrl, headers=headers).text
allCourseJson = json.loads(allCourse)
channelList = allCourseJson['channelList']
cpi = ''
for c in range(len(channelList)):
# 获取最近添加的课程的cpi,使用该cpi来判断其它课程是否为本学期的
if 'cpi' in channelList[c]:
cpi = channelList[c]['cpi']
break
realCourse = []
finalCourseData = {}
for i in range(len(channelList)):
if 'cpi' in channelList and channelList['cpi'] == cpi:
realCourse.append(channelList['content']['course']['data'][0])
for t in range(len(realCourse)):
courseName = realCourse[t]['name']
courseSquareUrl = realCourse[t]['courseSquareUrl']
courseId = re.findall(r'courseId=(.+?)&', courseSquareUrl)[0]
classId = re.findall(r'classId=(.+?)&', courseSquareUrl)[0]
courseWorkUrl = 'https://mooc1-api.chaoxing.com/work/task-list?courseId=' + courseId + '&classId=' + classId + '&cpi=' + str(
cpi)
tmpDict = {courseName: courseWorkUrl}
finalCourseData.update(tmpDict)
return finalCourseData
def main_handler(event, context):
return checkHomework()
if __name__ == '__main__':
checkHomework()