蓝墨云班课资源下载不了_蓝墨云班课老师怎么用

蓝墨云班课资源下载不了_蓝墨云班课老师怎么用看见有人详细讲解了下载文件的原理,在这里我就不赘述了,直接上写好的代码。可能乱了点。有一点要提前说一下,做这个的时候,我想着只下载没有获得经验的文件。已经获得过经验的文件因为我用不到,所以就不用下,当然,改一下代码的话没货的经验的也能下。相关的代码在download_sours函数里面,jy表示的是经验,jy=N代表没获得经验的文件,改一下就行,去掉这个判断条件就能下载已经获得经验的资源了。最后,封装好的软件下载链接在文章最末尾importosimportreimporttimeimpor

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

看见有人详细讲解了下载文件的原理,在这里我就不赘述了,直接上写好的代码。可能乱了点。
有一点要提前说一下,做这个的时候,我想着只下载没有获得经验的文件。已经获得过经验的文件因为我用不到,所以就不用下,当然,改一下代码的话获得过经验的也能下。相关的代码在download_sours函数里面,jy表示的是经验,jy=N代表没获得经验的文件,改一下就行,去掉这个判断条件就能下载已经获得经验的资源了。

# coding=gbK
import os
import re
import time
import json
import requests
import threading
from lxml import etree
class Download_resours():
def __init__(self):
try:
self.load()
except:
self.load_in()
self.main()
def main(self):
self.download_sours()
print('下载完成'.center(50, '*'))
select = input('是否继续下载其他科目?[y/n]:')
if select == 'y' or select == 'Y':
self.main()
else:
pass
# 第一次使用的时候登录并且获得课程列表并且把账号密码保存在account.json文件内,避免重复输账号密码
def load_in(self):  # 当没有account文件的时候输入账号和密码登录,并且把账号和密码保存在account文件里
self.session = requests.session()
self.username = input("请输入账号:")
self.userpw = input('请输入密码:')
account = { 
'user_name': self.username, 'user_pw': self.userpw}
with open('account.json', 'w') as f:
json.dump(account, f)
f.close()
url = 'https://www.mosoteach.cn/web/index.php?c=passport&m=account_login'
self.header = { 

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
post_data = { 

'account_name': '{}'.format(self.username),
'user_pwd': '{}'.format(self.userpw),
'remember_me': 'Y',
'scene': '',
'time': '',
'sign': ''
}
response = self.session.post(url, data=post_data, headers=self.header)
response_js = json.loads(response.text)
if response_js['result_code'] == 0:
print("登陆成功".center(90, "*"))
url = "https://www.mosoteach.cn/web/index.php?c=clazzcourse&m=index"
html = self.session.get(url, headers=self.header)
cookie = self.session.cookies
self.cookies = requests.utils.dict_from_cookiejar(cookie)
html = etree.HTML(html.text)
project_name = html.xpath('//div[@class = "class-info"]/span[@class = "class-info-subject"]/@title')
class_now_id = html.xpath('//li[@class = "class-item "]/@data-id')
class_complete_id = html.xpath('//li[@class = "class-item class-item-complete"]/@data-id')
for i in range(len(class_complete_id)):
class_now_id.append(class_complete_id[i])
self.cours_id = class_now_id
for i in range(len(project_name)):
print(str(i) + '***************' + project_name[i])
else:
print("登录失败")
self.session.close()
self.load_in()
# 当有account文件的时候直接从文件里读取账号密码并登录
def load(self):
self.session = requests.session()
with open('account.json') as f:
account = json.load(f)
self.username = account['user_name']
self.userpw = account['user_pw']
f.close()
url = 'https://www.mosoteach.cn/web/index.php?c=passport&m=account_login'
self.header = { 

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
post_data = { 

'account_name': '{}'.format(self.username),
'user_pwd': '{}'.format(self.userpw),
'remember_me': 'Y',
'scene': '',
'time': '',
'sign': ''
}
response = self.session.post(url, data=post_data, headers=self.header)
response_js = json.loads(response.text)
if response_js['result_code'] == 0:
print("登陆成功".center(90, "*"))
url = "https://www.mosoteach.cn/web/index.php?c=clazzcourse&m=index"
html = self.session.get(url, headers=self.header)
cookie = self.session.cookies
self.cookies = requests.utils.dict_from_cookiejar(cookie)
html = etree.HTML(html.text)
project_name = html.xpath('//div[@class = "class-info"]/span[@class = "class-info-subject"]/@title')
#课程的ID分为两类,一类是正在进行的课程,一类是已经结课的课程
#获得正在进行的课程的课程ID
class_now_id = html.xpath('//li[@class = "class-item "]/@data-id')
#获得已经结束的课程的课程ID
class_complete_id = html.xpath('//li[@class = "class-item class-item-complete"]/@data-id')#HUO
#将两种课程ID放在一个列表内,并且把这个列表给self.cours_id以待选择课程后下载的时候取用
for i in range(len(class_complete_id)):
class_now_id.append(class_complete_id[i])
self.cours_id = class_now_id
#把课程的名字打印在屏幕上,供选择
for i in range(len(project_name)):
print(str(i) + '***************' + project_name[i])
else:
print("登录失败")
self.session.close()
self.load_in()
def get_resours(self):
try:
#获得想要下载的课程在列表中的索引
select = int(input('输入课程编号口牙:'))
u = 'https://www.mosoteach.cn/web/index.php?c=res&m=index&clazz_course_id='
#取出想要下载的课程的课程ID
self.id = self.cours_id[select]
#拼接成完整的资源所在页面的url并且对url进行请求
url = u + self.cours_id[select]
html = self.session.get(url, headers=self.header)
html = etree.HTML(html.text)
#找出资源的文件名
title = html.xpath('//span[@class = "res-name"]/text()')
#找出资源的下载地址
download_url = html.xpath('//*[@id="res-list-box"]/div/div[2]/div/@data-href')
#找出资源的类型(是视频还是其他类型)
resource_type = html.xpath('//*[@id="res-list-box"]/div/div[2]/div/@data-mime')
#找出资源的ID
resource_id = html.xpath('//*[@id="res-list-box"]/div/div[2]/div/@data-value')
#找出资源是否获得过经验的标志(N或Y,N代表这个资源你还没获得经验,Y表示这个资源你已经获得过资源了)
jy = html.xpath('//span/@data-is-drag')
#如果资源类型是视频,找出视频的时长用于后续的刷视频
vido_time = html.xpath('//div[@class = "create-box manual-order-hide-part"]/span[3]/text()')
return title, download_url, jy, resource_type, vido_time, resource_id
except:
print('出错啦,请重新打开软件')
def download_sours(self):
title, download_url, jy, resource_type, vido_time, resource_id = self.get_resours()
path = input('输入保存路径:')
path = path.replace('/', '\\')
for i in range(len(title)):
#将资源的文件名和文件的后缀分开并变成一个列表用来判断文件类型
mid = title[i].split(".")
#如果分开后的列表只有一个元素则说明不是视频也不是可下载的文件,而是一个用来跳转的网址,如果jy为Y则说明这个资源已经获得过经验了,自动跳过这两种情况
if len(mid) == 1 or jy[i] == "Y":
pass
else:
if resource_type[i] == 'video':
id = self.id
url = download_url[i]
name = title[i]
v_time = vido_time[i]
vido_id = resource_id[i]
print('正在下载{}'.format(name))
self.download_vido(url, name, path, v_time, vido_id, id)
else:
url = download_url[i]
name = title[i]
print('正在下载{}'.format(name))
self.download_application(url, name, path)
# 下载视频
def download_vido(self, url, name, path, v_time, vido_id, id):
tody = time.strftime('%m-%d')
path = path + '\\' + tody
if os.path.exists(path):
self.split_part(url, name, path, num_thread=5)
else:
os.mkdir(path)
self.split_part(url, name, path, num_thread=5)
self.kill_vido(v_time, vido_id, id)
def write(self, start, end, r_url, path, name):
headers = { 
'Range': 'bytes=%d-%d' % (start, end)}
r = requests.get(r_url, headers=headers, stream=True)
with open(path + '\\' + name, "r+b") as fp:
fp.seek(start)
var = fp.tell()
fp.write(r.content)
def split_part(self, url, name, path, num_thread):
r = requests.head(url, cookies=self.cookies)
r_url = r.headers['Location']
r = requests.head(r_url)
try:
file_size = int(r.headers[
'content-length'])  # Content-Length获得文件主体的大小,当http服务器使用Connection:keep-alive时,不支持Content-Length
except:
print("检查URL,或不支持对线程下载")
return
fp = open(path + '\\' + name, "wb")
fp.truncate(file_size)
fp.close()
part = file_size // num_thread
# 如果不能整除,最后一块应该多几个字节
for i in range(num_thread):
end_str = '100%'
start = part * i
if i == num_thread - 1:  # 最后一块
end = file_size
else:
end = start + part
t = threading.Thread(target=self.write,
kwargs={ 
'start': start, 'end': end, 'r_url': r_url, 'path': path, 'name': name})
t.setDaemon(True)
t.start()
# 等待所有线程下载完成
main_thread = threading.current_thread()
for t in threading.enumerate():
if t is main_thread:
continue
t.join()
def download_application(self, url, name, path):
tody = time.strftime('%m-%d')
path = path + '\\' + tody
if os.path.exists(path):
self.split_part(url, name, path, num_thread=5)
else:
os.mkdir(path)
self.split_part(url, name, path, num_thread=5)
# 刷视频
def kill_vido(self, v_time, vido_id, course_id):
url = 'https://www.mosoteach.cn/web/index.php?c=res&m=save_watch_to'
time = re.findall('\d+\.\d', v_time)
if len(time) == 0:
time = re.findall('\d+', v_time)
t = int(float(time[0]) * 60)
post_data = { 

'clazz_course_id': '{}'.format(course_id),
'res_id': '{}'.format(vido_id),
'watch_to': '{}'.format(t),
'duration': '{}'.format(t),
'current_watch_to': '{}'.format(t),
}
response = self.session.post(url, data=post_data, headers=self.header)
if response.text == "[\"success\"]":
pass
else:
print(response.text[0])
print('刷视频失败')
if __name__ == '__main__':
run = Download_resours()

Jetbrains全家桶1年46,售后保障稳定

所有代码仅供学习使用,请勿用作商业或违法行为。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226744.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【面试】阿里巴巴Java经典面试题整理及答案详解

    【面试】阿里巴巴Java经典面试题整理及答案详解Java开发工程师-面试题目集锦Java的数据结构有哪些?线性表,链表,栈,队列,图,树什么是OOP?面向对象编程面向对象编程的原则有哪些?单一职责原则:一个类中应该是一组相关性很高的函数、数据的封装! 开闭原则;对扩展开放,对修改关闭,即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。只…

  • linux tar 绝对路径,tar打包使用绝对路径详解

    linux tar 绝对路径,tar打包使用绝对路径详解首先应该明确:*nix系统中,使用tar对文件打包时,一般不建议使用绝对路径。通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包。使用绝对路径打包时如果不指定相应的参数,tar会产生一句警告信息:”tar:Removingleading`/’frommembernames”,并且实际产生的压缩包会将绝对路径转化为相对路径。比如:root@queen~#t…

  • String 时间戳 转 Date 时间格式 java[通俗易懂]

    String 时间戳 转 Date 时间格式 java[通俗易懂]今天遇到一个问题是从数据库提取出String类型的时间戳,然后将他转换为Date类型(yyyy-MM-ddHH:mm:ss)再存入数据库那么就总结一下时间类型的转换吧首先这个转换为Stringseconds=toutiaoArticle.get("article_publish_time").toString();Simple…

  • linux查看ftp用户列表_linux ftp下载命令

    linux查看ftp用户列表_linux ftp下载命令ftp服务器在网上较为常见,Linuxftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文。下面由学习啦小编为大家整理了linux下查询ftp命令的相关知识,希望对大家有所帮助。Linuxftp命令的格式$ftp主机名/IP其中“主机名/IP”是所要连接的远程机的主机名或IP地址。在命令行中,主机名属于选项,如果指定主机名,ftp将试图与远程机的ftp服务程序进行连接;如果没有指…

  • 【制作CSS气泡框】

    气泡状文本框,是一种很生动的网页设计手段。它可以用来表示用户的发言…

  • http请求415错误Unsupported Media Type

    http请求415错误Unsupported Media Type王子乔每一个认真生活的人,都值得被认真对待王子乔每一个认真生活的人,都值得被认真对待王子乔每一个认真生活的人,都值得被认真对待http请求415错误UnsupportedMediaTy

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号