User-Profile-Image
hankin
  • 5
  • 首页
  • 留言
  • 仓库
  • 云端
  • 分类
    • 随笔
    • 安卓逆向
    • php
    • node.js
    • C#
  • 页面
    • 个人技术栈
    • 留言
  • 友链
    • 沉沦云API
    • 沉沦云端
    • SinKingMusic
    • 美和易思刷课
    • 神奇的七云
    • khaos编程小站
    • 小九实验室
    • 一叶三秋
    • 青年的故事
    • :李白云博客
    • 噜阿噜-资源站
    • 小k
Help?

Please contact us on our email for need any support

Support
    首页   ›   php   ›   正文
php

美和易思app协议分析及功能实现(美和易思刷课)

2020-05-08 13:57:08
310907  1155 63

获取apk文件

点击下载

反编译apk

  1. apktool.bat;apktool.jar
    作用:最大程度的还原apk中的manifest文件和资源文件 。使用apktool工具反编译apk文件比直接解压同一个apk文件大;还可以将反编译之后的apk重新打包成apk文件,但需要重新签名,才能安装使用。

  2. classes-dex2.jar
    作用:将APK直接解压后,目录下包含的一个classes.dex文件反编译为

  3. dex2jar
    作用:直接查看classes-dex2jar.jar文件

分析反编译后的包体

查看包体,会得到assets目录,如图
apps目录则是app的核心代码,这里没有经过原生安卓的方法,因为经过分析,此app是使用MUI,用js编写的app,为webview,所有核心代码都在此目录!我们使用HbuilderX打开此目录,则app的工程文件自动显示,接下来,我们可以随意查看代码

分析代码业务逻辑

查看代码后,我们会得到如下信息:
1. app接口: http://api.51moot.cn/api/

  1. 静态资源网址: https://mootimg.oss-cn-beijing.aliyuncs.com/Moot/

  2. 核心sign获取接口:http://api.51moot.cn/api/v1/sign

所有请求都会验证sign的正确性,不过可笑的是这个sign是固定的!

分析播放业务逻辑

通过查阅代码,我们可以找到视频播放页面是course_vedio.html,核心代码course_vedio.js文件,以下是播放器初始化代码,可以看出只需要传入我们的用户ID就可以统计时长

通过百度查找polyvObject方法,我们可以得到这是保利威公司的播放器sdk,核心依赖sdk文档->点击查看
至此,我们只需要拼接所需信息即可完成模拟播放,以下是我封装过的接口,使用php语言编写,通过此接口我们可以得到任何想要的信息

更新日志:

2021-01-07:
(1.)支持学生账户提取试卷及一键答题
2020-10-28:
(1.)修复APP外部与内部进度不同步的问题
2020-09-02:
(1.)修复节点失效
2020-08-17:
(1.)增加一键秒刷
2020-06-03:
(1.)增加pc协议支持
(2.)增加pc cookie提取
(3.)增加pc协议的视频加密信息获取
(4.)网站同时支持falsh和h5内核,播放更加流畅
(5.)优化答题业务逻辑

<?php
/*
 * Title:美和易思信息获取插件
 * Author:流逝中沉沦
 * Date:2020/01/01 20:00:00
 */

namespace SinKingCloud;

class Mstanford
{
    private $ApiUrl = array('pc' => 'https://www.51moot.net/', 'mobile' => 'http://112.126.118.66/');
    private $sign; //签名
    private $UserInfo; //账户信息
    public $cookies = null; //pc cookie
    /**
     *构造参数
     */
    function __construct($ApiUrl = false, $sign = false)
    {
        if ($ApiUrl) {
            $this->ApiUrl = $ApiUrl;
        }
        if ($sign) {
            $this->sign = $sign;
        } else {
            $this->sign = $this->get_sign();
        }
    }
    /**
     * 获取sign
     * @return String 签名
     */
    private function get_sign()
    {
        $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/sign");
        $arr = json_decode($res, true);
        if (!array_key_exists('code', $arr)) {
            return false;
        }
        if ($arr['code'] == 0) {
            return $arr['data'];
        } else {
            return false;
        }
    }
    /**
     * 账户登陆(app协议)
     * @param String $user 账户
     * @param String $pwd 密码
     * @return Array 数据集
     */
    public function UserLogin($user, $pwd)
    {
        if (!empty($user) && !empty($pwd)) {
            if (empty($this->sign)) {
                $this->get_sign();
            }
            $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/web_user?login_name=" . $user . "&login_pass=" . $pwd . "&sign=" . $this->sign);
            $arr = json_decode($res, true);
            if (!array_key_exists('code', $arr)) {
                return false;
            }
            if ($arr['code'] == 0) {
                $this->UserInfo = $arr['data'];
                return $arr['data'];
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    /**
     * 账户登陆(pc协议)
     * @param String $user 账户
     * @param String $pwd 密码
     * @return Array 数据集
     */
    public function UserPcLogin($user, $pwd)
    {
        if (!empty($user) && !empty($pwd)) {
            if (empty($this->sign)) {
                $this->get_sign();
            }
            $res = $this->get_curl($this->ApiUrl['pc'] . "/main/login_validate", "login_name=" . $user . "&login_pass=" . $pwd . "&auto_login=true", 0, 0, 1);
            $arr = explode("\n", $res);
            $data = json_decode(end($arr), true);
            if ($data['code'] == 'success') {
                //取cookie
                preg_match_all('/Set-Cookie: (.*?);/', $res, $arr);
                $this->cookies = implode(";", $arr[1]);
                //二次登陆获取用户信息
                return $this->UserLogin($user, $pwd);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    /**
     * 账户信息查询(app协议)
     * @param Int $uid 账户ID
     * @return Array 数据集
     */
    public function UserQuery($uid)
    {
        if (!empty($uid)) {
            if (empty($this->sign)) {
                $this->get_sign();
            }
            $res = $this->get_curl($this->ApiUrl['mobile'] . '/api/v1/web_user?id=' . $uid . '&sign=' . $this->sign);
            $arr = json_decode($res, true);
            if (!array_key_exists('code', $arr)) {
                return false;
            }
            if ($arr['code'] == 0) {
                $this->UserInfo = $arr['data'];
                return $arr['data'];
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    /**
     * 课程信息查询(app协议)
     * @param Array $id 课程ID
     * @return Array 数据集
     */
    public function CourseQuery($id = array(), $uid = 6518)
    {
        if (empty($id) || !is_array($id) || empty($this->sign)) {
            return false;
        } else {
            $list = implode(',', $id);
            $data = array();
            for ($i = 1; $i <= 5; $i++) {
                $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/course_info?page_index=0&page_size=9999&id_list=" . $list . "&type=1&is_progress=true&user_id=" . $uid . "&assort_id=3&sign=" . $this->sign);
                $arr = json_decode($res, true);
                if (!array_key_exists('code', $arr)) {
                    continue;
                }
                if ($arr['code'] == 0) {
                    foreach ($arr['data']['rows'] as $key) {
                        $data[] = $key;
                    }
                } else {
                    continue;
                }
            }
            return $data;
        }
    }
    /**
     * 课程详情(app协议)
     * @param Int $id 课程ID
     * @return Array
     */
    public function CourseInfo($id)
    {
        if (empty($id)) {
            return false;
        }
        if (empty($this->sign)) {
            $this->get_sign();
        }
        $res = $this->get_curl($this->ApiUrl['mobile'] . "/api//v1/course_dirctory?course_id=" . $id . "&sign=" . $this->sign);
        $arr = json_decode($res, true);
        if (!array_key_exists('code', $arr)) {
            return false;
        }
        if ($arr['code'] == 0) {
            return $arr['data'];
        } else {
            return false;
        }
    }
    /**
     * 视频详情(app协议)
     * @param Array $id 课程ID
     * @return Array 数据集
     */
    public function DirctoryInfo($id)
    {
        if (empty($id)) {
            return false;
        } else {
            if (empty($this->sign)) {
                $this->get_sign();
            }
            $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/course_dirctory?id=" . $id . "&is_dirctory=true&sign=" . $this->sign);
            $arr = json_decode($res, true);
            if (!array_key_exists('code', $arr)) {
                return false;
            }
            if ($arr['code'] == 0) {
                return $arr['data'];
            } else {
                return false;
            }
        }
    }
    /**
     * 视频详情(pc协议)
     * @param Array $id 课程ID
     * @return Array 数据集
     */
    public function DirctoryPcInfo($id)
    {
        if (empty($id)) {
            return false;
        } else {
            if (empty($this->cookies)) {
                return false;
            }
            $res = $this->get_curl($this->ApiUrl['pc'] . "/server_hall_2/server_hall_2/video_play?dir_id=" . $id . "&do=_do", 0, 0, $this->cookies);
            //取视频加密信息
            preg_match_all('/polyvPlayer([\s\S]*?);/i', $res, $arr);
            if (isset($arr[0][0])) {
                $res = substr(substr($arr[0][0], 12), 0, -2);
                $arr = json_decode(str_replace(array("\n", "\t", "wrap", "false", "'"), array("", "", "'wrap'", "'false'", '"'), $res), true);
                return array(
                    'vid' => $arr['vid'],
                    'ts' => $arr['ts'],
                    'sign' => $arr['sign'],
                    'session_id' => $arr['session_id'],
                    'playsafe' => $arr['playsafe']
                );
            } else {
                return false;
            }
        }
    }
    /**
     * 试卷评测(app协议)
     * @param Int $id 试卷ID
     * @param Int $uid 用户ID
     * @param Int $num 错误的个数
     * @return Array 数据集
     */
    public function CourseTest($id, $uid, $num = 0)
    {
        if (empty($id) || empty($uid)) {
            return false;
        }
        if (empty($this->sign)) {
            $this->get_sign();
        }
        $arr = $this->GetTestInfo($id);
        if ($arr) {
            $data1 = "api_action=evaluating_check&example_id=" . $id . "&user_id=" . $uid . "&sign=" . $this->sign;
            $ids = array();
            $ids2 = array();
            $errors = array();
            for ($i = 0; $i < $num; $i++) {
                $errors[] = rand(0, count($arr));
            }
            $i = 0;
            foreach ($arr as $value) {
                $ids[] = $value['id'];
                if (in_array($i, $errors)) {
                    $value['answer_list'] = rand(0, 3);
                }
                $ids2[] = '&answer_list' . $value['id'] . '=' . $value['answer_list'];
                $i++;
            }
            $data2 = "&subject_id_list=" . implode("[{@}]", $ids);
            $data3 = implode("", $ids2);
            $data = $data1 . $data2 . $data3;
            $res2 = $this->put_curl($this->ApiUrl['mobile'] . "/api/v1/example_subject", $data);
            $arr2 = json_decode($res2, true);
            if ($arr2['code'] == 0) {
                return $arr2['data'];
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    /**
     * 试卷评测结果(app协议)
     * @param Int $id 试卷ID
     * @param Int $uid 用户ID
     * @return Array 数据集
     */
    public function GetTestResault($id, $uid)
    {
        if (empty($id) || empty($uid)) {
            return false;
        }
        if (empty($this->sign)) {
            $this->get_sign();
        }
        $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/example_result?example_id=" . $id . "&user_id=" . $uid . "&is_ext=true&sign=" . $this->sign);
        $arr = json_decode($res, true);
        if (!array_key_exists('code', $arr)) {
            return false;
        }
        return $arr['data'];
    }
    /**
     * 试卷详情(app协议)
     * @param Int $id 试卷ID
     * @return Array 数据集
     */
    public function GetTestInfo($id)
    {
        if (empty($this->sign)) {
            $this->get_sign();
        }
        $res = $this->get_curl($this->ApiUrl['mobile'] . "/api/v1/example_subject?example_id=" . $id . "&is_random=false&sign=" . $this->sign);
        $arr = json_decode($res, true);
        if (!array_key_exists('code', $arr)) {
            return false;
        }
        if ($arr['code'] == 0) {
            return $arr['data'];
        }
        return false;
    }
    /**
     * 用户试卷列表(pc协议)
     * @param Boolean 是否为老师
     * @return Array 数据集
     */
    public function GetTestList($admin = false)
    {
        if (empty($this->cookies)) {
            return false;
        }
        $type = $admin ? "tea" : "stu";
        $res = $this->get_curl($this->ApiUrl['pc'] . "/server_hall_2/" . $type . "/examine", 0, 0, $this->cookies);
        preg_match_all('/JSON.parse[\s\S]*?}/i', $res, $arr);
        if ($arr[0]) {
            $new = array();
            foreach ($arr[0] as $key) {
                $txt = htmlspecialchars_decode(str_replace("JSON.parse('", "", $key));
                $arr2 = json_decode($txt, true);
                if (empty($arr2['id']) || empty($arr2['title'])) continue;
                $new[] = array(
                    'id' => $arr2['id'],
                    'title' => $arr2['title']
                );
            }
            $tmp_arr = array();
            foreach ($new as $k => $v) {
                if (in_array($v['id'], $tmp_arr)) {
                    unset($new[$k]);
                } else {
                    $tmp_arr[$k] = $v['id'];
                }
            }
            return $new;
        } else {
            return false;
        }
    }

    /**
     * 观看视频
     * @param Int $user_id 用户id
     * @param String $video_id 视频id值
     * @param Int $times 观看秒数
     * @param Int $id 视频id
     * @return Boolean 执行结果
     */
    public function LookVideo($user_id, $video_id, $times, $id)
    {
        $pid = time() . rand(100, 999) . 'X' . rand(100000, 999999);
        $vid = $video_id;
        $uid = substr($vid, 0, 10);
        $flow = 0;
        $ts = time() . "886";
        $href = 'https://www.51moot.net/server_hall_2/server_hall_2/video_play?dir_id=' . $id . '&do=_do';
        $duration = $times;
        $cts = $times;
        $pd = $times;
        $sd = 10;
        $param2 = base64_encode($user_id);
        $pn = 'HTML5';
        $pv = 'v1.15.1';
        $cataid = "1480326650851";
        $sign = md5("rtas.net" . $pid . $vid . '0' . $pd . $cts);
        $url = 'https://prtas.videocc.net/v2/view?pid=' . $pid . '&vid=' . $vid . '&uid=' . $uid . '&flow=' . $flow . '&ts=' . $ts . '&href=' . base64_encode($href) . '&duration=' . $duration . '&cts=' . $cts . '&sign=' . $sign . '&sd=' . $sd . '&pd=' . $pd . '&pn=' . $pn . '&pv=' . $pv . '&param2=' . $param2 . '&cataid=' . $cataid . '&ute=bop';
        return $this->get_curl($url) == "1";
    }

    /**
     * Curl get post请求
     * @param String $url 网址
     * @param String $post POST参数
     * @param String $referer refer地址
     * @param String $cookie 携带COOKIE
     * @param String $header 请求头
     * @param String $ua User-agent
     * @param String $nobaody 重定向
     * @return String 数据
     */
    private function get_curl($url, $post = 0, $referer = 0, $cookie = 0, $header = 0, $ua = 0, $nobaody = 0)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $clwl[] = "Accept:*/*";
        $clwl[] = "Accept-Encoding:gzip,deflate,sdch";
        $clwl[] = "Accept-Language:zh-CN,zh;q=0.8";
        curl_setopt($ch, CURLOPT_HTTPHEADER, $clwl);
        if ($post) {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        }
        if ($header) {
            curl_setopt($ch, CURLOPT_HEADER, TRUE);
        }
        if ($cookie) {
            curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        }
        if ($referer) {
            if ($referer == 1) {
                curl_setopt($ch, CURLOPT_REFERER, $this->ApiUrl .  $url);
            } else {
                curl_setopt($ch, CURLOPT_REFERER, $referer);
            }
        }
        if ($ua) {
            curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        } else {
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-mx; HTC_One_X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0');
        }
        if ($nobaody) {
            curl_setopt($ch, CURLOPT_NOBODY, 1);
            //主要头部
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //跟随重定向
        }
        curl_setopt($ch, CURLOPT_ENCODING, "gzip");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $ret = curl_exec($ch);
        curl_close($ch);
        return $ret;
    }
    /**
     * Curl PUT请求
     * @param String $url 网址
     * @param String $data 参数
     * @param Array $header 请求头
     * @return String 数据
     */
    private function put_curl($url, $data = "", $header = array())
    {
        $ch = curl_init();
        $header[] = "Content-type:application/x-www-form-urlencoded";
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $res = curl_exec($ch);
        curl_close($ch);
        return $res;
    }
}

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
  126. 126
  127. 127
  128. 128
  129. 129
  130. 130
  131. 131
  132. 132
  133. 133
  134. 134
  135. 135
  136. 136
  137. 137
  138. 138
  139. 139
  140. 140
  141. 141
  142. 142
  143. 143
  144. 144
  145. 145
  146. 146
  147. 147
  148. 148
  149. 149
  150. 150
  151. 151
  152. 152
  153. 153
  154. 154
  155. 155
  156. 156
  157. 157
  158. 158
  159. 159
  160. 160
  161. 161
  162. 162
  163. 163
  164. 164
  165. 165
  166. 166
  167. 167
  168. 168
  169. 169
  170. 170
  171. 171
  172. 172
  173. 173
  174. 174
  175. 175
  176. 176
  177. 177
  178. 178
  179. 179
  180. 180
  181. 181
  182. 182
  183. 183
  184. 184
  185. 185
  186. 186
  187. 187
  188. 188
  189. 189
  190. 190
  191. 191
  192. 192
  193. 193
  194. 194
  195. 195
  196. 196
  197. 197
  198. 198
  199. 199
  200. 200
  201. 201
  202. 202
  203. 203
  204. 204
  205. 205
  206. 206
  207. 207
  208. 208
  209. 209
  210. 210
  211. 211
  212. 212
  213. 213
  214. 214
  215. 215
  216. 216
  217. 217
  218. 218
  219. 219
  220. 220
  221. 221
  222. 222
  223. 223
  224. 224
  225. 225
  226. 226
  227. 227
  228. 228
  229. 229
  230. 230
  231. 231
  232. 232
  233. 233
  234. 234
  235. 235
  236. 236
  237. 237
  238. 238
  239. 239
  240. 240
  241. 241
  242. 242
  243. 243
  244. 244
  245. 245
  246. 246
  247. 247
  248. 248
  249. 249
  250. 250
  251. 251
  252. 252
  253. 253
  254. 254
  255. 255
  256. 256
  257. 257
  258. 258
  259. 259
  260. 260
  261. 261
  262. 262
  263. 263
  264. 264
  265. 265
  266. 266
  267. 267
  268. 268
  269. 269
  270. 270
  271. 271
  272. 272
  273. 273
  274. 274
  275. 275
  276. 276
  277. 277
  278. 278
  279. 279
  280. 280
  281. 281
  282. 282
  283. 283
  284. 284
  285. 285
  286. 286
  287. 287
  288. 288
  289. 289
  290. 290
  291. 291
  292. 292
  293. 293
  294. 294
  295. 295
  296. 296
  297. 297
  298. 298
  299. 299
  300. 300
  301. 301
  302. 302
  303. 303
  304. 304
  305. 305
  306. 306
  307. 307
  308. 308
  309. 309
  310. 310
  311. 311
  312. 312
  313. 313
  314. 314
  315. 315
  316. 316
  317. 317
  318. 318
  319. 319
  320. 320
  321. 321
  322. 322
  323. 323
  324. 324
  325. 325
  326. 326
  327. 327
  328. 328
  329. 329
  330. 330
  331. 331
  332. 332
  333. 333
  334. 334
  335. 335
  336. 336
  337. 337
  338. 338
  339. 339
  340. 340
  341. 341
  342. 342
  343. 343
  344. 344
  345. 345
  346. 346
  347. 347
  348. 348
  349. 349
  350. 350
  351. 351
  352. 352
  353. 353
  354. 354
  355. 355
  356. 356
  357. 357
  358. 358
  359. 359
  360. 360
  361. 361
  362. 362
  363. 363
  364. 364
  365. 365
  366. 366
  367. 367
  368. 368
  369. 369
  370. 370
  371. 371
  372. 372
  373. 373
  374. 374
  375. 375
  376. 376
  377. 377
  378. 378
  379. 379
  380. 380
  381. 381
  382. 382
  383. 383
  384. 384
  385. 385
  386. 386
  387. 387
  388. 388
  389. 389
  390. 390
  391. 391
  392. 392
  393. 393
  394. 394
  395. 395
  396. 396
  397. 397
  398. 398
  399. 399
  400. 400
  401. 401
  402. 402
  403. 403
  404. 404
  405. 405
  406. 406
  407. 407
  408. 408
  409. 409
  410. 410
  411. 411
  412. 412
  413. 413
  414. 414
  415. 415
  416. 416
  417. 417
  418. 418
  419. 419
  420. 420
  421. 421
  422. 422
  423. 423
  424. 424
  425. 425
  426. 426
  427. 427
  428. 428
  429. 429
  430. 430
  431. 431
  432. 432
  433. 433
  434. 434
  435. 435
  436. 436
  437. 437
  438. 438
  439. 439
  440. 440
  441. 441
  442. 442
  443. 443
  444. 444
  445. 445
  446. 446
  447. 447
  448. 448
  449. 449
  450. 450
  451. 451
  452. 452
  453. 453
  454. 454
  455. 455
  456. 456
  457. 457
  458. 458
  459. 459
  460. 460
  461. 461
  462. 462
  463. 463
  464. 464
  465. 465
  466. 466
  467. 467
  468. 468
  469. 469

总体功能实现

封装完接口,我们可以得到想要功能,我们可以实现多视频同时播放来实现刷课,以下是实现效果,另外送上一个已经写好的网站->点击访问
这样就可以刷课了(功能太过变态,低调使用!!!)~~~

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

63 打赏
评论 (5,322)

回复给 点击这里取消回复。

欢迎您 游客  

  • Последние новинки музыки 2024 скачать и слушать онлайн

    1年前
    回复
  • На данном сайте вы можете скачать и слушать новинки музыки 2024 года бесплатно в хорошем качестве.

    1年前
    回复
  • Скачать музыку 2024 года бесплатно в mp3

    1年前
    回复
  • На данном сайте вы можете скачать в mp3 качестве и слушать онлайн популярные песни 2024 года, сайт обновляется новыми хитами каждый день.

    1年前
    回复
  • Музыка 2024 года слушать онлайн и скачать бесплатно mp3

    1年前
    回复
  • На данном сайте вы можете скачать новинки музыки бесплатно в mp3, самые свежие новинки 2024.

    1年前
    回复
  • На нашем сайте вы можете скачать и слушать онлайн последние новинки музыки 2024 бесплатно.

    1年前
    回复
  • На данном сайте вы можете скачать и слушать новинки музыки 2024 года бесплатно в хорошем качестве.

    1年前
    回复
  • Скачать музыку бесплатно в mp3

    1年前
    回复
  • Зарубежное Диско 80-Х – Laura Branigan – Self Control скачать песню бесплатно в mp3 и слушать онлайн
    Зарубежное Диско 80-Х – Laura Branigan – Self Control

    1年前
    回复
  • Музыка В Машину 2024 – David Guetta, Kim Petras – When We Were Young (The Logical Song) (Alex Caspian Remix) скачать песню бесплатно на телефон и слушать онлайн в mp3
    Музыка В Машину 2024 – David Guetta, Kim Petras – When We Were Young (The Logical Song) (Alex Caspian Remix)

    1年前
    回复
  • Cygo – Панда скачать песню в mp3 и слушать онлайн бесплатно
    Cygo – Панда

    1年前
    回复
  • Скачать песню Shakira – Waka Waka (This Time For Africa) бесплатно в mp3, текст песни, смотреть клип
    Shakira – Waka Waka (This Time For Africa)

    1年前
    回复
  • Miyagi (Мияги) & Эндшпиль – В Последний Раз скачать в mp3 и слушать онлайн бесплатно
    Miyagi (Мияги) & Эндшпиль – В Последний Раз

    1年前
    回复
  • Revolution 9 – Awakening скачать бесплатно песню и слушать онлайн в mp3
    Revolution 9 – Awakening

    1年前
    回复
  • Ірина Федишин – Ти Тільки Мій (2017) – Ірина Федишин – Білі Троянди скачать бесплатно песню в mp3
    Ірина Федишин – Ти Тільки Мій (2017) – Ірина Федишин – Білі Троянди

    1年前
    回复
  • Botashe – Пнх скачать песню бесплатно в mp3 и слушать онлайн
    Botashe – Пнх

    1年前
    回复
  • Украинские Хиты – Степан Гіга – Цей Сон скачать песню бесплатно на телефон и слушать онлайн в mp3
    Украинские Хиты – Степан Гіга – Цей Сон

    1年前
    回复
  • Аигел – Офигенно скачать песню в mp3 и слушать онлайн бесплатно
    Аигел – Офигенно

    1年前
    回复
  • Скачать песню Сергий Делечук – Граль (Парцифаль) бесплатно в mp3
    Сергий Делечук – Граль (Парцифаль)

    1年前
    回复
  • Dj Crazy J Rodriguez – Like A Rockstar скачать в mp3 и слушать онлайн бесплатно
    Dj Crazy J Rodriguez – Like A Rockstar

    1年前
    回复
  • Cartoon & Kstja – Whatever I Do (Feint Remix) скачать бесплатно песню и слушать онлайн в mp3
    Cartoon & Kstja – Whatever I Do (Feint Remix)

    1年前
    回复
  • Krbk – Художник скачать бесплатно песню в mp3
    Krbk – Художник

    1年前
    回复
  • R3Hab & Hrvy – Be Okay скачать песню бесплатно в mp3 и слушать онлайн
    R3Hab & Hrvy – Be Okay

    1年前
    回复
  • Музыка В Машину 2023 – Duboss – Voyage, Voyage (Imanbek Edit) скачать песню бесплатно на телефон и слушать онлайн в mp3
    Музыка В Машину 2023 – Duboss – Voyage, Voyage (Imanbek Edit)

    1年前
    回复
  • Lil Peep – 16 Lines скачать песню в mp3 и слушать онлайн бесплатно
    Lil Peep – 16 Lines

    1年前
    回复
  • Скачать песню Юрий Лямкин – Весенний Сон бесплатно в mp3
    Юрий Лямкин – Весенний Сон

    1年前
    回复
  • Андрей Картавцев Версиа – Андрей Картавцев – Обманщица скачать в mp3 и слушать онлайн бесплатно
    Андрей Картавцев Версиа – Андрей Картавцев – Обманщица

    1年前
    回复
  • Артур Пирожков – Как Челентано скачать бесплатно песню и слушать онлайн в mp3
    Артур Пирожков – Как Челентано

    1年前
    回复
  • Арсен Бабурка Вінні-Пух З Днем Народження Happy Birthday ) – Вінні-Пух З Днем Народження Happy Birthday ) скачать бесплатно песню в mp3
    Арсен Бабурка Вінні-Пух З Днем Народження Happy Birthday ) – Вінні-Пух З Днем Народження Happy Birthday )

    1年前
    回复
1 … 3 4 5 6 7 … 177
流逝中沉沦
12文章 50913评论 1470点赞 4049994浏览

随机文章
QQ全套扫码加速
5年前
今日校园app协议分析(自动提交问卷,自动打卡等等)
5年前
YY模拟操作
5年前
c#音乐解析组件(dll)
5年前
美和易思app协议分析及功能实现(美和易思刷课)
5年前
最新评论
+376
网站留言
Copyright © 2025 网站备案号: 皖ICP备18022767号-3
沉沦云网络. SinKingCloud
主页
页面
  • 个人技术栈
  • 留言
博主
流逝中沉沦
流逝中沉沦 管理员
一个热爱生活热爱技术的00后少年
12 文章 50913 评论 4049994 浏览
测试
测试

主题风格 设置选项


布局
背景颜色
背景渐变
背景图片
微信 QQ空间 QQ好友 新浪微博

“扫一扫”分享到微信

赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付