山野村夫-陈墨 发表于 2020-3-19 21:00

继超星之后,又有了智慧树-刷视频

租了一台服务器,今天终于派上了用场---刷智慧树的网课。
其实,这话有点夸大了,是刷视频。

一、环境: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-22 08:43

山野村夫-陈墨 发表于 2020-4-21 22:22
超星平台的好像是下一个或者上一个帖子, 但是范围不广,可以看看

超星平台是不是有好几个版本。。。感觉网上流传的我这边都不太适用

山野村夫-陈墨 发表于 2020-5-2 21:35

大鸽鸽 发表于 2020-4-22 08:43
超星平台是不是有好几个版本。。。感觉网上流传的我这边都不太适用

超星的课程网页结构不太一致。

j542936 发表于 2020-3-19 21:02

能不能搞个银行从业继续教育的这种工具

zhang159332010 发表于 2020-3-19 21:35

继续教育这个真的很需要啊

拂晓路 发表于 2020-3-19 21:41

学到了 这就给安利去.
{:1_926:}
真实情况先看代码........

皮茶茶 发表于 2020-3-19 22:42

妈耶太晚了 我毕业了{:1_901:}

RemMai 发表于 2020-3-19 23:21

接入 server酱,进行微信推送,我觉得挺不错。

mxhao88 发表于 2020-3-20 06:56

厉害,学习了

山野村夫-陈墨 发表于 2020-3-20 18:41

j542936 发表于 2020-3-19 21:02
能不能搞个银行从业继续教育的这种工具

这种东西淘宝应该有成品吧 。 我这个就是闹着玩的

小傻孔儿 发表于 2020-3-20 19:28

前段时间刷会计的课,我都快刷吐了。 早有一些这种软件就帮大忙了

j542936 发表于 2020-3-20 22:21

山野村夫-陈墨 发表于 2020-3-20 18:41
这种东西淘宝应该有成品吧 。 我这个就是闹着玩的

某宝还真没有找到。所以才有这么一问~~
页: [1] 2
查看完整版本: 继超星之后,又有了智慧树-刷视频