青书学堂 看视频 看课时 php 懒人版

news2024/12/24 3:42:24

上一篇关于青书学堂的 操作起来 有点麻烦

趁这几天有时间 优化了一下

建议php 7.3 版本 

(本程序会用到php里的curl 模块 记得打开) 

如果运行时 获取信息空白(https 容易出现) 可以测试一下自己php的curl能不能正常用 如果不能可以参考一下我的另一篇文章

SSL rtificate problem: unable to get local issuer certificate curl采集https数据采集不到-CSDN博客

只需要登录网页版青书学堂 获取到请求的 cookie

把上面的cookie 改到文件里 的 第5行


<?php
// 需要改成自己的 
// 自己的 cookie 需要更改一下 具体可以查看 浏览器的请求头cookie ______________________________
// define('USER_COOKIE', '改成自己的');






// 当前学校索引 _____________
define('SCHOOL_INDEX', 0); // 默认第一个学校

// 查看的分钟数 建议 ________________
define('MINUTE', 60); // 分钟

// 当前学校 前缀
define('SCHOOL_PREFIX', getSchool());

// 获取学校
function getSchool() {

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://www.qingshuxuetang.com/GetUserOrganizations',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_HTTPHEADER => array(
            'Cookie: ' . USER_COOKIE,
        ),
      ));
      
      $response = curl_exec($curl);
      
      curl_close($curl);
      $response = json_decode($response, true);
      $symbol = '';
      if (isset($response['data']) && count($response['data']) > 0) {
            $degrees = $response['data']['degrees']??[];
            foreach ($degrees as $dk => $dv) {
                if (SCHOOL_INDEX == $dk) {
                    echo '看视频的';
                }
                echo '学校 ' . $dv['name'] . ' 索引 ' . $dk . PHP_EOL;
            }

          $symbol = $degrees[SCHOOL_INDEX]['symbol'];
      }
      if (empty($symbol)){
        dd('获取学校信息失败');
      }
      return $symbol;
}

// 获取所有课程
function getCourse()
{
    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://degree.qingshuxuetang.com/' . SCHOOL_PREFIX . '/Student/Course/CourseData?_t=' . time() * 1000,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => array(
              'Accept:application/json',
            'Cookie: ' . USER_COOKIE,
              'Content-Type:application/json',
            'Device-Trace-Id-QS: 7a89ee95-1573-4306-a554-73ccb49e2dfc',
            'User-Agent: Mozilla/5.0 windows12 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        ),
    ));

    $response = curl_exec($curl);
    curl_close($curl);
    $response = json_decode($response, true);
    if (isset($response['message']) && $response['message'] == '成功') {
        return $response['data']??[];
    }
    dd('获取课程信息失败');
}

$course = getCourse();
$currentSource = [];
foreach ($course as $key => $value) {
    if ($value['isCurrent'] == true) {
        $currentSource[] = $value;
    }
}
if (empty($currentSource)) {
    dd('没有获取到要学习的课程');
}
$courseIds = [];
foreach ($currentSource as $cuk => $cuv) {
    $courseId = $cuv['courseId'];
    $teachPlanId = $cuv['teachPlanId'];
    $periodId = $cuv['periodId'];

    $courseName = $cuv['courseName'];
    echo $courseName . ' 获取章节信息中' . PHP_EOL;
    $teachingPlanCourseId = $cuv['teachingPlanCourseId'];
    $chapterUrl = getChapterUrl($courseId, $teachPlanId, $periodId);
    $chapter = getChapter($chapterUrl);
    $courseIds[] = [
        'teachPlanId' => $teachPlanId,
        'courseId' => $courseId,
        'courseIds' => getChapterIds($chapter),
        'courseName' => $courseName,
        'periodId' => $periodId,
        'teachingPlanCourseId' => $teachingPlanCourseId,
    ];
}

$refreshData = [];
foreach ($courseIds as $cik => $civ) {
    $chapterIds = $civ['courseIds'];
    foreach ($chapterIds as $ck => $cv) {
        echo $civ['courseName'] . ' 第[ ' . ($ck+1) . ' ]节 初始化学习中 ' . PHP_EOL;
        list($beginId, $referer) = begin($civ, $cv);
        $refreshData[] = [
            'courseId' => $civ['courseId'],
            'contentId' => $cv,
            'beginId' => $beginId,
            'referer' => $referer,
        ];
    }
}

$i = (MINUTE * 6);
while ($i > 0) {
    $i--;
    echo '还剩 ' . $i . ' 次刷新' . PHP_EOL;
    foreach ($refreshData as $rdk => $rdv) {
        refresh($rdv['beginId'], $rdv['courseId'], $rdv['contentId'], $rdv['referer']);
    }
    sleep(10);
}
echo '结束';

// 获取章节链接
function getChapterUrl($courseId, $teachPlanId, $periodId)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://degree.qingshuxuetang.com/" . SCHOOL_PREFIX . "/Student/Course/CourseStudy?courseId=$courseId&teachPlanId=$teachPlanId&periodId=$periodId",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_HTTPHEADER => array(
            'Cookie: ' . USER_COOKIE,
            'User-Agent: Mozilla/5.0 windows12 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        ),
    ));
    $response = curl_exec($curl);
    if (empty($response)) {
        dd('获取章节链接 获取失败');
    }
    $reg = '/Svc\/GetCoursewareTree\?(.*?)\"/is';
    preg_match($reg, $response, $matches);
    curl_close($curl);
    if (isset($matches[1]) && !empty($matches[1])) {
        return $matches[1];
    }
    dd('获取章节链接失败');
}

// 获取章节信息
function getChapter($chapterUrl)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://degree.qingshuxuetang.com/' . SCHOOL_PREFIX . '/Svc/GetCoursewareTree?' . $chapterUrl,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_HTTPHEADER => array(
            'Cookie: ' . USER_COOKIE,
            'User-Agent: Mozilla/5.0 windows12 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        ),
    ));
    $response = curl_exec($curl);
    if (empty($response)) {
        dd('获取章节信息 获取失败');
    }
    $response = json_decode($response, true);
    $data = $response['data']??[];

    if (empty($data)) {
        dd('获取章节信息 为空');
    }
    return $data;
}

// 获取课程id
function getChapterIds($data) {
    $courseData = [];
    if (isset($data['nodes']) && count($data['nodes']) > 0) {
        $tmpNodes = $data['nodes'];
        foreach ($tmpNodes as $tnk => $tnv) {
            // 判断是否为视频 ['html', 'video']
            if (in_array($tnv['type'], ['video'])) {
                $courseData[] = $tnv['id'];
            } else {
                $courseData = array_merge($courseData, getChapterIds($tnv));
            }
        }
    }
    return $courseData;
}


// 开始学习
function begin($civ, $contentId)
{
    $courseId = $civ['courseId'];
    $curl = curl_init();
    $referer = "https://degree.qingshuxuetang.com/" . SCHOOL_PREFIX . "/Student/Course/CourseShow?teachPlanId=" . $civ['teachPlanId'] . "&periodId=" . $civ['periodId'] . "&courseId=$courseId&nodeId=$contentId";
    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://degree.qingshuxuetang.com/' . SCHOOL_PREFIX . '/Student/Course/UploadStudyRecordBegin?_t=' . (time() * 1000),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => '{
        "classId": "' . $civ['teachPlanId'] . '",
        "courseId": "' . $courseId . '",
        "contentId": "' . $contentId . '",
        "contentType": 11,
        "periodId": "' . $civ['periodId'] . '",
        "position": 0,
        "detectId": null
    }',
        CURLOPT_HTTPHEADER => array(
            'Cookie: ' . USER_COOKIE,
            'User-Agent: Mozilla/5.0 windows12 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
            'Content-Type:application/json',
            "Referer: $referer",
        ),
    ));
    $response = curl_exec($curl);
    // dd($response);
    echo 'begin 请求结果:' . $response . PHP_EOL;
    curl_close($curl);
    $response = json_decode($response, true);
    if (isset($response['message']) && $response['message'] == '成功') {
        return [$response['data'], $referer];
    } else {
        echo '开始学习 请求失败' . PHP_EOL;
        dd($response);
    }
}


// 刷新当前学习进度
function refresh($id, $courseId, $contentId, $referer)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://degree.qingshuxuetang.com/' . SCHOOL_PREFIX . '/Student/Course/UploadStudyRecordContinue?_t=' . (time() * 1000),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => array('recordId' => $id, 'end' => 'true', 'position' => '3000', 'timeOutConfirm' => 'false'),
        CURLOPT_HTTPHEADER => array(
            'Cookie: ' . USER_COOKIE,
            'Origin: https://degree.qingshuxuetang.com',
            "Referer: $referer",
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0',
        ),
    ));

    $response = curl_exec($curl);
    // dd(curl_errno($curl));
    echo 'refresh 请求结果:' . $response . PHP_EOL;
    curl_close($curl);
    $response = json_decode($response, true);
    if (isset($response['message']) && $response['message'] == '成功') {
        return true;
    } else {
        echo '响应错误';
        // dd($response);
    }
}


// 打印输出
function dd($data, $var_dump = false)
{
    echo PHP_EOL;
    if ($var_dump) {
        var_dump($data);
    } else {
        print_r($data);
    }
    die();
}

保存一下文件 比如 保存为 index.php   然后 就可以了

php index.php

回车后  出现这样的提示 即表示成功  目前默认时间为1个小时    一个小时后   当前学期的课程就都是 看完一个小时后的了

下图为 运行了40多分钟左右的样子

如果对你有帮助 麻烦给个一键三连  有不会的 欢迎随时打扰~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始深度学习(3)——概率

1 基本概率论 大数定律&#xff08;law of large numbers&#xff09;&#xff1a;随着投掷次数的增加&#xff0c;这个估计值会越来越接近真实的潜在概率。从概率分布中抽取样本的过程称为抽样&#xff08;sampling&#xff09;将概率分配给一些离散选择的分布称为多项分布&a…

【大模型实战篇】RoPE旋转位置编码PyTorch代码分析

1. 背景介绍 之前我们通过两篇技术文章《LLaMA3结构关键模块分析》和《RoPE旋转位置编码底层数学原理分析》对旋转位置编码RoPE的原理进行了必要的讲解。接下来&#xff0c;我们将针对来自rotary-embedding-torch【1】开源库的实现&#xff0c;对RoPE的PyTorch代码实现进行分…

前后端分离的security角色权限实现

本案例是使用SpringBoot2.7.6securityMyBatis-plusVue2axios实现 一、security简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;专为Java应用程序设计。 &#xff08;1&#xff09;基本功能 身份验证&#xff08;Authentication&#x…

关于安装MySQL遇到的问题

数据库相关概念 &#x1f4a1;数据库系统 &#xff08; DataBase System&#xff0c; 简称 DBS&#xff09; 是指计算机系统引入数据库后的系统构成&#xff0c; 是一个具有管理数据库功能的计算机软硬件综合系统。 数据库系统可以实现有组织地、动态地存储大量数据、提供数…

【补-办公室】拟批语的区别

拟批语 常见拟批语 批示、审示、阅示、核注 审批、审核、审阅、审定&#xff08;订&#xff09;、审发、审议、审处、阅改、阅知、阅研、阅处、研提、研办、研复、核&#xff08;转&#xff09;报、核示、核批、批办等 阅示和审示 区分是收文还是发文 发文审&#xff0c;收文阅…

本地部署AList并挂载小雅超集结合内网穿透实现无公网IP远程访问

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff…

jenkins-gitee-genkins

在电脑下载git 用一个有war包的项目 下载插件 添加 .ignore文件 添加target 建git仓库 提交 推送 推送完成在gitee能看到 这时候已经完成了前两部 项目如果添加功能

[嵌入式 C 语言] int main(int argc, char *argv[])

一、含义 在C语言中&#xff0c;main 函数是程序的起点&#xff0c;也就是执行的入口点。main 函数可以接受命令行参数&#xff0c;并且通常定义如下&#xff1a; int main(int argc, char *argv[]) int argc: 这个参数代表“参数计数”&#xff08;Argument Count&#xff0…

实验记录 | PointMLP | Grouping layer + Geometric Affine

引言 自 PointNet 腾空出世&#xff0c;点云分析的深度框架便成为了该领域的热点&#xff0c;点云学习网络的发展便一发不可收拾。和大部分深度网络一样&#xff0c;点云网络遵循着 “降采样&#xff0c;聚合特征” 的基本思路&#xff0c;逐步提取点云的深度特征。 大部分点…

【九芯电子】星空灯语音识别芯片方案选型——NRK3301

在快节奏的现代生活中&#xff0c;人们对于居家环境的舒适性与便捷性追求日益增强&#xff0c;而星空灯语音控制的技术诞生&#xff0c;正是这一追求下的智慧结晶&#xff0c;极大地提升了居住的愉悦感与科技感。 九芯NRK3301语音识别芯片‌被广泛应用于智能照明产品中&#xf…

【python因果推断库2】使用 PyMC 模型进行差分-in-差分(Difference in Differences, DID)分析

目录 使用 PyMC 模型进行差分-in-差分&#xff08;Difference in Differences, DID&#xff09;分析 导入数据 分析 使用 PyMC 模型建模银行业数据集 导入数据 分析 1 - 经典 22 差分-in-差分 (DiD) 分析 2 - 具有多个干预前后观测值的差分-in-差分 (DiD) 分析 使用 PyMC…

VSCode + Git的常规操作(一)【描述详细直白,小白一学就会】

目录 一、文章简介 二、具体操作流程 1、操作前提 2、设置用户名、用户邮箱 &#xff08;1&#xff09;打开命令框 &#xff08;2&#xff09;配置用户名 &#xff08;3&#xff09;配置用户名邮箱 &#xff08;4&#xff09;查看配置 3、SSH密钥对的介绍、生成及配置…

008、架构_MDS

​架构 什么是元数据 什么是元数据 元数据又称中介数据、中继数据,为描述数据的数据,主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能;GoldenDB 数据库元数据大致分为两类: 数据字典:库、表、字段属性信息、视图、函数、存储过程属…

【代码随想录训练营第42期 Day48打卡 - 单调栈 - LeetCode 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

目录 一、做题心得 二、题目与题解 题目一&#xff1a;739. 每日温度 题目链接 题解1&#xff1a;暴力--超时 题解2&#xff1a;单调栈 题目二&#xff1a;496.下一个更大元素 I 题目链接 题解&#xff1a;单调栈哈希 题目三&#xff1a;503.下一个更大元素II 题目链…

神经网络训练不起来怎么办(五)| Batch Normalization

Ⅰ&#xff0c;领域背景 训练困境&#xff1a;当 input feature 在不同 dimension 上差距很大的时候&#xff0c;会产生一个非常崎岖的 error surface&#xff08;误差平面&#xff09;。这种崎岖多变的误差平面容易导致训练陷入以下的几个困境。 收敛困难&#xff1a;在崎岖…

注释1111

3。3 Batch Normalization (BN) 的工作原理 Batch Normalization 是在处理一个 "批次" 数据时&#xff0c;计算这个批次内所有样本的平均值和方差&#xff0c;然后使用这些统计量对每个样本进行归一化。这就是说&#xff1a; 批次&#xff08;batch&#xff09;&a…

局部整体(五)利用python绘制旭日图

局部整体&#xff08;五&#xff09;利用python绘制旭日图 旭日图&#xff08; Sunburst Charts&#xff09;简介 由于其形状像太阳光由内向外辐射出来&#xff0c;所以叫SunBurst(太阳爆发)&#xff0c;中文也叫日出图。是多个层级的环图/饼图的拓展&#xff0c;可以显示多个…

GNU的编译工具链

文章目录 GNU的编译工具链 GNU的编译工具链 预编译器cpp 编译器 cc1 汇编器 as 链接器 ld 其中cpp和cc1属于gcc的一部分&#xff0c;as和ld属于binutils的一部分。

MySQL-如何定位慢查询

慢查询&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09;

STM32基础篇:PWR

PWR简介 PWR&#xff08;Power Control&#xff09;&#xff0c;为电源控制模块&#xff0c;负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能。 1、可编程电压监测器 简称PVD&#xff0c;可以监控VDD电源电压。当VDD下降到PVD阀值以…