日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

基于浙江线上大学视频秒过分析

發(fā)布時(shí)間:2024/1/3 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 基于浙江线上大学视频秒过分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)代苦逼大學(xué)生,人在家中坐,課從天上來(lái).沒(méi)辦法,想偷懶,于是就對(duì)目前在上的網(wǎng)課平臺(tái)進(jìn)行了分析

嘿嘿 先來(lái)張效果圖:

好勒,廢話(huà)不多說(shuō),上主題

其實(shí)我們?cè)诳淳W(wǎng)課的時(shí)候,本地的網(wǎng)頁(yè)會(huì)通過(guò)ajax請(qǐng)求定時(shí)的發(fā)送當(dāng)前所觀(guān)看的視頻秒數(shù)到服務(wù)器上,并記載,所以通過(guò)拉取本地的進(jìn)度條是達(dá)不到秒過(guò)的效果的

額,因?yàn)橐呀?jīng)刷好了,不知道為什么就沒(méi)發(fā)送了,不過(guò)這張圖也能表達(dá)意思,通過(guò)上面的參數(shù)可以發(fā)現(xiàn),有courseId,chapterId,一個(gè)固定的server,正確的發(fā)送參數(shù)還應(yīng)該有playtime,percent,最后一個(gè)是變化的time,
time后面的值看起來(lái)像一個(gè)時(shí)間

好了,既然知道發(fā)送ajax請(qǐng)求需要的是這些參數(shù),那我們就來(lái)找找這些參數(shù)從哪里獲得的,service好說(shuō),固定的參數(shù),我們不用管它,courseId和chapterId顧名思義,
像這種有代表性的參數(shù),不是在查看該課程的首頁(yè)出現(xiàn),就是在觀(guān)看具體某一章節(jié)出現(xiàn),playtime是當(dāng)前播放了多少時(shí)間,percent是根據(jù)當(dāng)前播放的時(shí)間除以總時(shí)長(zhǎng)的百分比,播放的單位是s,最后一個(gè)加密的time就顯得尤為重要了,我們要找到這個(gè)time是怎么實(shí)現(xiàn)的,很明顯
是通過(guò)js來(lái)生成的

因?yàn)樘峤坏挠蛎莌ttps://www.zjooc.cn/ajax 后面加的就是上面說(shuō)的4個(gè)參數(shù),且是get的請(qǐng)求
通過(guò)對(duì)url的全局搜索

找到了對(duì)應(yīng)time參數(shù)的js文件,可以看出time的關(guān)鍵點(diǎn)是一個(gè)叫做createAjaxTimestamp的函數(shù)調(diào)用,通過(guò)搜索,成功找到對(duì)應(yīng)的加密函數(shù)

作者的js水平有限,就用python的來(lái)模擬js環(huán)境來(lái)執(zhí)行對(duì)應(yīng)的函數(shù)
通過(guò)這里,已經(jīng)能實(shí)現(xiàn)單個(gè)視頻

那么如何實(shí)現(xiàn)批量化秒過(guò)呢,既然一個(gè)章節(jié)的視頻對(duì)應(yīng)一個(gè)chapterId,那肯定可以通過(guò)對(duì)應(yīng)的方法拿到所有的chapterId

通過(guò)在課程的首頁(yè)進(jìn)行刷新,捕獲到一個(gè)ajax的數(shù)據(jù)包,對(duì)應(yīng)的請(qǐng)求和響應(yīng)數(shù)據(jù)如下

請(qǐng)求數(shù)據(jù)

響應(yīng)數(shù)據(jù)

請(qǐng)求的參數(shù)也比較單一,courseId是根據(jù)不同的課程變化的,還有一個(gè)time的參數(shù)就是上文中寫(xiě)到過(guò)的

這里的響應(yīng)體就非常有價(jià)值了,里面對(duì)應(yīng)了每個(gè)視頻的chapterId,名字,還有最重要的duration,在上面的介紹中肯定有小伙伴有疑問(wèn),我可以任意編造playtime,但是時(shí)長(zhǎng)我不知道呀,怎么編寫(xiě)對(duì)應(yīng)的percent

嘿嘿,這時(shí)duration數(shù)據(jù)就非常重要啦,后文中我們可以通過(guò)duration來(lái)填寫(xiě)playtime達(dá)到秒過(guò)的效果

因?yàn)槔锩娴臄?shù)據(jù)太多了,這里我就通過(guò)畫(huà)圖來(lái)描述一級(jí)菜單,二級(jí)菜單,三級(jí)菜單的結(jié)構(gòu)圖

先給一張實(shí)物圖

額,手畫(huà)的草圖

響應(yīng)體的數(shù)據(jù)大致就是這樣的菜單結(jié)構(gòu),再通過(guò)實(shí)現(xiàn)對(duì)應(yīng)的邏輯,就可以拿到每一個(gè)視頻的chapterId和duration

這里就獻(xiàn)上本人low逼的代碼吧

# -*- coding: utf-8 -*-
# @Author : __will__

import time

import requests
import execjs


class Zjooc(object):

    node = execjs.get()
    url = 'https://www.zjooc.cn/ajax'
    get_video_playing_server = '/learningmonitor/api/learning/monitor/videoPlaying'
    get_pdf_finished_server = '/learningmonitor/api/learning/monitor/finishTextChapter'
    get_student_course_server = '/jxxt/api/course/courseStudent/getStudentCourseChapters'

    def __init__(self, course_id,cookie):
        self.headers = {
            'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
            'Cookie': cookie
        }
        self.course_id = course_id


    def get_student_course_info(self):
        ctx = self.node.compile(open('zjooc.js').read())
        ajax_time = ctx.eval('createTimesatamp(32)')
        ts = ajax_time + str(int(time.time()) * 1000)
        student_params = {
            'time': ts,
            'service': self.get_student_course_server,
            'params[pageNo]': '1',
            'params[courseId]': self.course_id,
            'params[urlNeed]': '0'
        }
        course_info = requests.get(self.url,params=student_params,headers=self.headers).json()
        return course_info

    def parse_course_info(self):
        data = self.get_student_course_info()
        single_course_list = []
        course_list = data['data']
        # 獲取每個(gè)章節(jié)
        for item in course_list:
            # 獲取每個(gè)小章節(jié)的事件節(jié)點(diǎn)
            chapter_node = item['children']
            for i in chapter_node:
                children_node = i['children']
                for child in children_node:
                    course_dict = {}
                    course_dict['id'] = child['id']
                    course_dict['name'] = child['name']
                    course_dict['resourceType'] = child['resourceType']
                    if child['resourceType'] == 1:
                        course_dict['vedioTimeLength'] = child['vedioTimeLength']
                    single_course_list.append(course_dict)


        return single_course_list

    def run(self):
        context = self.node.compile(open('zjooc.js').read())
        single_course_list = self.parse_course_info()
        for item in single_course_list:
            ajax_time = context.eval('createTimesatamp(32)')
            ts = ajax_time + str(int(time.time())+ 600) + '000'
            if item['resourceType'] == 1:
                video_params = {
                'time': ts,
                'service': self.get_video_playing_server,
                'params[chapterId]': item['id'],
                'params[courseId]': self.course_id,
                'params[playTime]': item['vedioTimeLength'],
                'params[percent]': '100'
                }
                result = requests.get(self.url,params=video_params,headers=self.headers).json()
                if result['resultCode'] == 0:
                    print(item['name']+'的視頻''------秒過(guò)成功')
                else:
                    print(item['name']+'的視頻''------秒過(guò)失敗')
            else:
                pdf_params = {
                    'time': ts,
                    'service': self.get_pdf_finished_server,
                    'params[chapterId]': item['id'],
                    'params[courseId]': self.course_id,
                }
                result = requests.get(self.url, params=pdf_params, headers=self.headers).json()
                if result['resultCode'] == 0:
                    print(item['name'] +'的pdf' '------秒過(guò)成功')
                else:
                    print(item['name'] +'的pdf' '------秒過(guò)失敗')

大功告成,最后,上述內(nèi)容只供學(xué)習(xí)使用,

總結(jié)

以上是生活随笔為你收集整理的基于浙江线上大学视频秒过分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。