2024智慧树刷课脚本 基于Python Playwright的自动化刷智慧树程序 [有免安装版]

04-08 1689阅读

2024/3/30 rebuild-3.10.1 更新
  • 此次更新后,最高可支持1.8倍速播放;

  • 优化了程序逻辑,进一步提升稳定性;

    (倍速上限经过用户@m0_66289339 测试得出, 在此表示感谢~~)


    Autovisor

    智慧树视频课辅助工具,开启挂机摸鱼时代~

    新学期必备干货, 建议收藏备用 !!

    项目主页:CXRunfree/Autovisor(github.com) (不妨点个star吧)

    2024智慧树刷课脚本 基于Python Playwright的自动化刷智慧树程序 [有免安装版]

    程序介绍

    这是一个可无人监督的自动化程序,由Python和JavaScript编写而成。相对于油猴脚本,本程序可有效防止被网页检测。

    核心原理是使浏览器模拟用户的点击操作, 不会导致封号等问题

    程序功能

    • 可以快速登录

    • 自动播放和切换下一集

    • 跳过弹窗和弹出的题目

    • 自动静音、调整1.5倍速和流畅画质

    • 检测视频是否暂停并续播 (不用担心视频意外暂停了~)

    • 检测当前学习进度并后台实时更新

    • 根据当前时间自动设置背景颜色(白昼/暗夜)

    • 加入了定时模拟鼠标滑动功能 (减少被检测到的概率)
    • 完成章节时将提示已刷课时长

      使用须知(重要 !!)

      1.请确保系统为windows10及以上

      • 默认启动Edge(win10以上系统会自带);
      • 请确保Edge或Chrome安装在系统默认位置;

        ​2.文件夹内有 account.json文件(可能没显示.json后缀名),请用文本编辑器打开;

        3.填写配置文件

        • “User”:输入你的 账户名;
        • “Password”:输入你的 密码;
        • “Driver”:指定启动的 浏览器(可选Chrome);
        • “Url”:输入网课的 具体网址,保存后关闭,例如:

          注意:

          • 此脚本仅支持共享课视频, 网址格式与需下面一致, 填入时请看仔细;

          • 只能使用英文标点

            2024智慧树刷课脚本 基于Python Playwright的自动化刷智慧树程序 [有免安装版]

            4.运行程序,会自动打开浏览器,登录界面的滑块验证请手动完成,进入网课界面后就可以自动刷课了 !


            发行版下载:

            Github: Releases · CXRunfree/Autovisor (github.com) (留下一个免费的 star吧?)

            网盘备用: [蓝奏云] Autovisor-for-windows  密码:492l

            为便于阅读, 源码已放在文末

            如有疑问,可以在评论区留言, 每条留言作者都会认真看的 !

            (报错问题请附上报错信息,在log.txt文件内)

            常见问题

            1.为什么会出现一个命令行黑框?

            • 这是程序运行的后台,你可以查看当前运行的状态

              2.为什么网页一片空白/无法加载课程界面,一段时间后程序就退出了?

              • 大概率你没有在account文件里填入课程的网址;

                此外从登录完成后到进入课程界面的过程不需要鼠标点击

                3.为什么运行程序只出现后台却没出现浏览器界面?

                • 只要后台未异常退出就不必担心; 如果出错可能是你的浏览器安装路径有问题

                  已知Bug:

                  • 长时间挂机有概率弹出人机验证, 如果1.5h内未通过验证, 程序将自动结束进程;
                  • 若出现其他异常崩溃,请在Github提交issue并附上日志文件log.txt的信息;

                    碎碎念:

                    觉得体验还不错? 来给项目发电支持一下吧~! 

                    (其实作者也要吃饭的 ^-^)

                    2024智慧树刷课脚本 基于Python Playwright的自动化刷智慧树程序 [有免安装版]

                    注意:本程序只可用于学习和研究计算机原理(你懂的)

                      还等什么? 快开始愉快的刷课吧~ !

                    源代码
                    #encoding=utf-8
                    import re
                    import traceback
                    import json
                    import time
                    from json import JSONDecodeError
                    from playwright.sync_api import sync_playwright
                    from playwright._impl._errors import TargetClosedError, TimeoutError
                    # constants
                    login_url = "https://passport.zhihuishu.com/login"
                    # Xpath
                    option1 = '//*[@id="playTopic-dialog"]/div/div[2]/div/div[1]/div/div/div[2]/ul/li[1]/div[2]'
                    option2 = '//*[@id="playTopic-dialog"]/div/div[2]/div/div[1]/div/div/div[2]/ul/li[2]/div[2]'
                    # javascript
                    # 登录
                    login_js = '''document.getElementsByClassName("wall-sub-btn")[0].click();'''
                    block_js = '''return document.getElementsByClassName("yidun_jigsaw")[0].src'''
                    bg_js = '''return document.getElementsByClassName("yidun_bg-img")[0].src'''
                    # 弹窗
                    pop_js = '''document.getElementsByClassName("iconfont iconguanbi")[0].click();'''
                    # pop2_js = '''document.evaluate('//*[@id="app"]/div/div[1]/div[1]/span/a',document).iterateNext().click();'''
                    # 其他
                    night_js = '''document.getElementsByClassName("Patternbtn-div")[0].click()'''
                    def auto_login(_user, _pwd):
                        if not user or not pwd:
                            raise UserWarning
                        page.goto(login_url)
                        page.locator('#lUsername').fill(_user)
                        page.locator('#lPassword').fill(_pwd)
                        page.wait_for_timeout(500)
                        page.evaluate(login_js)
                    def init_page():
                        # 启动自带浏览器
                        if driver == "Chrome":
                            print("正在启动Chrome浏览器...")
                            browser = p.chromium.launch(channel="chrome", headless=False)
                        else:
                            print("正在启动Edge浏览器...")
                            browser = p.chromium.launch(channel="msedge", headless=False)
                        context = browser.new_context()
                        page = context.new_page()
                        # 设置程序超时时限
                        page.set_default_timeout(300 * 1000 * 1000)
                        # 设置浏览器视口大小
                        viewsize = page.evaluate('''() => {
                                           return {width: window.screen.availWidth,height: window.screen.availHeight};}''')
                        viewsize["height"] -= 50
                        page.set_viewport_size(viewsize)
                        return page
                    def optimize_page():
                        # 关闭学习须知
                        page.evaluate(pop_js)
                        # 根据当前时间切换夜间模式
                        hour = time.localtime().tm_hour
                        if hour >= 18 or hour = 1:  # 每完成一节提示一次时间
                                        print("本次课程已学习:%.1f min" % time_period)
                                    # 如果当前小节是最后一节代表课程学习完毕
                                    class_name = all_class[-1].get_attribute('class')
                                    if "current_play" in class_name:
                                        print("已学完本课程全部内容!")
                                        print("==" * 10)
                                        break
                                    else:  # 否则为完成当前课程的一个小节
                                        print(f"\"{title}\" Done !")
                                except TimeoutError:
                                    if page.query_selector(".yidun_modal__title"):
                                        print("检测到安全验证,正在等待手动完成...")
                                        page.wait_for_selector(".yidun_modal__title", state="hidden", timeout=90 * 60 * 1000)
                                    elif page.query_selector(".topic-item"):
                                        skip_question()
                    if __name__ == "__main__":
                        print("项目作者:CXRunfree 版权所有")
                        print("===== Runtime Log =====")
                        try:
                            print("正在载入数据...")
                            with open("account.json", "r", encoding="utf-8") as f:
                                account = json.loads(f.read())
                            user = account["User"].strip()
                            pwd = account["Password"].strip()
                            driver = account["Driver"].strip()
                            urls = account["Url"]
                            if not isinstance(urls, list):
                                print('[Error]"Url"项格式错误!')
                                raise KeyError
                            with sync_playwright() as p:
                                page = init_page()
                                main_function()
                                print("==" * 10)
                                print("所有课程学习完毕!")
                                input()
                        except Exception as e:
                            if isinstance(e, JSONDecodeError):
                                print("[Error]account文件内容有误!")
                            elif isinstance(e, KeyError):
                                print("[Error]可能是account文件的配置出错!")
                            elif isinstance(e, UserWarning):
                                print("[Error]是不是忘记填账号密码了?")
                            elif isinstance(e, FileNotFoundError):
                                print("[Error]程序缺失依赖文件,请重新安装程序!")
                            elif isinstance(e, TargetClosedError):
                                print("[Error]糟糕,网页关闭了!")
                            elif isinstance(e, TimeoutError):
                                print("[Error]网页长时间无响应,自动退出...")
                            else:
                                print(f"[Error]{e}")
                                with open("log.txt", "w", encoding="utf-8") as doc:
                                    doc.write(traceback.format_exc())
                                print("错误日志已保存至:log.txt")
                                print("系统出错,要不重启一下?")
                            input()
                    
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]