继超星之后,又有了智慧树-刷视频
租了一台服务器,今天终于派上了用场---刷智慧树的网课。其实,这话有点夸大了,是刷视频。
一、环境:python3.*seleniumchromechromedriver windows10
二、程序功能:
输入课程号,(手动)登录智慧树, 然后程序播放课程下的视频,将进步发送给自己微信助手。
三、程序:
(1)智慧树刷课
"""
智慧树刷课
https://www.zhihuishu.com/
"""
from selenium import webdriver
importtime
import random
importre
importwechat
fromretrying importretry
importeasygui as g
# 设置输出方式, 进度发送到微信
defoutput( code="" ):
print( code )
app.send( code )
classzhihuishu_sprider():
def __init__(self, account, password, school_name, class_name ):
self.account = account
self.password = password
self.school_name = school_name
self.class_name =class_name
opt= webdriver.ChromeOptions()
opt.add_argument("--no-sandbox")
self.driver =webdriver.Chrome( options= opt )
self.url = "https://passport.zhihuishu.com/login?service=https://onlineservice.zhihuishu.com/login/gologin"
self.stu_url = "https://onlineh5.zhihuishu.com/onlineWeb.html#/studentIndex"
#写cookies
def write(self):
cookies =self.driver.get_cookies()
cookies_list = []
for item incookies:
cookie_dict = {}
cookie_dict["name"] = str(item["name"])
cookie_dict["value"] = str(item["value"])
cookies_list.append( cookie_dict )
with open("cookies.txt", "w" , encoding="utf-8") asf:
f.write(str( cookies_list))
# 读取cookeis
defread(self):
try:
withopen("cookies.txt", "r", encoding="utf-8")as f:
cookies =f.read()
cookies = eval(cookies )
foritem in cookies:
print( item , type(item ))
self.driver.add_cookie(item )
except Exception as e:
print(e )
def _sign(self):
# self.read()
# self.driver.get( self.stu_url )
# self.read()
self.driver.get(self.stu_url )
if notself.driver.current_url ==self.stu_url:
self.driver.delete_all_cookies()
self.driver.get( self.url )
# todo 自动登录暂时无法解决, 需要模拟驱动
js = """
$("#lUsername").val("15293217483");
"""
self.driver.execute_script( js )
ans = input("输入任意键,代表登录完成!")
if self.driver.current_url == self.stu_url:
returnTrue
return False
# 打开课程, 返回课程url
def open_class(self):
class_url = self.driver.current_url
self.driver.get(class_url)
# 获取课程列表,选择课程
class_list= self.driver.find_elements_by_xpath("//*[@id='sharingClassed']/div/ul")
for item inclass_list:
class_title =item.find_element_by_xpath("div/dl/dt/div").text
print( class_title )
ifself.class_name in class_title:
item.find_element_by_xpath("div/dl/dt/div").click()
for i in range(10):
time.sleep(1)
url = self.driver.current_url
ifnot url ==class_url:
returnurl
break
return ""
@retry( stop_max_attempt_number=10)
#观看视频,弹出框--警示框、答题框
defview_class( self,class_url):
self.driver.get( class_url )
# 如果警告存在,则关闭警告
for i in range(5):
warnning_btn = self.driver.find_elements_by_xpath("//*[@id='app']/div/div/div/div/span/button/span")
try:
if warnning_btn:
warnning_btn.click()
break
except:
pass
time.sleep(1)
# 如果学前必读提示存在,怎关闭提示
for i in range(5):
warnning_btn = self.driver.find_elements_by_xpath("//*[@id='app']/div/div/div/div/i")
try:
if warnning_btn:
warnning_btn.click()
break
time.sleep(1)
except:
pass
# 选择章节
# charp_list =self.driver.find_elements_by_xpath("//*[@id='app']/div/div/div/div/div//div" )
# charp_list = self.driver.find_elements_by_xpath("//*[@id='app']/div/div/div//div/span")
charp_list = self.driver.find_elements_by_class_name("cataloguediv-c")
# 找到没有看的视频
##(1) //span:n.n.n类型的时间;(2)// span n.n型, 标题和时间在一起
# text:标题 + 播放时间
for iinrange(len(charp_list) ):
charp_list = self.driver.find_elements_by_class_name("cataloguediv-c")
item =charp_list
text = str(item.text).replace("\n","").strip()
try:
video_leng = re.search(r"\d{2}:\d{2}:\d{2}",text).group()
exceptException ase:
video_leng = ""
ifvideo_leng :
finsh_img = item.find_elements_by_class_name("time_icofinish")
iffinsh_img:
# print( finsh_img.get_attribute('innerHTML') )
output( text[:-8]+"已播放完成!")
continue
item.find_element_by_xpath("span").click()
time.sleep( random.randint(1,4) )
video_leng = video_leng.split(":")
video_leng = int(video_leng)*60*60+int(video_leng)*60+int(video_leng)
output(text[:-8]+"开始播放")
output("\t播放时长:"+ str( video_leng) )
# 使用js 播放视频
js = """
$item = $("#playButton");
if( $item.prop("class") == "playButton"){
$item.click();
}
"""
self.driver.execute_script( js )
## 随机弹出答题框 //*[@id="app"]/div/div/div
# A 选项 //*[@id="app"]/div/div/div/div/div/div/div/div/div/ul/li
# B 选项 //*[@id="app"]/div/div/div/div/div/div/div/div/div/ul/li
# 关闭按钮://*[@id="app"]/div/div/div/div/span/div
for i in range( video_leng +5):
popup = self.driver.find_elements_by_xpath( "//*[@id='app']/div/div/div")
ifpopup:
try:
self.driver.find_element_by_xpath("//*[@id='app']/div/div/div/div/div/div/div/div/div/ul/li[{}]"
.format(str( random.randint(1,2)))).click()
time.sleep( random.randint(1,3))
self.driver.find_element_by_xpath("//*[@id='app']/div/div/div/div/span/div").click()
except :
pass
time.sleep(1)
self.driver.execute_script( js )
time.sleep(random.randint(1,3) )
output("\t\t播放结束!")
defrun(self ):
if self._sign():
output("登录成功!")
class_url = self.open_class( )
if class_url:
self.view_class(class_url )
else:
print("class_url",class_url)
self.write()
else:
output("登录失败, 从新开始!")
if __name__ == '__main__':
info = g.multenterbox( msg="请填写信息", fields=['课程号'], values=["创践——大学生创新创业实务"])
if len(info):
sprider =zhihuishu_sprider("******","****", "*****",str( info))
app =wechat.wechat_app()
sprider.run()
(2)网页微信(这个其实没有什么可说的)
"""
微信登录,发送消息
"""
import itchat
class wechat_app():
def __init__(self):
self.app =itchat
self.app.auto_login( hotReload=True )
print("微信, 登录成功!")
def send(self, code):
self.app.send( code, 'filehelper' )
四、存在的问题:
(1)无法自动登录:利用js 或者 send_key() 会出现滚动条, 而这个滚动条即使是手动也没有办法验证成功。
我怀疑它是绑定了keydown监听事件, 如果不出现keydown事件,那么就基本不拒绝了。因为上面两种方法都不会触发keydown事件。
(2)太多太多太多的try、except
山野村夫-陈墨 发表于 2020-4-21 22:22
超星平台的好像是下一个或者上一个帖子, 但是范围不广,可以看看
超星平台是不是有好几个版本。。。感觉网上流传的我这边都不太适用 大鸽鸽 发表于 2020-4-22 08:43
超星平台是不是有好几个版本。。。感觉网上流传的我这边都不太适用
超星的课程网页结构不太一致。 能不能搞个银行从业继续教育的这种工具 继续教育这个真的很需要啊 学到了 这就给安利去.
{:1_926:}
真实情况先看代码........ 妈耶太晚了 我毕业了{:1_901:} 接入 server酱,进行微信推送,我觉得挺不错。
厉害,学习了 j542936 发表于 2020-3-19 21:02
能不能搞个银行从业继续教育的这种工具
这种东西淘宝应该有成品吧 。 我这个就是闹着玩的 前段时间刷会计的课,我都快刷吐了。 早有一些这种软件就帮大忙了
山野村夫-陈墨 发表于 2020-3-20 18:41
这种东西淘宝应该有成品吧 。 我这个就是闹着玩的
某宝还真没有找到。所以才有这么一问~~
页:
[1]
2