网课邦

当前位置:首页 > 网课资讯

网课资讯

Python代码自动推送学习通进度到微信实现方法~

时间:2025-06-05 01:15:56 作者:暂无作者 浏览量:
内容页左侧

有些时候总是忘记作业截止时间,刚好最近学了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 = &9;&9;ftqqUrl = "https://sc.ftqq.com/%s.send" % (sckey)
wxpusher推送(需要输入wxpusher的apptoken)appToken = ""wxurl = "http://wxpusher.zjiecode.com/api/send/message"getAllCourseDataUrl = &9;http://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&rss=1&9;headers = {
&9;Host&9;: &9;mooc1-api.chaoxing.com&9;,&9;Accept&9;: &9;text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8&9;,&9;Cookie&9;: &9;在这里输入你的学习通cookie&9;,&9;User-Agent&9;: &9;在这里输入你的user-Agent&9;,&9;Accept-Language&9;: &9;zh-cn&9;,&9;Accept-Encoding&9;: &9;gzip, deflate, br&9;,&9;Connection&9;: &9;keep-alive&9;}
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, &9;lxml&9;)
work = soup.find_all(&9;li&9;)
for i in range(len(work)):
if work.div.span.string == "未交" and work.find(&9;span&9;, class_=&9;fr&9;) is not None:
status = status + &9;\n&9; + name + &9;\n&9;restTime = work.find(&9;span&9;, class_=&9;fr&9;).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 = &9;\n&9; + name + &9;\n&9; + work[
i].div.p.string + &9;\n&9; + restTime + &9;\n&9; + &9;截止时间:&9; + endTime2.strftime(
"%Y-%m-%d %H:%M:%S") + &9;\n&9;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 = {&9;text&9;: &9;作业未完成通知&9;, &9;desp&9;: 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))
获取所有本学期内的课程名及对应urldef getDataUrl():
allCourse = requests.get(getAllCourseDataUrl, headers=headers).text
allCourseJson = json.loads(allCourse)
channelList = allCourseJson[&9;channelList&9;]
cpi = &9;&9;for c in range(len(channelList)):
获取最近添加的课程的cpi,使用该cpi来判断其它课程是否为本学期的if &9;cpi&9; in channelList[c]:
cpi = channelList[c][&9;cpi&9;]
breakrealCourse = []
finalCourseData = {}
for i in range(len(channelList)):
if &9;cpi&9; in channelList and channelList[&9;cpi&9;] == cpi:
realCourse.append(channelList[&9;content&9;][&9;course&9;][&9;data&9;][0])
for t in range(len(realCourse)):
courseName = realCourse[t][&9;name&9;]
courseSquareUrl = realCourse[t][&9;courseSquareUrl&9;]
courseId = re.findall(r&9;courseId=(.+?)&&9;, courseSquareUrl)[0]
classId = re.findall(r&9;classId=(.+?)&&9;, courseSquareUrl)[0]
courseWorkUrl = &9;https://mooc1-api.chaoxing.com/work/task-list?courseId=&9; + courseId + &9;&classId=&9; + classId + &9;&cpi=&9; + str(
cpi)
tmpDict = {courseName: courseWorkUrl}
finalCourseData.update(tmpDict)
return finalCourseData
def main_handler(event, context):
return checkHomework()
if __name__ == &9;__main__&9;:
checkHomework()

app下载地址:
https://wwc.lanzoui.com/i420mx0f5wf
密码:3ah1
下面是代码:
-- coding: utf8 --import requests
from bs4 import BeautifulSoup
import json
import re
import datetime
方糖推送(需要输入方糖推送的sckey)sckey = &9;&9;ftqqUrl = "https://sc.ftqq.com/%s.send" % (sckey)
wxpusher推送(需要输入wxpusher的apptoken)appToken = ""wxurl = "http://wxpusher.zjiecode.com/api/send/message"getAllCourseDataUrl = &9;http://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&rss=1&9;headers = {
&9;Host&9;: &9;mooc1-api.chaoxing.com&9;,&9;Accept&9;: &9;text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8&9;,&9;Cookie&9;: &9;在这里输入你的学习通cookie&9;,&9;User-Agent&9;: &9;在这里输入你的user-Agent&9;,&9;Accept-Language&9;: &9;zh-cn&9;,&9;Accept-Encoding&9;: &9;gzip, deflate, br&9;,&9;Connection&9;: &9;keep-alive&9;}
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, &9;lxml&9;)
work = soup.find_all(&9;li&9;)
for i in range(len(work)):
if work.div.span.string == "未交" and work.find(&9;span&9;, class_=&9;fr&9;) is not None:
status = status + &9;\n&9; + name + &9;\n&9;restTime = work.find(&9;span&9;, class_=&9;fr&9;).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 = &9;\n&9; + name + &9;\n&9; + work[
i].div.p.string + &9;\n&9; + restTime + &9;\n&9; + &9;截止时间:&9; + endTime2.strftime(
"%Y-%m-%d %H:%M:%S") + &9;\n&9;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 = {&9;text&9;: &9;作业未完成通知&9;, &9;desp&9;: 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))
获取所有本学期内的课程名及对应urldef getDataUrl():
allCourse = requests.get(getAllCourseDataUrl, headers=headers).text
allCourseJson = json.loads(allCourse)
channelList = allCourseJson[&9;channelList&9;]
cpi = &9;&9;for c in range(len(channelList)):
获取最近添加的课程的cpi,使用该cpi来判断其它课程是否为本学期的if &9;cpi&9; in channelList[c]:
cpi = channelList[c][&9;cpi&9;]
breakrealCourse = []
finalCourseData = {}
for i in range(len(channelList)):
if &9;cpi&9; in channelList and channelList[&9;cpi&9;] == cpi:
realCourse.append(channelList[&9;content&9;][&9;course&9;][&9;data&9;][0])
for t in range(len(realCourse)):
courseName = realCourse[t][&9;name&9;]
courseSquareUrl = realCourse[t][&9;courseSquareUrl&9;]
courseId = re.findall(r&9;courseId=(.+?)&&9;, courseSquareUrl)[0]
classId = re.findall(r&9;classId=(.+?)&&9;, courseSquareUrl)[0]
courseWorkUrl = &9;https://mooc1-api.chaoxing.com/work/task-list?courseId=&9; + courseId + &9;&classId=&9; + classId + &9;&cpi=&9; + str(
cpi)
tmpDict = {courseName: courseWorkUrl}
finalCourseData.update(tmpDict)
return finalCourseData
def main_handler(event, context):
return checkHomework()
if __name__ == &9;__main__&9;:
checkHomework()

来源:吾爱破解