引言

因朋友的邀请,让我看看有没有办法快速刷完学校要求的课程,因为这个网站,在看视频的时候,还会时不时的弹出验证码,很是麻烦。
今天,利用周末时间,就帮忙研究一下一下吧。
目录网站:http://yj.youjiao.net/coursestudy_kindergarten.aspx?courseid=304

分析网站

用Google浏览器打开目标网站,按F12,打开开发者工具,选择network标签,并选择xhr,发现在观看每个视频时,会时不时的发出下面这样的ajax请求

点击一个ajax请求,查看详情

发现,这个请求通过post方式向后台提交,参数有5个,分别是:

  • video_id:正在播放的视频的id
  • course_id:课程的id,每个课程下有多个视频
  • mem_video_time:当前播放视频的进度,这个参数很重要,是这个请求的意义所在,通过这个参数定时的向后台发送观看视频的进度,控制这个视频的播放进度,如果这个参数大于这个视频的长度,那么,就表示这个视频已经观看完毕了。
  • user_name: 用户账号
  • password: 用户密码,不得不吐槽一下,这个网站竟然用明文存储密码,唉!!
    算了,管他密码明文还是密文,破解了再说。

在得知了这个mem_video_time是关键参数后,就要想办法知道每个视频的时长,然后,根据这个视频的时长,手动构造这个mem_video_time,只要这个mem_video_time比这个视频的时长要长就行。

通过观察,在http://yj.youjiao.net/coursestudy_kindergarten.aspx?courseid=304这个网址下,有一个请求得到的响应是所有课程的信息,包括,视频名称,时长,id,是否观看完成等等。

这里截取了一个视频的信息以便于分析

         "id": 1478,
↵        "video_name": "角色游戏的推进",
↵        "video_image": "",
↵        "video_address": "http://vcdn.youjiao.net/cf503ea0cbd349e582396c2a24a30c41/e6beaf13c329448eb925c19beb162e38-9b70a64fcd070462b6307624178db929.mp4",
↵        "price": 0.0,
↵        "need_to_buy": 0,
↵        "can_look": 1,
↵        "length": 0.0,
↵        "learn_status": 2,
↵        "rest_length": "",
↵        "length_str": "00:17:25",
↵        "duration": "00:17:25"
↵

通过对比已观看和未观看的视频的信息,可以得知,参数learn_status是是否观看完成的标志,具体含义如下:

  • 0:未观看
  • 1:已观看,但未完成
  • 2:已观看完成

因此,我们要将所有learn_status不为2的视频筛选出来
durationlength_str始终保持一致,为视频的时长,我们要通过这个参数来构造上面的mem_video_time参数,这里我选择的是duration参数来构造的

分析到这里,要想破解这个视频网站,思路已经很清晰了,需要我们首先获取所有视频的结果,从中筛选出learn_status不为2的视频,并保存到一个字典或数组中,其中,每个视频我们只要其id及视频时长。然后根据视频时长参数duration构造观看每个视频时的时间mem_video_time,并发送给后台,让后台认为我们已经将这个视频看完了。

具体代码

# coding=utf-8
import requests
import time
import json

username = '你的账号'
pwd = '你的密码'
count = 0

def update_course_study(course):
    url = 'http://yj.youjiao.net/SER/UpdateCourseStudy'
    d = course['duration'].split(':')
    mem_video_time = int(d[0]) * 60 * 60 + int(d[1]) * 60 + int(d[2]) + 0.1
    data = {
        'video_id': course['id'],
        'course_id': '304',
        'mem_video_time': str(mem_video_time),
        'user_name': username,
        'password': pwd
    }
    res = requests.post(url, data=data)
    print(res.text)


def get_want_watch():
    url = 'http://yj.youjiao.net/SER/getCourse_catalogList'
    data = {
        'course_id': '304',
        'user_name': username,
        'password': pwd
    }
    res = requests.get(url, data=data)
    s = json.loads(res.text)
    dic = json.loads(s['info'])
    will_watch = []
    for d in dic:
        for t in d['videos']:
            if t['learn_status'] != 2:
                will_watch.append({
                    'id': t['id'],
                    'duration': t['duration']
                })
    return will_watch

# 程序的入口
if __name__ == '__main__':
    # 获取要刷的课程列表
    courses = get_want_watch()
    for c in courses:
        # 循环遍历课程列表
        update_course_study(c)
        # 延时200ms
        time.sleep(0.2)
        # 计数,共观看了几个视频
        count = count + 1
    print('观看完毕,共观看{}条视频'.format(count))
Last modification:August 15th, 2020 at 02:12 pm
哎呀呀,大家随意,随意就好!