吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4411|回复: 26
收起左侧

[Web逆向] 智慧职教 icve 课程接口分析

  [复制链接]
pap 发表于 2023-10-23 08:32
本帖最后由 pap 于 2023-10-23 08:43 编辑

最近学校要求看智慧职教,课程有60个学时,于是打算写一个小工具过掉他
由于我只是为了功能实现,就不一一获取Cookie了,不过他是从登录接口获取一个TOKen
有兴趣的可以去抓,我的目的是为了实现功能,能用就可以

首先我先寻找视频播放接口,我发现了这个接口,虽然每隔秒都在发起请求,
屏幕截图 2023-10-23 080134.jpg

但是看完视频发送的请求不一样,于是我直接调用他发完请求的参数进行调试
“cellId”, id//课程Id
“learntime”, “121.8”//学习的时间,我这边直接用常量代替
“status”, “1”//1为完成视频状态
经过调试,课程进度成功增加了
使用易语言编写代码
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.版本 2
 
.子程序 过课, 文本型
.参数 id, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 局_提交数据, 文本型
.局部变量 局_提交cookie, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
.局部变量 json, 类_json
id = 文本_取出中间文本 (id, #常量1, #常量2)
局_网址 = “https://www.icve.com.cn/study/directory/updateStatus”
局_方式 = 1
ADD_数据包.添加 (“cellId”, id)
ADD_数据包.添加 (“learntime”, “121.8”)
ADD_数据包.添加 (“status”, “1”)
局_提交数据 = ADD_数据包.获取Post数据 ()
局_提交cookie = Cookie    //全局变量
ADD_协议头.添加 (“Accept”, “*/*”)
ADD_协议头.添加 (“Accept-Language”, “zh-CN,zh;q=0.9”)
ADD_协议头.添加 (“Connection”, “keep-alive”)
ADD_协议头.添加 (“Content-Length”, “50”)
ADD_协议头.添加 (“Content-Type”, “application/x-www-form-urlencoded; charset=UTF-8”)
ADD_协议头.添加 (“Host”, “www.icve.com.cn”)
ADD_协议头.添加 (“Origin”, “https://www.icve.com.cn”)
ADD_协议头.添加 (“Sec-Fetch-Dest”, “empty”)
ADD_协议头.添加 (“Sec-Fetch-Mode”, “cors”)
ADD_协议头.添加 (“Sec-Fetch-Site”, “same-origin”)
ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36”)
ADD_协议头.添加 (“X-Requested-With”, “XMLHttpRequest”)
ADD_协议头.添加 (“sec-ch-ua-mobile”, “?0”)
局_提交协议头 = ADD_协议头.获取协议头数据 ()
局_结果 = 网页_访问_对象 (局_网址, 局_方式, 局_提交数据, 局_提交cookie, , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_编码转换对象 (局_结果))
返回 (局_返回)


屏幕截图 2023-10-23 080155.jpg


用易语言写了一个子程序,由于后期使用json解析获取课程ID在课程ID前后有“”,这会影响我们视频进度的修改,
于是使用文本_取出中间文本 (id, #常量1, #常量2),将“”去除,只留下课程id

功能实现了,又有了一个新问题,一项科目有十几节甚至几十节课,
我们不可能一个个的复制粘贴id,于是我们需要写一个子程序获取课程Id并且调用过课子程序

QQ图片20231023083804.png
我们在课程页面进行抓包,发现是一个接口返回的Json,这就简单了,生成一个获取Json子程序
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.版本 2
 
.子程序 获取课程, 文本型
.参数 课程id
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 局_提交cookie, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
 
 
局_网址 = “https://www.icve.com.cn/study/Directory/directoryList?courseId=” + 课程id
局_方式 = 0
局_提交cookie = Cookie
ADD_协议头.添加 (“Accept”, “*/*”)
ADD_协议头.添加 (“Accept-Language”, “zh-CN,zh;q=0.9”)
ADD_协议头.添加 (“Connection”, “keep-alive”)
ADD_协议头.添加 (“Content-Length”, “50”)
ADD_协议头.添加 (“Content-Type”, “application/x-www-form-urlencoded; charset=UTF-8”)
ADD_协议头.添加 (“Host”, “www.icve.com.cn”)
ADD_协议头.添加 (“Origin”, “https://www.icve.com.cn”)
ADD_协议头.添加 (“Referer”, “https://www.icve.com.cn/study/directory/dir_course.html?courseId=wa77apvwaretikfvq20vg&chapterId=ag77apvo65pr3dc7cehq&sort=0.001”)
ADD_协议头.添加 (“Sec-Fetch-Dest”, “empty”)
ADD_协议头.添加 (“Sec-Fetch-Mode”, “cors”)
ADD_协议头.添加 (“Sec-Fetch-Site”, “same-origin”)
ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36”)
ADD_协议头.添加 (“X-Requested-With”, “XMLHttpRequest”)
ADD_协议头.添加 (“sec-ch-ua-mobile”, “?0”)
 
 
局_提交协议头 = ADD_协议头.获取协议头数据 ()
 
局_结果 = 网页_访问_对象 (局_网址, 局_方式, , 局_提交cookie, , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_编码转换对象 (局_结果))
返回 (局_返回)


使用大课程的Id、获取课程里面所有的课程Json,随后我们该写一个解析Json并且调取过课
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.版本 2
.支持库 spec
 
.子程序 子程序1
.参数 课程id, 文本型
.局部变量 bool, 逻辑型
.局部变量 json, 类_json
.局部变量 array, 类_json
.局部变量 n, 整数型
.局部变量 i, 整数型
.局部变量 y, 整数型
 
bool = json.解析 (到文本 (获取课程 (课程id)))
.如果 (bool)
 
.否则
 
.如果结束
array = json.取属性 (“directory”)
n = array.成员数 ()
.计次循环首 (n, i)
 
    .计次循环首 (json.取属性 (“directory[” + 到文本 (i - 1) + “].chapters”).成员数 (), y)
        调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Title”) + #换行符)
        调试输出(json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Id”) + #换行符)
        调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Title”) + #换行符)
        调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Id”) + #换行符)
        过课 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Id”))
        过课 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Id”))
        延迟 (到整数 (编辑框7.内容))
    .计次循环尾 ()
.计次循环尾 ()


由于我的课程只有视频+PPT,我就只循环了cells[0],cells[1]的Id进行课程,如果有人想完善可以识别一下Json
我也没做课程的进度识别,运行就是从0刷到满,因为我只是为了实现功能,不是为了做一个所有人可以用的程序//主要还是懒

另外请谨慎使用我的方法,由于原本视频是每隔几秒调用一次Api,最后再发起一次API结束,我这种方法无疑后台肯定能监控到,我甚至将学习的时间设置为常量
仅供参考,我也是为了赶快刷完省事截个图才选择这种方法的,不排除后期对我的进度清零的可能
QQ图片20231023083036.png
附上我的程序封装图片,很简单的一个东西,可以参考一下,由于版规限制,就不提供软件了
QQ图片20231023082645.png

免费评分

参与人数 4威望 +1 吾爱币 +23 热心值 +4 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
Yangzaipython + 1 鼓励转贴优秀软件安全工具和文档!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
魔道书生 + 2 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

darksied 发表于 2023-10-23 11:46
监测到课程直接更新完成状态?这种后台很容易查出来。
试试:按照课程时长,自动定时调用updatestatus接口,模拟浏览器行为。这样花的时间长点,但是有每次更新的记录
你是谁啊这么帅 发表于 2023-10-23 08:42
hpzka 发表于 2023-10-23 08:42
xiaocaiji001 发表于 2023-10-23 09:50
佬软件哪里搞
玩机小白丶王 发表于 2023-10-23 10:06
有爬到题库接口么
dafs 发表于 2023-10-23 10:20
分析很好  源代码也很好  值得学习和鼓励
yjj0xxml 发表于 2023-10-23 11:09
没有这个技术,是能任命刷视频~
cao777 发表于 2023-10-23 11:22
现在电脑开机24小时 也没多少电费
我宁可写个按键精灵让他自动点击 真实的播完 都不能搞这个
被抓住 影响就太大了
NINE09 发表于 2023-10-23 11:28
分析很好  源代码也很好  值得学习和鼓励
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-5 02:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表