记湖南青年大学习小工具的制作
| 分类在:码农笔记,校园生活 | 有 10 条评论

记湖南青年大学习小工具的制作

| 分类在:码农笔记,校园生活 | 有 10 条评论

记湖南青年大学习小工具的制作

前言

说真的,我觉得类似青年大学习这样的课程是非常好的,不但能让我们接受到良好的思想教育,还能将党和国家的最新文件精神第一时间细化、嚼碎成我们能听懂的知识通过多媒体的形式传播给广大共青团员。让我感到难受的是学校的强制措施和给学院团总支、班上团支部类似 KPI 形式的学习率,让同学们苦不堪言。你说你一个青年大学习,明明给了一个星期的学习时间,你硬要在一天之内规定所有人看完,不看还要扣分?那行呗,那就是绩效考核呗,那同学们有没有认真看反正你也无所谓呗,那既然都摆烂,那就摆的彻底一点呗。

过程

1. 抓包

最开始的时候我想的很天真,以为全国的青年大学习都是在一个统一的平台上观看,于是跑去 GitHub,想着直接嫖一波源码来二开一下,最多可能就是各省的接口不一样。结果翻来翻去,发现不同省份的青年大学习居然用的还是不同的平台和实现,比如【北京】的有网页端,那就非常简单了,随便几个 get 或是 post 就可以解决,再比如【福建】的可以通过 GithubAction 来实现自动学习,当然,还有【浙江】使用的 青春浙江 是微信公众号的形式,不过它好歹也能通过获取 openid 的方式来实现自动 token 和自动学习。

不过到了【湖南】这里,我翻遍了 GitHub 硬是没找到有相关的项目,便准备自己动手来整一个。

下载好 Fiddler 后,打开主界面(基本配置请百度,这里按下不表)

image-20211125214454157

通过修改 Tools/Options/Connections 来达到抓包手机端的功能

image-20211125214612834

将手机和电脑连接在同一局域网下,配置好手机端

然后打开手机微信,点击【订阅号】,点击【青年湖南】,点击【签到学习】

这时抓取的包如下:

image-20211125214817140

在手机端点击【青年大学习】进入到学习页面,随便点击一个课程

这时抓取的包如下:

image-20211125214938044

这其中的【图片信息】和【连接信息】暂时不需要,所以过滤掉,过滤后抓取的包如下:

image-20211125215026918

其中有用的接口信息如下:

一、微信网页授权接口

接口地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx830fdc2130cb3637&redirect_uri=http://dxx.hngqt.org.cn/dispatch?toUrl=%2Fstudy%2Findex&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect

image-20211125215118675

这个接口的用处主要是在用户点击后,生成用户的授权信息,并以此生成 cookie 存放在浏览器中。

微信网页授权的具体内容请看官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

二、首页接口

接口地址:http://dxx.hngqt.org.cn/study/index

image-20211125215353120

这是微信网页授权后的回调接口,也就是用户完成网页授权后会去到的第一个界面,没啥其他的作用。

三、历史学习记录添加接口(往期回顾)

接口地址:http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd

提交方式:POST

值:

KeyValue
projectIdxxx(期数,数字)

image-20211125215523776

然后这一页就没有接口了,我们回到 青年湖南-签到学习-青年大学习 ,点击【我的学习记录】

四、我的学习记录接口

接口地址:http://dxx.hngqt.org.cn/userProject/index2

提交方式:GET

image-20211125215937117

然后返回到 青年大学习 页面,点击【我的】,点击【我的积分】

五、我的积分记录接口

接口地址:http://dxx.hngqt.org.cn/userPoint/index

提交方式:GET

image-20211125220132741

因为我都学完了,所以没有截图到新学习,这里直接放出接口地址和值

六、新学习接口

接口地址:http://dxx.hngqt.org.cn/study/studyAdd

提交方式:POST

值:

KeyValue
projectIdxxx(期数,数字)

还有一个修改用户信息的接口,他网页上写的是只能修改三次,实测可以修改无数次

七、信息修改接口

接口地址:http://dxx.hngqt.org.cn/study/regAdd

提交方式:POST

值:

KeyValue
birthday1995-01-01
classType2
editMode1
ismember1
mobile15874526985
realname大学习
select1661700000
select2661808000
select3661807020
select4
select5

具体值的参数值这里按下不表,有需求的同学可以自己抓包查看。

还存在一些其他的接口,但没啥用了,我也懒得列举,有需求的同学可以自己抓包查看。

2. 获取期数代码和末尾截图

这青年大学习的期数代码也是奇奇怪怪,不晓得是什么生成规律,不过因为它要放出期数列表,通过抓包发现有一个 JSON 包含了所有的期数信息,直接拿来截取字符串。

image-20211125220751776

可以看到 url=http://h5.cyol.com/special/daxuexi/wzquanhui/m.html 中的 wzquanhui 便是期数代码。

于是直接用 PHP 访问 URL:https://h5.cyol.com/special/weixin/sign.json,获取 JSON 后进行字符串截取:

代码如下:

<?php
$url = "https://h5.cyol.com/special/weixin/sign.json";
$get_json = file_get_contents($url);
$get_json = json_decode($get_json,true);
$end_arr = end($get_json);                                                //截取数组末尾
$real_url = $end_arr['url'];                                              //获取键名为[url]的值

$explode_arr = explode("/",$real_url);                                     //通过"/"对 URL 进行分割

这时候我们获得了最新一期青年大学习的期数代码,其为:$explode_arr[5]

继续获得该期大学习的末尾截图,通过抓包发现末尾截图的调用地址为:https://h5.cyol.com/special/daxuexi/xxxxxx/images/end.jpg (其中 xxxx 为期数代码)

通过 PHP 凭借 URL,就可以获得最新一期青年大学习的末尾截图,值得注意的是,部分青年大学习的末尾截图可能有多张,主要体现在合辑上,所以我们通过一个邪路来获取多张截图

代码如下:

<?php
$image_url = "https://h5.cyol.com/special/daxuexi/".$explode_arr[5]."/images/end.jpg";

$i = 1;
$images = "<img src=\"" . $image_url . "\">";
while ($i < 6) {
    $image_url = "https://h5.cyol.com/special/daxuexi/" . $explode_arr[5] . "/images/end" . $i . ".jpg";
    // echo ($image_url);
    if (file_get_contents($image_url)) {
        $images = $images."<img src=\"" . $image_url . "\">";
        // echo ($images);
    }
    $i++;
}

因为没有对 file_get_contents 的出错信息进行处理,所以如果获取不到网页信息,便会抛出警告,如果想要忽略警告,则在 PHP 开头加上 error_reporting(0); 即可

此时我们拥有了最新一期的期数代码和末尾截图,接下来就开始提交学习记录

3. 提交学习记录

在前面我们知道了新增学习记录和添加历史学习记录的接口地址和提交方式,那么我们现在就来获得最新一期的青年大学习期数数值。

通过抓包我发现2021年11月22日发布的最新一期青年大学习的期数数值为 104 那么我们就以这一期为基本,以后每过 7 天,就给这个数值增加 1

代码如下:

<?php
$Version = 104;                                   //基本期数数值
$O_data = 1637510400;                             //基本期数发布时间
$N_data = time();                                 //当前时间
$data = $N_data - $O_data;                        //现在距离基本期数过去了多久
$day = $data/3600/24;                            
$N_Version = 104 + floor($day/7);                 //每过 7 天,基本期数增加 1

有了期数数值,我们就可以通过【表单】的形式向接口发起请求了

代码如下:

<form action="http://dxx.hngqt.org.cn/study/studyAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version) ?>】">
</form>

同理,回顾学习也很简单

代码如下:

<form action="http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version - 1) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version - 1) ?>】">
</form>
<form action="http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version - 2) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version - 2) ?>】">
</form>
<form action="http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version - 3) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version - 3) ?>】">
</form>
<form action="http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version - 4) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version - 4) ?>】">
</form> 
<form action="http://dxx.hngqt.org.cn/historystudy/studyHistoryAdd" method="post">
    <input type="text" name="projectId" value="<?php echo($N_Version - 5) ?>" hidden="">
    <input type="submit" value="I Like DaXueXi 【<?php echo($N_Version - 5) ?>】">
</form>

只要注意接口地址就没有问题了

4. 展示末尾截图

学习记录提交后还有一件麻烦事,就是要提交学习截图给团支书,这里直接将我们上面获取的末尾截图展示出来,方便保存

代码如下:

<?php echo($images); ?>

结束语

至此,一个简单粗暴的 湖南青年大学习 小工具就完成了,来张成果截图

img

本文写作于 1年前,文章内容可能已经与事实不符,如有疑问,请咨询作者。

留言:
  1. xiao

    期数不能这么草率的没7天+1,因为有的时候并不会发布新的期数,可以获取列表,选择最新的那个project_id

    Reply
    1. @xiao

      你好,哈哈哈哈哈哈,当时想着能用就行,现在接口基本全都变了,我也没有维护他了,之后我把源码全部挂到GitHub上去

      Reply
  2. tyhzrj

    似乎没找到 php 源码?可以挂在 Github 上么?

    Reply
    1. @tyhzrj

      你好,过两天我挂上去

      Reply
  3. 知我

    可否制作一个批量学习的软件,每周有任务都很难完成

    Reply
    1. @知我

      你好,因为微信小程序 cookies 有时效性,无法长时间保存,所以做不到的喔

      Reply
  4. zyldaze

    前人栽树后人乘凉,在github上面搜就有了,感谢大佬

    Reply
  5. 魔法柴郡猫

    你好,请问可否分享一下完成的青年大学习小助手呢?谢谢!

    Reply
    1. 魔法柴郡猫
      @魔法柴郡猫

      在你的github上找到了,叨扰了,感谢

      Reply
      1. @魔法柴郡猫

        哈哈哈哈哈,代码写的丑陋,仅供参考喔

        Reply