吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3783|回复: 22
收起左侧

[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] 纯文本查看 复制代码
.版本 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] 纯文本查看 复制代码
.版本 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] 纯文本查看 复制代码
.版本 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, 2024-11-15 09:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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